OpenCV学习笔记15-目标跟踪算法介绍及实战

文章目录

*

+ 1. 目标追踪介绍
+ 2. OpenCV目标追踪算法介绍
+ 3. 目标追踪过程
+
* 3.1 定义目标追踪算法
* 3.2 初始化追踪器集合
* 3.3 更新目标追踪器
* 3.4 绘制目标区域
* 3.5 对感兴趣的区域进行框截取ROI:
*
3.5.1 框选ROI区域:
3.5.2 截取ROI:
* 3.7 根据需要创建新的追踪目标
*
3.7.1 创建一个实际的目标追踪器:
3.7.2 将选择好的目标添加到追踪器上:
+ 4. 目标跟踪算法的使用

1. 目标追踪介绍

知乎上有篇文章对目标追踪介绍的非常清晰. 目标追踪综述

2. OpenCV目标追踪算法介绍

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)

3. 目标追踪过程

3.1 定义目标追踪算法

定义不同的目标跟踪算法(不包括深度学习):[en]Define different target tracking algorithms (excluding deep learning):


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
}

3.2 初始化追踪器集合

通过 MultiTracker_create初始化追踪器集合:

trackers = cv2.MultiTracker_create()

3.3 更新目标追踪器

根据跟踪器更新目标跟踪器。更新:[en]Update the target tracker according to trackers.update:

  • trackers.update(image)
  • image:传入的图像
  • 返回两个参数,一个是是否追踪成功,另一个是追踪到的ROI框
success, boxes = trackers.update(frame)

3.4 绘制目标区域

根据trackers.update返回的地域设置框绘制不同的目标地域。[en]Draw different target regions according to the region set boxes returned by * trackers.update*.

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)

3.5 对感兴趣的区域进行框截取ROI:

  • cv2.selectROI(windowName, img[, showCrosshair[, fromCenter]])
  • windowName:选择的区域被显示在的窗口的名字
  • img:要在什么图像上进行ROI
  • showCrosshair:是否在矩形框里画十字线,默认为True。
  • fromCenter:是否在矩形框里画十字线,默认为False。
  • 返回的是一个列表: [min_x,min_y,w,h]:
    • min_x为矩形框中最小的x值,左上角
    • min_y为矩形框中最小的y值,左上角
    • w为这个矩形框的宽
    • h为这个矩形框的高
  • 选好区域后,按 空格或者Enter完成选择;换区域的时候直接通过鼠标重新选择即可
3.5.1 框选ROI区域:
roi = cv2.selectROI('frame', frame, showCrosshair=xxx, fromCenter=xxx)

完整演示:[en]Full presentation:

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 = cv2.selectROI('frame', frame, showCrosshair=True, fromCenter=False)
        print(roi)

    elif key == 27:
        break
cap.release()
cv2.destroyAllWindows()
3.5.2 截取ROI:
roi_img = img[int(roi[1]):int(roi[1]+roi[3]), int(roi[0]):int(roi[0]+roi[2])]

OpenCV学习笔记15-目标跟踪算法介绍及实战

完整演示:[en]Full presentation:

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 = cv2.selectROI('frame', frame, showCrosshair=True, fromCenter=False)

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

3.7 根据需要创建新的追踪目标

3.7.1 创建一个实际的目标追踪器:
tracker = OPENCV_OBJECT_TRACKERS['xxx']()
3.7.2 将选择好的目标添加到追踪器上:
  • trackers.add(newTracker, image, boundingBox)
  • newTracker:追踪器
  • image:传入的图像
  • boundingBox:ROI区域

4. 目标跟踪算法的使用

OpenCV目标跟踪算法的使用大概可以分为以下几个步骤:

  1. 创建MultiTracker对象.

  2. 读取视频或摄像头数据.

  3. 框选ROI区域

  4. 给MultiTracker对象添加实际的追踪算法.

  5. 对每一帧进行进行目标追踪.

完整代码:[en]Complete code:

import cv2

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:

        (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 = cv2.selectROI('frame', frame, showCrosshair=True, fromCenter=False)

        tracker = OPENCV_OBJECT_TRACKERS['csrt']()
        trackers.add(tracker, frame, roi)
    elif key == 27:
        break

cap.release()
cv2.destroyAllWindows()

结果展示:

OpenCV学习笔记15-目标跟踪算法介绍及实战
OpenCV学习笔记15-目标跟踪算法介绍及实战
OpenCV学习笔记15-目标跟踪算法介绍及实战
附OpenCV目录:OpenCV总目录学习笔记

Original: https://blog.csdn.net/weixin_56197703/article/details/124801441
Author: Aaron-ywl
Title: OpenCV学习笔记15-目标跟踪算法介绍及实战

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/6028/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

发表回复

登录后才能评论
免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部