多目标追踪器:用 OpenCV 实现多目标追踪
极市学习Day3 OpenCV目标跟踪实例练习
-
源
-
关于 OpenCV 运行中的问题
-
- 安装OpenCV
- OpenCV目标跟踪运行出错
-
代码小小的解析
-
- Attention
- 第一步是创建单目标追踪器
- 在第一步之后
- 第二步是获取视频的第一帧画面
- 在获取第一帧画面后
- 第三步完成物体定位工作
- 第四步则是通过更新多目标追踪器来实现目标跟踪效果的实时显示
-
源
multi-target tracking system: based on OpenCV implementation for multi-target tracking (C++/Python)
关于 OpenCV 运行中的问题
安装OpenCV
- 在pyCharm或者anaconda 控制台里面直接安装
pip install opencv-python
- 在本地下载包后安装
opencv_python-3.4.3.18-cp37-cp37m-win_amd64.whl
下载之后,把下载包放在{编译器目录}\Scripts
编译器目录可以在pycharm的 File - Settings - Project Interpreter
在目录的空白处Shift+鼠标右键打开Power Shell输入
pip install --user opencv_contrib_python-3.4.3.18-cp37-cp37m-win_amd64.whl
提示安装成功!
再使用pip list命令来确认一下安装是否成功:
pip list
- 作者采用以下方法来解决这个问题:特别注意更改PyCharm环境下的pip源设置为国内可用的源。
阿里云 http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) http://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
OpenCV目标跟踪运行出错
问题
AttributeError: module 'cv2.cv2' has no attribute 'TrackerCSRT_create'

解析:由于cv2并没有内置tracker功能,默认情况下无法实现追踪效果。因此,请按照以下步骤进行操作:首先下载并安装cv2-contrib模块包(可直接通过pip命令完成),然后按照指导文档配置相关参数设置即可完成基本的视频追踪功能。例如,在终端中执行命令pip install opencv-contrib-python即可开始使用该模块进行开发工作。
直接装pip install opencv-contrib-python==你的opencv版本号
本地安装程序
下载地址
操作步骤如下
代码小小的解析
Attention
测试视频目录更改

第一步:创建单目标追踪器
OpenCV 包含八种不同类型的追踪器类别:BOOSTING、MTL、KCF、TLD、MEDIANFLOW、GOTURN、MOSSE 和 CSRT.

第二步:读取视频的第一帧
一个多目标追踪器需要两个输入
1.视频的一帧
2.你想要追踪的所有目标的位置(边界框)
给定这些信息,追踪器会在多有子序列帧中追踪这些特定目标的位置。
在当前代码中,我们首先使用 VideoCapture 类获取视频,并读取其首帧。该帧将被用于后续 MultiTracker 初始化过程中的基础设置。
# Set video to load
videoPath = "videos/run.mp4"
# Create a video capture object to read videos
cap = cv2.VideoCapture(videoPath)
# Read first frame
success, frame = cap.read()
# quit if unable to read the video file
if not success:
print('Failed to read video')
sys.exit(1)
第三步:在第一帧中定位物体
确定目标物体在第一帧中的位置,并将其定义为一个简单的矩形边界框。OpenCV提供了selectROI功能这一工具,并调用图形用户界面来选择边界框(也称作感兴趣区域 ROI)。值得注意的是,C++版本支持多选多个 ROI 轮廓,而在Python版本中仅返回单个 ROI。因此,在Python版本中需要通过循环机制来获取多个 ROI
在每个目标设定下, 我们会安排随机的颜色值以生成边界框颜色. 请参考附录中的代码示例部分以获取具体的实现细节.
## Select boxes
bboxes = []
colors = []
# OpenCV's selectROI function doesn't work for selecting multiple objects in Python
# So we will call this function in a loop till we are done selecting all objects
while True:
# draw bounding boxes over objects
# selectROI's default behaviour is to draw box starting from the center
# when fromCenter is set to false, you can draw box starting from top left corner
bbox = cv2.selectROI('MultiTracker', frame)
bboxes.append(bbox)
colors.append((randint(0, 255), randint(0, 255), randint(0, 255)))
print("Press q to quit selecting boxes and start tracking")
print("Press any other key to select next object")
k = cv2.waitKey(0) & 0xFF
if (k == 113): # q is pressed
break
print('Selected bounding boxes {}'.format(bboxes))
第三步:初始化多目标追踪器
然后初始化一个 MuliTracker 实例,并在其属性中添加与单个目标追踪器相当数量的边界框。在这个案例中,默认配置使用的是 CSR T 单目标准备。然而如果你愿意探索其他选项,则可以将 trackerTyper 设置为文章开头列出的那种其中一种追踪器类型。尽管 CSR T 跟踪机制虽然在速度上稍显落后,在实际应用中往往能提供较为理想的效果。
可以采用将它们封装在同一 MultiTracker 中使用不同的追踪器;然而,并不具有实际意义。
MultiTracker 是一种用于封装单目标追踪算法的工具类。从前文可知,在初始化单目标追踪器时需要提供两方面的信息:一是视频的第一帧;二是被用来定位待跟踪目标的边界框。多目标追踪系统则会将这些必要的参数分配给其内部封装的不同单目追焦模块。
# Specify the tracker type
trackerType = "CSRT"
# Create MultiTracker object
multiTracker = cv2.MultiTracker_create()
# Initialize MultiTracker
for bbox in bboxes:
multiTracker.add(createTrackerByName(trackerType), frame, bbox)
第四步:更新多目标追踪器并展示结果

