OpenCV内置8种目标跟踪算法demo

一、简单介绍

这八种算法包括:

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()

参考:http://m.elecfans.com/article/722414.html

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值