多目标追踪器:用 OpenCV 实现多目标追踪(C++/Python)
pip install opencv-python
pip install --user opencv_contrib_python-3.4.3.18-cp37-cp37m-win_amd64.whl
提示安装成功!
再使用pip list命令来确认一下安装是否成功:
pip list
阿里云 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/
问题
AttributeError: module 'cv2.cv2' has no attribute 'TrackerCSRT_create'
解析:opencv其实没有tracker这个功能,所以你需要安装opencv-contrib,具体安装方法就是简单的pip install,如下
直接装pip install opencv-contrib-python==你的opencv版本号
本地安装
下载地址
步骤如上
OpenCV 有八个不同的追踪器类型:BOOSTING, MTL, KCF, TLD, MEDIANFLOW, GOTURN, MOSSE, CSRT.
一个多目标追踪器需要两个输入
1.视频的一帧
2.你想要追踪的所有目标的位置(边界框)
给定这些信息,追踪器会在多有子序列帧中追踪这些特定目标的位置。
在下面的代码中,我们先用 VidoeCapture 类加载视频,读取第一帧。这一帧将会用于之后的 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 的功能,它可以弹出一个 GUI 来选择边界框(也叫做感兴趣的区域(ROI))。在C++版本中,selectROI允许你得到多个边界框,但在 Python 版本中,它会只返回一个边界框。所以,在 Python 版本中,我们需要一个循环来得到多个边界框。
对于每个目标,我们还会选择随机的颜色来显示边界框。下面就是实现代码。
## 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 对象并且增加和单个目标追踪器一样多的边界框。在这个例子中,用的是 CSRT 单目标追踪器,但是你尝试可以通过将 trackerTyper 变量改变为这篇文章一开始提到的8种追踪器中的一种,来尝试其使用他类型的追踪器。CSRT 追踪器不是最快的,但它在我们尝试的许多情况下都能生成最好的结果。
你可以用封装在同一个 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)