赞
踩
"csrt": cv2.TrackerCSRT_create, "kcf": cv2.TrackerKCF_create, "boosting": cv2.TrackerBoosting_create, "mil": cv2.TrackerMIL_create, "tld": cv2.TrackerTLD_create, "medianflow": cv2.TrackerMedianFlow_create, "mosse": cv2.TrackerMOSSE_create主要用到 kcf(卡尔曼滤波),效率和准确率都不错
- # 实例化OpenCV's multi-object tracker
- trackers = cv2.legacy.MultiTracker_create() #实例化一个追踪器
-
- # 视频流
- while True:
- # 取当前帧
- ret , frame = vs.cv2.VideoCapture(args["video"]) #选择参数列表传入的追踪器
- # 到头了就结束
- if ret is False:
- print("没有视频")
- break
-
- # resize每一帧
- (h, w) = frame.shape[:2]
- width=600
- r = width / float(w)
- dim = (width, int(h * r))
- frame = cv2.resize(frame,
-
- # 追踪结果
- (success, boxes) = tracker
-
- # 绘制区域
- for box in boxes:
- (x, y, w, h) = [int(v)
- cv2.rectangle(frame, (
-
- # 显示
- cv2.imshow("Frame", frame)
- key = cv2.waitKey(100) & 0
-
- if key == ord("s"):
- # 选择一个区域,按s
- box = cv2.selectROI("F
- showCrosshair=True
-
- # 创建一个新的追踪器
- tracker = OPENCV_OBJEC
- trackers.add(tracker,
-
- # 退出
- elif key == 27:
- break
- vs.release()
- cv2.destroyAllWindows()
它是一个高性能的计算框架。它是一个C++编写的工具包,所以在应用层面的推理速度是非常快的。而且配备了python客户端,很方便开发者在各大平台使用,大大提高了框架的灵活性。
广泛应用于工业界和学术界。包含了大多数常用的机器学习算法,许多图像处理算法和深度学习算法,被工业界和学术界广泛应用于机器人,嵌入式设备,移动电话和大型高性能计算环境领域。常见的深度学习,基于SVM的分类和递归算法,针对大规模分类和递归的降维方法,相关向量机,聚类,多层感知机等都有相关API,且配置详细文档。最重要的一点是开源,开源,开源!这就意味着,我们可以在任何APP上免费试用。
- '''训练的时候怎么进行数据预处理,测试的时也需要进行相同的预处理'''
- if len(tracker) == 0:
- #获取blob数据
- (h,w) = frame.shape[:2]
- #归一化,减均值操作
- blob = cv2.dnn.blobFromImage(frame,0.007843,(w,h),127.5)
-
- #得到检测结果
- net.setInput(blob)
- detections = net.forward()
-
- #遍历得到的检测结果
- for i in np.arange(1,detections.shape[2]):
- #会有多个结果,只保留概率最高的
- confidence = detections[0,0,i,2]
-
- #过滤
- if confidence > args["confidence"]:
- #将类标签的索引从检测列表中抽取出来
- idx = int(detections[0,0,i,1])
- label = CLASSES[idx]
-
- #只保留人的
- if CLASSES[idx] != 'person':
- continue
-
- #得到bbox
- #print detections[0,0,i,3:7]
- box = detections[0,0,i,3:7] * np.array([w,h,w,h])
- (startX,startY,endX,endY) = box.astype('int')
-
-
- #使用dlib来进行目标追踪
- t = dlib.correlation_tracker()
- rect = dlib.rectangle(int(startX),int(startY),int(endX),int(endY))
- t.start_track(rgb,rect)
-
- #保存结果
- labels.append(label)
- trackers.append(t)
-
-
-
-
- def start_tracker(box, label, rgb, inputQueue, outputQueue):
- '''后两个参数传入的是队列'''
- t = dlib.correlation_tracker() #创建追踪器
- rect = dlib.rectangle(int(box[0]), int(box[1]), int(box[2]), int(box[3]))
- t.start_track(rgb, rect) #用dlib追踪器的属性去画图
-
- while True:
- # 获取下一帧
- rgb = inputQueue.get()
-
- # 非空就开始处理
- if rgb is not None:
- # 更新追踪器
- t.update(rgb)
- pos = t.get_position()
-
- startX = int(pos.left())
- startY = int(pos.top())
- endX = int(pos.right())
- endY = int(pos.bottom())
-
- # 把结果放到输出q
- outputQueue.put((label, (startX, startY, endX, endY)))
多进程处理:主要用到 `import multiprocessing` 工具包
- from utils import FPS
- import multiprocessing
- import numpy as np
- import argparse
- import dlib
- import cv2
- #perfmon
-
-
- ap = argparse.ArgumentParser()
- ap.add_argument("-p", "--prototxt", required=True,
- help="path to Caffe 'deploy' prototxt file")
- ap.add_argument("-m", "--model", required=True,
- help="path to Caffe pre-trained model")
- ap.add_argument("-v", "--video", required=True,
- help="path to input video file")
- ap.add_argument("-o", "--output", type=str,
- help="path to optional output video file")
- ap.add_argument("-c", "--confidence", type=float, default=0.2,
- help="minimum probability to filter weak detections")
- args = vars(ap.parse_args())
-
- # 一会要放多个追踪器
- inputQueues = []
- outputQueues = []
-
- CLASSES = ["background", "aeroplane", "bicycle", "bird", "boat",
- "bottle", "bus", "car", "cat", "chair", "cow", "diningtable",
- "dog", "horse", "motorbike", "person", "pottedplant", "sheep",
- "sofa", "train", "tvmonitor"]
-
- print("[INFO] loading model...")
- net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])
-
- print("[INFO] starting video stream...")
- vs = cv2.VideoCapture(args["video"])
- writer = None
-
- fps = FPS().start()
-
- if __name__ == '__main__':
-
- while True:
- (grabbed, frame) = vs.read()
-
- if frame is None:
- break
-
- (h, w) = frame.shape[:2]
- width=600
- r = width / float(w)
- dim = (width, int(h * r))
- frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)
- rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
-
- if args["output"] is not None and writer is None:
- fourcc = cv2.VideoWriter_fourcc(*"MJPG")
- writer = cv2.VideoWriter(args["output"], fourcc, 30,
- (frame.shape[1], frame.shape[0]), True)
-
- #首先检测位置
- if len(inputQueues) == 0:
- (h, w) = frame.shape[:2]
- blob = cv2.dnn.blobFromImage(frame, 0.007843, (w, h), 127.5) #推理阶段的图片预处理
- net.setInput(blob) #将处理后的图片放入net,再次将网络前向传播
- detections = net.forward()
-
- for i in np.arange(0, detections.shape[2]):
- confidence = detections[0, 0, i, 2]
- if confidence > args["confidence"]:
- idx = int(detections[0, 0, i, 1])
- label = CLASSES[idx]
- if CLASSES[idx] != "person":
- continue
- box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
- (startX, startY, endX, endY) = box.astype("int")
- bb = (startX, startY, endX, endY)
-
- # 创建输入q和输出q 多进程
- iq = multiprocessing.Queue()
- oq = multiprocessing.Queue()
- inputQueues.append(iq)
- outputQueues.append(oq)
-
- # 多核
- p = multiprocessing.Process(
- target=start_tracker,
- args=(bb, label, rgb, iq, oq)) #Process()函数需要的参数
- p.daemon = True
- p.start()
-
- cv2.rectangle(frame, (startX, startY), (endX, endY),
- (0, 255, 0), 2)
- cv2.putText(frame, label, (startX, startY - 15),
- cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 255, 0), 2)
-
- else:
- # 多个追踪器处理的都是相同输入
- for iq in inputQueues:
- iq.put(rgb)
-
- for oq in outputQueues:
- # 得到更新结果
- (label, (startX, startY, endX, endY)) = oq.get()
-
- # 绘图
- cv2.rectangle(frame, (startX, startY), (endX, endY),
- (0, 255, 0), 2)
- cv2.putText(frame, label, (startX, startY - 15),
- cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 255, 0), 2)
-
- if writer is not None:
- writer.write(frame)
-
- cv2.imshow("Frame", frame)
- key = cv2.waitKey(1) & 0xFF
-
- if key == 27:
- break
-
- fps.update()
- fps.stop()
- print("[INFO] elapsed time: {:.2f}".format(fps.elapsed()))
- print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))
-
- if writer is not None:
- writer.release()
-
- cv2.destroyAllWindows()
- vs.release()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。