知乎上有篇文章对目标追踪介绍的非常清晰. 目标追踪综述
OpenCV上有八种不同的目标追踪算法.
BOOSTING Tracker:和Haar cascades(AdaBoost)背后所用的机器学习算法相同,但是距其诞生已有十多年了。这一追踪器速度较慢,并且表现不好。(最低支持OpenCV 3.0.0)
MIL Tracker:比上一个追踪器更精确,但是失败率比较高。(最低支持OpenCV 3.0.0)
KCF Tracker:比BOOSTING和MIL都快,但是在有遮挡的情况下表现不佳。(最低支持OpenCV 3.1.0)
CSRT Tracker:比KCF稍精确,但速度不佳。(最低支持OpenCV 3.4.2)
MedianFlow Tracker:出色的跟踪故障报告。当运动是可预测的并且没有遮挡时,效果非常好,但是对于快速跳动或快速移动的物体,模型会失效。(最低支持OpenCV 3.0.0)
TLD Tracker:在多帧遮挡下效果最好。但是TLD的误报非常多,所以不推荐。(最低支持OpenCV 3.0.0)
MOSSE Tracker:速度真心快,但是不如CSRT和KCF的准确率那么高,如果追求速度选它准没错。(最低支持OpenCV 3.4.1)
GOTURN Tracker:这是OpenCV中唯一一深度学习为基础的目标检测器。它需要额外的模型才能运行。(最低支持OpenCV 3.2.0)
定义不同的目标追踪算法(不含深度学习):
# 定义OpenCV中的七种目标追踪算法
OPENCV_OBJECT_TRACKERS = {
'boosting': cv2.legacy.TrackerBoosting_create,
'csrt': cv2.legacy.TrackerCSRT_create,
'kcf': cv2.legacy.TrackerKCF_create,
'mil': cv2.legacy.TrackerMIL_create,
'tld': cv2.legacy.TrackerTLD_create,
'medianflow': cv2.legacy.TrackerMedianFlow_create,
'mosse': cv2.legacy.TrackerMOSSE_create
}
通过MultiTracker_create初始化追踪器集合:
trackers = cv2.MultiTracker_create()
根据trackers.update更新目标追踪器:
success, boxes = trackers.update(frame)
根据trackers.update返回的区域集boxes,绘制不同的目标区域。
box是一个浮点型的ndarray,绘图时需要转成int型
# 绘制追踪到的矩形区域
for box in boxes:
(x, y, w, h) = [int(v) for v in box]
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
roi = cv2.selectROI('frame', frame, showCrosshair=xxx, fromCenter=xxx)
完整展示:
import cv2
cap = cv2.VideoCapture('./videos/soccer_01.mp4')
while True:
flag, frame = cap.read()
if frame is None:
break
cv2.imshow('frame', frame)
key = cv2.waitKey(100)
if key == ord('s'):
# 框选ROI区域
roi = cv2.selectROI('frame', frame, showCrosshair=True, fromCenter=False)
print(roi)
# 退出,27为Esc的AscII的值
elif key == 27:
break
cap.release()
cv2.destroyAllWindows()
roi_img = img[int(roi[1]):int(roi[1]+roi[3]), int(roi[0]):int(roi[0]+roi[2])] # 先高后宽
完整展示:
import cv2
cap = cv2.VideoCapture('./videos/soccer_01.mp4')
while True:
flag, frame = cap.read()
if frame is None:
break
cv2.imshow('frame', frame)
key = cv2.waitKey(100)
if key == ord('s'):
# 框选ROI区域
roi = cv2.selectROI('frame', frame, showCrosshair=True, fromCenter=False)
# 截取ROI区域
roi_img = frame[int(roi[1]):int(roi[1]+roi[3]), int(roi[0]):int(roi[0]+roi[2])]
cv2.imshow('roi_img', roi_img)
elif key == 27:
break
cap.release()
cv2.destroyAllWindows()
tracker = OPENCV_OBJECT_TRACKERS['xxx']()
OpenCV目标跟踪算法的使用大概可以分为以下几个步骤:
完整代码:
import cv2
# MultiTracker_create以及一些其他的目标追踪算法在opencv4.5以后换了地方.
# cv2.legacy.MultiTracker_create
# 定义OpenCV中的七种目标追踪算法
OPENCV_OBJECT_TRACKERS = {
'boosting': cv2.legacy.TrackerBoosting_create,
'csrt': cv2.legacy.TrackerCSRT_create,
'kcf': cv2.legacy.TrackerKCF_create,
'mil': cv2.legacy.TrackerMIL_create,
'tld': cv2.legacy.TrackerTLD_create,
'medianflow': cv2.legacy.TrackerMedianFlow_create,
'mosse': cv2.legacy.TrackerMOSSE_create
}
# 初始化追踪器集合
trackers = cv2.legacy.MultiTracker_create()
# 读取视频
cap = cv2.VideoCapture('./videos/soccer_01.mp4')
while True:
flag, frame = cap.read()
if frame is None:
break
# 更新追踪器,追踪目标
success, boxes = trackers.update(frame)
# 绘制追踪到的矩形区域
for box in boxes:
# box是个浮点型ndarray, 画图需要整型
(x, y, w, h) = [int(v) for v in box]
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow('frame', frame)
key = cv2.waitKey(30)
if key == ord('s'):
# 框选ROI区域
roi = cv2.selectROI('frame', frame, showCrosshair=True, fromCenter=False)
# print(roi)
# 创建一个实际的目标追踪器
tracker = OPENCV_OBJECT_TRACKERS['csrt']()
trackers.add(tracker, frame, roi)
elif key == 27:
break
cap.release()
cv2.destroyAllWindows()
智科专业小白,写博文不容易,如果喜欢的话可以点个赞哦!