
文章目录一、项目思路二、环境配置BUG1module cv2 has no attribute legacyBUG2module cv2 has no attribute TrackerCSRT_create三、算法详解3.1、目标追踪算法3.2、目标追踪器初始化3.3、目标追踪器更新3.4、绘制矩形框3.5、手动标记ROI感兴趣区域3.5.1、标注ROI3.5.2、截取ROI四、项目实战4.1、单目标 - 实时追踪4.2、多目标 - 实时追踪多目标 - 实时追踪一、项目思路单目标追踪参数设置读取视频读取帧图像设置视频保存参数手动选择追踪目标选择追踪算法实例化单目标追踪器循环读取帧图像矩形框标记目标实时更新动态框显示图像多目标追踪参数设置构建追踪算法列表实例化多目标追踪器读取视频循环读取帧图像对视频进行等比例缩放手动选择追踪目标矩形框标记目标实时更新动态框显示图像二、环境配置python opencvBUG1module ‘cv2’ has no attribute ‘legacy’BUG1module cv2 has no attribute legacy原因opencv_python和opencv_contrib-python的版本不一致问题解决安装opencv_contrib-python参考文献BUG2module ‘cv2’ has no attribute ‘TrackerCSRT_create’BUG2module cv2 has no attribute TrackerCSRT_create原因在opencv_contrib-python中部分函数被取消。解决使用cv2.legacy来调用。如将cv2.TrackerBoosting_create改为cv2.legacy.TrackerBoosting_create。参考文献机器学习进阶-目标跟踪-KCF目标跟踪方法计算机视觉项目-实时目标追踪三、算法详解OpenCV学习笔记15-目标跟踪算法介绍及实战3.1、目标追踪算法定义不同的目标追踪算法(不含深度学习)序号追踪算法函数说明1BOOSTING Trackercv2.legacy.TrackerBoosting_create算法原理类似于Harr cascdes(AdaBoost)是一种很老的算法。速度慢并且不准。最低支持OpenCV 3.0.02MIL Trackercv2.legacy.TrackerMIL_create比BOOSTING更精确但是失败率比较高。最低支持OpenCV 3.0.03KCF Trackercv2.legacy.TrackerKCF_create速度比BOOSTING和MIL更快与BOOSTING和MIL一样不能很好的处理遮挡问题。4CSRT Trackercv2.legacy.TrackerCSRT_create比KCF更准一些但是速度比KCF慢。最低支持OpenCV 3.4.25TLD Trackercv2.legacy.TrackerTLD_create在多帧遮挡下效果最好。但是TLD的误报非常多。最低支持OpenCV 3.0.06MedianFlowcv2.legacy.TrackerMedianFlow_create出色的跟踪故障报告。当运动是可预测的并且没有遮挡时效果非常好但是对于快速跳动或快速移动的物体模型会失效。最低支持OpenCV 3.0.07MOSSE Trackercv2.legacy.TrackerMOSSE_create速度真心快但是不如CSRT和KCF的准确率那么高如果追求速度选它准没错。最低支持OpenCV 3.4.18GOTURN Tracker在OpenCV中唯一以深度学习为基础的目标检测器。需要额外的模型才能运行最低支持OpenCV 3.2.03.2、目标追踪器初始化trackerscv2.legacy.MultiTracker_create()# 使用多目标追踪器trackercv2.legacy.TrackerCSRT_create()# 使用csrt追踪算法3.3、目标追踪器更新函数说明success,boxestrackers.update(frame)输入参数 frame 传入的图像 输出参数 success 是否追踪成功 boxes 追踪到的目标框3.4、绘制矩形框(x,y,w,h)[int(ii)foriiinboxes]# 获取目标位置cv2.rectangle(frame,(x,y),(xw,yh),(0,255,0),2)# 矩形框标出动态目标cv2.imshow(frame,frame)# 实时显示追求目标3.5、手动标记ROI感兴趣区域函数说明[min_x,min_y,w,h]cv2.selectROI(windowName,img,showCrosshair,fromCenter)输入参数 windowName 选择的区域被显示在的窗口的名字 img 要在什么图片上选择ROI showCrosshair 是否在矩形框里画十字线默认为True。 fromCenter 是否是从矩形框的中心开始画默认为False。 输出参数 min_x 为矩形框中最小的x值左上角 min_y 为矩形框中最小的y值左上角 w 为这个矩形框的宽 h 为这个矩形框的高# 备注选好区域后按空格或者Enter完成选择换区域的时候直接通过鼠标重新选择即可3.5.1、标注ROIimportcv2 imagecv2.imread(blank_write.jpg)imcv2.selectROI(windowNameimg,imgimage,showCrosshairFalse,fromCenterFalse)print(im)cv2.waitKey(1)3.5.2、截取ROIimportcv2 imagecv2.imread(blank_write.jpg)imcv2.selectROI(windowNameimg,imgimage,showCrosshairTrue,fromCenterFalse)print(im)img_roiimage[int(im[1]):int(im[1]im[3]),int(im[0]):int(im[0]im[2])]cv2.imshow(imageHSV,img_roi)cv2.waitKey(0)四、项目实战4.1、单目标 - 实时追踪importcv2# 设置参数video_load_pathrC:\Users\my\Videos\football.mp4# 视频导入地址video_save_pathrC:\Users\my\Videos\football2.mov# 视频保存地址if__name____main__:capcv2.VideoCapture(video_load_path)# 读取视频流ret,framecap.read()# 读取帧图像frame_widthint(cap.get(3))# 获取图像宽frame_heightint(cap.get(4))# 获取图像高# 创建保存视频的对象设置编码格式帧率图像宽高等outcv2.VideoWriter(video_save_path,cv2.VideoWriter_fourcc(D,I,V,X),10,(frame_width,frame_height))bboxcv2.selectROI(frame,frame,fromCenterFalse,showCrosshairTrue)# 人工标注感兴趣目标trackercv2.legacy.TrackerCSRT_create()# 使用csrt算法tracker.init(frame,bbox)# 初始化trackerwhileTrue:_,framecap.read()# 读取帧图像ifframeisNone:# 如果读到的帧数不为空则继续读取如果为空则退出。breakbool_para,boxtracker.update(frame)# 由于物体运动需要动态的根据物体运动更新矩形框ifbool_para:# 若读取成功我们就定位画框并跟随(x,y,w,h)[int(ii)foriiinbox]cv2.rectangle(frame,pt1(int(x),int(y)),pt2(int(x)int(w),int(y)int(h)),color(0,255,0),thickness2)cv2.imshow(frame,frame)# 实时显示追求目标out.write(frame)# 将每一帧图像写入到输出文件中# 使用 waitKey 可以控制视频的播放速度。数值越小播放速度越快。ifcv2.waitKey(1)ord( ):# ord( ): 按空格结束breakcap.release()# 释放摄像头out.release()# 释放摄像头cv2.destroyAllWindows()# 摧毁所有图窗4.2、多目标 - 实时追踪importargparseimportcv2# 1参数设置视频存放地址 指定追踪器类型apargparse.ArgumentParser()ap.add_argument(-v,--video,typestr,default01.mp4,helppath to input video file)ap.add_argument(-t,--tracker,typestr,defaultkcf,helpOpencv object tracker type)argsvars(ap.parse_args())# 2构造Opencv的追踪算法列表OPENCV_OBJECT_TRACKERS{csrt:cv2.legacy.TrackerCSRT_create,kcf:cv2.legacy.TrackerKCF_create,boosting:cv2.legacy.TrackerBoosting_create,mil:cv2.legacy.TrackerMIL_create,tld:cv2.legacy.TrackerTLD_create,medianflow:cv2.legacy.TrackerMedianFlow_create,mosse:cv2.legacy.TrackerMOSSE_create}# 3实例化多目标追踪器trackerscv2.legacy.MultiTracker_create()# 4读取视频vscv2.VideoCapture(args[video])whileTrue:# 5读取帧图像framevs.read()# frame[bool, data]frameframe[1]# 获取帧图像# 若视频播放结束则跳出ifframeisNone:break# 6使用cv2.resize对图像进行长宽的放缩操作h,wframe.shape[:2]# 获取帧图像的高宽width300# 视频缩放到指定大小rwidth/float(w)# 缩放比例dim(width,int(r*h))# 缩放后的尺寸framecv2.resize(frame,dim,cv2.INTER_AREA)# 7由于物体运动需要根据物体的动态运动更新矩形框(success,boxes)trackers.update(frame)# 8循环多组矩形框进行画图操作forboxinboxes:(x,y,w,h)[int(v)forvinbox]# 获取动态目标的位置cv2.rectangle(frame,(x,y),(xw,yh),(0,255,0),2)# 矩形框标出动态目标# 9显示图像cv2.imshow(Frame,frame)# 10英文输入下先按s暂停视频然后手动选择一个区域最后按空格键开始播放可多次重复操作添加多个追踪目标keycv2.waitKey(100)0xffifkeyord(s):boxcv2.selectROI(Frame,frame,fromCenterFalse,showCrosshairTrue)trackerOPENCV_OBJECT_TRACKERS[args[tracker]]()# 创建追踪器trackers.add(tracker,frame,box)# 添加追踪器elifkey27:breakvs.release()cv2.destroyAllWindows()