一、简单介绍
这八种算法包括:
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:我不确定是不是OpenCV和TLD有什么不兼容的问题,但是TLD的误报非常多,所以不推荐。(最低支持OpenCV 3.0.0)
MOSSE Tracker:速度真心快,但是不如CSRT和KCF的准确率那么高,如果追求速度选它准没错。(最低支持OpenCV 3.4.1)
GOTURN Tracker:这是OpenCV中唯一一深度学习为基础的目标检测器。它需要额外的模型才能运行,本文不详细讲解。(最低支持OpenCV 3.2.0)
如果追求高准确度,又能忍受慢一些的速度,那么就用CSRT
如果对准确度的要求不苛刻,想追求速度,那么就选KCF
纯粹想节省时间就用MOSSE
从OpenCV 3开始,目标检测器得到了快速发展,下表总结了不同版本的OpenCV中的追踪器:
二、环境搭建
1、安装OpenCV3.4及其以上版本
2、安装opencv-contrib-python
安装该包后可能出现错误:AttributeError: module 'cv2.cv2' has no attribute 'TrackerCSRT_create'
解决办法:pip install --user -i https://mirrors.aliyun.com/pypi/simple/ opencv-contrib-python
三、代码实现
import argparse
import cv2
from glob import glob
OPENCV_OBJECT_TRACKERS={
"csrt": cv2.TrackerCSRT_create,
"kcf": cv2.TrackerKCF_create,
"boosting": cv2.TrackerBoosting_create,
"mil": cv2.TrackerMIL_create,
"tld": cv2.TrackerKCF_create,
"medianflow": cv2.TrackerMedianFlow_create,
"mosse": cv2.TrackerMOSSE_create
}
parser = argparse.ArgumentParser()
parser.add_argument('-t', "--tracker", type=str, default='kcf')
parser.add_argument('-v', '--video_path', type=str, default='/data/ly/datasets/girl/color/')
parser.add_argument('--show',action='store_true')
args = parser.parse_args()
def main():
tracker = OPENCV_OBJECT_TRACKERS[args.tracker]()
frames_path = glob(args.video_path+'/*.jpg')
frames_path = sorted(frames_path)
# bbox = [290, 135, 338, 304]
first_frame = cv2.imread(frames_path[0])
if args.show:
cv2.imshow("Frame",first_frame)
# key = cv2.waitKey(1) & 0xFF
bbox = cv2.selectROI("Frame",first_frame,fromCenter=False,showCrosshair=True)
else:
bbox = [290, 135, 338, 304] # only for this video
print("first box:",bbox)
success = tracker.init(first_frame, bbox)
if not success:
raise "tracker init error"
for frame_path in frames_path[1:]:
frame = cv2.imread(frame_path)
h,w = frame.shape[0], frame.shape[1]
success, bbox = tracker.update(frame)
# print(bbox)
if success:
x, y, w, h = bbox
print("x,y,w,h:",x,y,w,h)
if args.show:
cv2.rectangle(frame,(int(x), int(y)), (int(x+w), int(y+h)), (0,255,0), 2)
if args.show:
cv2.putText(frame, "success" if success else "failure", (10,20),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255))
cv2.imshow("Frame",frame)
cv2.waitKey(25)
if __name__ == "__main__":
main()