opencv实现单目标跟踪

目录

opencv中实现了八种跟踪方法。

单目标跟踪过程:

opencv实现单目标跟踪代码


opencv中实现了八种跟踪方法。

  1. BOOSTING Tracker:和Haar cascades(AdaBoost)背后所用的机器学习算法相同,但是距其诞生已有十多年了。这一追踪器速度较慢,并且表现不好,但是作为元老还是有必要提及的。(最低支持OpenCV 3.0.0)

  2. MIL Tracker:比上一个追踪器更精确,但是失败率比较高。(最低支持OpenCV 3.0.0)

  3. KCF Tracker:比BOOSTING和MIL都快,但是在有遮挡的情况下表现不佳。(最低支持OpenCV 3.1.0)

  4. CSRT Tracker:比KCF稍精确,但速度不如后者。(最低支持OpenCV 3.4.2)

  5. MedianFlow Tracker:在报错方面表现得很好,但是对于快速跳动或快速移动的物体,模型会失效。(最低支持OpenCV 3.0.0)

    扫描二维码关注公众号,回复: 16437392 查看本文章
  6. TLD Tracker:我不确定是不是OpenCV和TLD有什么不兼容的问题,但是TLD的误报非常多,所以不推荐。(最低支持OpenCV 3.0.0)

  7. MOSSE Tracker:速度真心快,但是不如CSRT和KCF的准确率那么高,如果追求速度选它准没错。(最低支持OpenCV 3.4.1)

  8. GOTURN Tracker:这是OpenCV中唯一一深度学习为基础的目标检测器。它需要额外的模型才能运行,本文不详细讲解。(最低支持OpenCV 3.2.0)目标跟踪(2)GOTURN:基于深度学习的目标跟踪_求则得之,舍则失之的博客-CSDN博客_goturn跟踪

名称

性能

KCF(kernelized correlation filters)

速度快180FPS、跟踪效果不好、由远及近框不变

Boosting

速度中25FPS、跟踪效果可以但跟踪到其他人、由远及近框不变

MIL(多实例学习)

速度慢10FPS、跟踪效果可以但跟踪到其他人、由远及近框不变

TLD(Tracking-Learning-Detection跟踪、学习和检测)

速度最慢4FPS、跟踪效果中间出现漂移、由远及近框可变大小

MOSSE 速度最快3000FPS,跟踪效果很差,由远及近框不变

Median Flow

速度快70FPS、跟踪效果很差、由远及近框不变

CSRT(具有信道和空间可靠性的鉴别相关滤波器)

速度中30FPS、跟踪效果最好、由远及近框不变

名词解释:

       目标跟踪中的漂移:简单的来说,就是指在追踪过程中,滤波器一直在更新,而更新的滤波器并不能保证完全跟踪到后一帧的目标,会有误差产生,如果误差没有及时处理,滤波器就会一直这样错误的更新,一定时间后跟踪器无法正常的跟踪到目标,这就是漂移。

        那么解决漂移的办法无非就是控制好滤波器的更新。

总结:

如果追求高准确度,又能忍受慢一些的速度,那么就用CSRT

如果对准确度的要求不苛刻,想追求速度,那么就选KCF

纯粹想节省时间就用MOSSE

单目标跟踪过程:

  1. 创建跟踪器
    def createTypeTracker(trackerType):
  2. 读取视频第一帧,选择跟踪的目标
    # 读第一帧。
    ok, frame = video.read()
    # 取消注释下面的行以选择一个不同的边界框
    bbox = cv2.selectROI(frame, False)
  3. 初始化跟踪器
    tracker_type = 'MIL'
    tracker = createTypeTracker(tracker_type)
    # 用第一帧和包围框初始化跟踪器
    ok = tracker.init(frame, bbox)
  4. 随着视频进行更新跟踪
    # 更新跟踪器
    ok, bbox = tracker.update(frame)

opencv实现单目标跟踪代码

import cv2
import sys

# 创建一个跟踪器,algorithm: KCF、CSRT、DaSiamRPN、GOTURM、MIL
trackerTypes = ['BOOSTING', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'GOTURN', 'MOSSE', 'CSRT']

def createTypeTracker(trackerType):
    if trackerType == trackerTypes[0]:
        tracker = cv2.legacy.TrackerBoosting_create()
    elif trackerType == trackerTypes[1]:
        tracker = cv2.TrackerMIL_create()
    elif trackerType == trackerTypes[2]:
        tracker = cv2.legacy.TrackerKCF_create()
    elif trackerType == trackerTypes[3]:
        tracker = cv2.legacy.TrackerTLD_create()
    elif trackerType == trackerTypes[4]:
        tracker = cv2.legacy.TrackerMedianFlow_create()
    elif trackerType == trackerTypes[5]: # 暂时存在问题
        tracker = cv2.TrackerGOTURN_create()
    elif trackerType == trackerTypes[6]:
        tracker = cv2.legacy.TrackerMOSSE_create()
    elif trackerType == trackerTypes[7]:
        tracker = cv2.legacy.TrackerCSRT_create()
    else:
        tracker = None

    return tracker


videoPth = 'E:\Python-Code/videodataset/enn.mp4'

if __name__ == '__main__':
    tracker_type = 'MIL'
    tracker = createTypeTracker(tracker_type)
    # 读取视频
    video = cv2.VideoCapture("E:\Python-Code/videodataset/enn.mp4")

    # 如果视频没有打开,退出。
    if not video.isOpened():
        print
        "Could not open video"
        sys.exit()

    # 读第一帧。
    ok, frame = video.read()
    if not ok:
        print('Cannot read video file')
        sys.exit()

    # 定义一个初始边界框
    bbox = (287, 23, 86, 320)

    # 取消注释下面的行以选择一个不同的边界框
    bbox = cv2.selectROI(frame, False)

    # 用第一帧和包围框初始化跟踪器
    ok = tracker.init(frame, bbox)

    while True:
        # 读取一个新的帧
        ok, frame = video.read()
        if not ok:
            break

        # 启动计时器
        timer = cv2.getTickCount()

        # 更新跟踪器
        ok, bbox = tracker.update(frame)

        # 计算帧率(FPS)
        fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);

        # 绘制包围框
        if ok:
            # 跟踪成功
            p1 = (int(bbox[0]), int(bbox[1]))
            p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))
            cv2.rectangle(frame, p1, p2, (255, 0, 0), 2, 1)
        else:
            # 跟踪失败
            cv2.putText(frame, "Tracking failure detected", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)

        # 在帧上显示跟踪器类型名字
        cv2.putText(frame, tracker_type + " Tracker", (100, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50, 170, 50), 2);

        # 在帧上显示帧率FPS
        cv2.putText(frame, "FPS : " + str(int(fps)), (100, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50, 170, 50), 2);

        # 显示结果
        cv2.imshow("Tracking", frame)

        # 按ESC键退出
        k = cv2.waitKey(1) & 0xff
        if k == 27: break

猜你喜欢

转载自blog.csdn.net/weixin_45823221/article/details/128470499