背景——为何需要目标跟踪

  1. 在视频帧中检测到多个对象时,跟踪有助于跨帧确定对象的身份。
  2. 在某些情况下,目标检测可能会失败但仍可能跟踪对象,因为跟踪考虑前一帧中对象的位置和外观。
  3. 跟踪算法非常快,因为它们进行本地搜索而不是全局搜索。我们可以通过每第n帧执行目标检测并在中间帧中跟踪对象来为我们的系统获得非常高的性能。
    由于复杂的实际情况,跟踪和目标检测需要相结合,通常会在目标跟踪一段时间后再次目标检测。

代码

OpenCV中的多目标跟踪器MultiTracker类提供了多目标跟踪的实现。
但是这仅仅是一个初步的实现,因为它只处理跟踪对象,而不对被跟踪对象进行任何优化。

'''
CSRT:高准确度但是速度慢
KCF:速度快精度略低
MOSSE:纯粹节省时间
'''


# 三个目标进行跟踪
import cv2
print('Select 3 tracking targets')
cv2.namedWindow("tracking")
camera = cv2.VideoCapture('./images/vtest.avi')
tracker = cv2.MultiTracker_create()
init_once = False

ok, image = camera.read()
if not ok:
print('Failed to read video')
exit()

bbox1 = cv2.selectROI('tracking', image)
bbox2 = cv2.selectROI('tracking', image)
bbox3 = cv2.selectROI('tracking', image)

while camera.isOpened():
ok, image = camera.read()
if not ok:
print('no image to read')
break

if not init_once:
ok = tracker.add(cv2.TrackerMIL_create(), image, bbox1)
ok = tracker.add(cv2.TrackerMIL_create(), image, bbox2)
ok = tracker.add(cv2.TrackerMIL_create(), image, bbox3)
init_once = True

ok, boxes = tracker.update(image)
print(ok, boxes)

for newbox in boxes:
p1 = (int(newbox[0]), int(newbox[1]))
p2 = (int(newbox[0] + newbox[2]), int(newbox[1] + newbox[3]))
cv2.rectangle(image, p1, p2, (200,0,0))

cv2.imshow('tracking', image)
k = cv2.waitKey(1)
if k == 27:
break # esc pressed

效果

opencv基于MultiTracker的多目标跟踪_多目标跟踪