文章目录

  • 一、项目思路
  • 二、问题清单
  • 三、算法详解
    • 3.1、定义目标追踪算法
    • 3.2、初始化追踪器
    • 3.3、更新目标追踪器
    • 3.4、绘制目标矩形框
    • 3.5、人工标注感兴趣目标
      • 3.5.1、标注ROI区域
      • 3.5.2、截取ROI区域
  • 四、项目实战:单目标 - 实时追踪
  • 五、项目实战:多目标 - 实时追踪

多目标 - 实时追踪

一、项目思路

单目标追踪:

  1. 参数设置
  2. 读取视频,读取帧图像
  3. 设置视频保存参数
  4. 手动选择追踪目标
  5. 选择追踪算法
  6. 实例化单目标追踪器
  7. 循环读取帧图像
  8. 矩形框标记目标
  9. 实时更新动态框
  10. 显示图像

多目标追踪:

  1. 参数设置
  2. 构建追踪算法列表
  3. 实例化多目标追踪器
  4. 读取视频
  5. 循环读取帧图像
  6. 对视频进行等比例缩放
  7. 手动选择追踪目标
  8. 矩形框标记目标
  9. 实时更新动态框
  10. 显示图像

二、问题清单

BUG1:module 'cv2' has no attribute 'legacy'

  • 原因:opencv_pythonopencv_contrib-python 的版本不一致问题
  • 解决:安装与opencv_python相同版本的opencv_contrib-python。参考文献

BUG2:module 'cv2' has no attribute 'TrackerCSRT_create'

  • 原因:新版本的opencv_contrib-python中,一些函数被取消。
  • 解决:通过cv2.legacy来调用这些函数。如:将cv2.TrackerBoosting_create改为cv2.legacy.TrackerBoosting_create。参考文献

机器学习进阶-目标跟踪-KCF目标跟踪方法
计算机视觉项目-实时目标追踪

三、算法详解

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

3.1、定义目标追踪算法

定义不同的目标追踪算法(不含深度学习):

7+1种目标追踪算法 函数 说明
BOOSTING Tracker cv2.legacy.TrackerBoosting_create 算法原理类似于Harr cascdes(AdaBoost),是一种很老的算法。速度慢并且不准。(最低支持OpenCV 3.0.0)
MIL Tracker cv2.legacy.TrackerMIL_create 比BOOSTING更精确,但是失败率比较高。(最低支持OpenCV 3.0.0)
KCF Tracker cv2.legacy.TrackerKCF_create 速度比BOOSTING和MIL更快,与BOOSTING和MIL一样不能很好的处理遮挡问题。
CSRT Tracker cv2.legacy.TrackerCSRT_create 比KCF更准一些,但是速度比KCF慢。(最低支持OpenCV 3.4.2)
TLD Tracker cv2.legacy.TrackerTLD_create 在多帧遮挡下效果最好。但是TLD的误报非常多。(最低支持OpenCV 3.0.0)
MedianFlow cv2.legacy.TrackerMedianFlow_create 出色的跟踪故障报告。当运动是可预测的并且没有遮挡时,效果非常好,但是对于快速跳动或快速移动的物体,模型会失效。(最低支持OpenCV 3.0.0)
MOSSE Tracker cv2.legacy.TrackerMOSSE_create 速度真心快,但是不如CSRT和KCF的准确率那么高,如果追求速度选它准没错。(最低支持OpenCV 3.4.1)
GOTURN Tracker 这是OpenCV中唯一一深度学习为基础的目标检测器。它需要额外的模型才能运行。(最低支持OpenCV 3.2.0)

3.2、初始化追踪器

trackers = cv2.legacy.MultiTracker_create()        # 使用多目标追踪器
tracker = cv2.legacy.TrackerCSRT_create()       # 使用csrt追踪算法

3.3、更新目标追踪器

函数说明:success, boxes = trackers.update(frame)
输入参数:        frame:       传入的图像
输出参数:        success: 是否追踪成功boxes:     追踪到的目标框

3.4、绘制目标矩形框

(x, y, w, h) = [int(ii) for ii in boxes]                       # 获取目标位置
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)     # 矩形框标出动态目标
cv2.imshow('frame', frame)                                        # 实时显示追求目标

3.5、人工标注感兴趣目标

函数说明:[min_x, min_y, w, h] = cv2.selectROI(windowName, img, showCrosshair, fromCenter)
输入参数:windowName:      选择的区域被显示在的窗口的名字img:              要在什么图片上选择ROIshowCrosshair:       是否在矩形框里画十字线,默认为True。fromCenter:        是否是从矩形框的中心开始画,默认为False。
输出参数:min_x               为矩形框中最小的x值,左上角min_y              为矩形框中最小的y值,左上角w                  为这个矩形框的宽h                   为这个矩形框的高
# 备注:选好区域后,按空格或者Enter完成选择;换区域的时候直接通过鼠标重新选择即可

3.5.1、标注ROI区域

import cv2
image = cv2.imread('blank_write.jpg')
im = cv2.selectROI(windowName='img', img=image, showCrosshair=False, fromCenter=False)
print(im)
cv2.waitKey(1)

3.5.2、截取ROI区域

import cv2
image=cv2.imread('blank_write.jpg')
im = cv2.selectROI(windowName='img', img=image, showCrosshair=True, fromCenter=False)
print(im)
img_roi = image[int(im[1]):int(im[1]+im[3]), int(im[0]):int(im[0]+im[2])]
cv2.imshow("imageHSV",img_roi)
cv2.waitKey(0)

四、项目实战:单目标 - 实时追踪

import cv2# 设置参数
video_load_path = r'C:\Users\my\Videos\football.mp4'      # 视频存放地址
video_save_path = r'C:\Users\my\Videos\football2.mov'     # 视频存放地址if __name__ == '__main__':cap = cv2.VideoCapture(video_load_path)           # 读取视频流ret, frame = cap.read()                           # 读取帧图像frame_width = int(cap.get(3))                 # 获取图像宽,并转换为整数frame_height = int(cap.get(4))                   # 获取图像高,并转换为整数# 创建保存视频的对象(设置编码格式,帧率,图像的宽高等)out = cv2.VideoWriter(video_save_path, cv2.VideoWriter_fourcc('D', 'I', 'V', 'X'), 10, (frame_width, frame_height))bbox = cv2.selectROI('frame', frame, fromCenter=False, showCrosshair=True)       # 人工标注感兴趣目标tracker = cv2.legacy.TrackerCSRT_create()     # 使用csrt算法tracker.init(frame, bbox)                      # 初始化trackerwhile True:_, frame = cap.read()                        # 读取帧图像if frame is None:                         # 如果读到的帧数不为空,则继续读取;如果为空,则退出。breakbool_para, box = tracker.update(frame)      # 由于物体运动,需要动态的根据物体运动更新矩形框if bool_para:                              # 若读取成功,我们就定位画框,并跟随(x, y, w, h) = [int(ii) for ii in box]cv2.rectangle(frame, pt1=(int(x),int(y)), pt2=(int(x)+int(w), int(y)+int(h)), color=(0, 255, 0), thickness=2)cv2.imshow('frame', frame)                # 实时显示追求目标out.write(frame)                      # 将每一帧图像写入到输出文件中# 使用 waitKey 可以控制视频的播放速度。数值越小,播放速度越快。if cv2.waitKey(1) == ord(' '):    # ord(' '): 按空格结束breakcap.release()              # 释放摄像头out.release()                # 释放摄像头cv2.destroyAllWindows()      # 摧毁所有图窗

五、项目实战:多目标 - 实时追踪

import argparse
import cv2# (1)参数设置(视频存放地址 + 指定追踪器类型)
ap = argparse.ArgumentParser()
ap.add_argument('-v', '--video', type=str, default='01.mp4', help='path to input video file')
ap.add_argument('-t', '--tracker', type=str, default='kcf', help='Opencv object tracker type')
args = vars(ap.parse_args())# (2)构造Opencv的追踪算法列表
OPENCV_OBJECT_TRACKERS = {"csrt": cv2.legacy.TrackerCSRT_create,"kcf": cv2.legacy.TrackerKCF_create,"boosting": cv2.legacy.TrackerBoosting_create,"mil": cv2.legacy.TrackerMIL_create,"tld": cv2.legacy.TrackerTLD_create,"medianflow": cv2.legacy.TrackerMedianFlow_create,"mosse": cv2.legacy.TrackerMOSSE_create
}# (3)实例化多目标追踪器
trackers = cv2.legacy.MultiTracker_create()# (4)读取视频
vs = cv2.VideoCapture(args['video'])while True:# (5)读取帧图像frame = vs.read()      # frame=[bool, data]frame = frame[1]     # 获取帧图像# 若视频播放结束,则跳出if frame is None:break# (6)使用cv2.resize对图像进行长宽的放缩操作h, w = frame.shape[:2]         # 获取帧图像的高宽width = 300                      # 视频缩放到指定大小r = width / float(w)         # 缩放比例dim = (width, int(r * h))        # 缩放后的尺寸frame = cv2.resize(frame, dim, cv2.INTER_AREA)# (7)由于物体运动,需要根据物体的动态运动更新矩形框(success, boxes) = trackers.update(frame)# (8)循环多组矩形框,进行画图操作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)       # 矩形框标出动态目标# (9)显示图像cv2.imshow('Frame', frame)# (10)英文输入下:先按s暂停视频,然后手动选择一个区域,最后按空格键开始播放(可多次重复操作,添加多个追踪目标)key = cv2.waitKey(100) & 0xffif key == ord('s'):box = cv2.selectROI('Frame', frame, fromCenter=False, showCrosshair=True)tracker = OPENCV_OBJECT_TRACKERS[args['tracker']]()      # 创建追踪器trackers.add(tracker, frame, box)                      # 添加追踪器elif key == 27:breakvs.release()
cv2.destroyAllWindows()

【Opencv项目实战】目标追踪:实时追踪人工标注的多个目标相关推荐

  1. Opencv项目实战:14 手势控制音量

    目录 0.项目介绍 1.项目展示 2.项目搭建 3.项目的代码与讲解 4.项目资源 5.项目总结 0.项目介绍 本篇与上一篇有很多联系,大家可以看看这篇Opencv项目实战:13 手部追踪,我们将根据 ...

  2. 基于C++的OpenCV项目实战——文档照片转换成扫描文件

    基于C++的OpenCV项目实战--文档照片转换成扫描文件 一.背景 前段时间都是基于Python的OpecCV进行一些学习和实践,但小的知识点并没有应用到实际的项目中:并且基于Python的版本的移 ...

  3. 【Opencv项目实战】背景替换:动态背景移除与替换(cvzone+MediaPipe)

    文章目录 一.项目思路 二.环境布置 2.1.cvzone安装 2.2.MediaPipe安装 2.3.常见问题 2.4.注意事项 三.算法详解 3.1.segmentor.removeBG():去除 ...

  4. Opencv项目实战-信用卡数字识别

    Opencv项目实战:信用卡数字识别 导入库,定义展示函数 import cv2 import numpy as np from imutils import contours import myut ...

  5. 自动驾驶系统进阶与项目实战(十)基于PointPillars的点云三维目标检测和TensorRT实战(1)

    自动驾驶系统进阶与项目实战(十)基于PointPillars的点云三维目标检测和TensorRT实战(1) 发表于CVPR2019的PointPillars是目前比较受业内认可的激光雷达三维检测算法, ...

  6. Opencv项目实战:基于dlib的疲劳检测

    文章目录 一.项目简介 二.算法原理 三.环境配置 3.1.dlib人脸检测器:dlib.get_frontal_face_detector() 3.2.dlib关键点定位工具:shape_predi ...

  7. Spark项目实战:大数据实时流处理日志(非常详细)

    实战概览 一.实战内容 二.大数据实时流处理分析系统简介 1.需求 2.背景及架构 三.实战所用到的架构和涉及的知识 1.后端架构 2.前端框架 四.项目实战 1.后端开发实战 1.构建项目 2.引入 ...

  8. 【项目实战】YOLOV5 +实时吸烟目标检测+手把手教学+开源全部

    本原创项目长期更新,旨在完成校园异常行为实时精检测,做到集成+N次开发+优化(不止局限于调包)为止,近期将不断更新以下模型+数据+标注文件+教程.关注博主,Star 一下github,一起开始美妙的目 ...

  9. PYQT5+openCV项目实战:微循环仪图片、视频记录和人工对比软件(附源码)

    文章目录 1.主要功能 1.1主界面说明 1.2回查记录界面说明 2.主界面功能详解 2.1 摄像头操作 2.2拍照功能 2.3保存图片 2.4录制短视频 2.5查看记录 2.6新建名称 3.子界面功 ...

最新文章

  1. 修改hosts文件不需要重启的方法
  2. include、ViewStub、merge优化布局标签
  3. Memcached入门指南
  4. (6)css常用样式属性--文字样式
  5. 运行github上的Vue项目
  6. rc.local文件开机不执行
  7. CSS列表样式(源码示例)
  8. 用Python计算北京地铁的两站间最短换乘路线
  9. C# 网易云音乐API 多达100+ 支持登录,无损下载
  10. 相机对焦和调焦距的区别是什么 ?
  11. 【C++】Vscode 中使用CMakeLists(推荐)构建C++项目:项目结构、各个文件夹的作用、从编码到debug
  12. @Param注解的用法
  13. 怎么用手机拍摄制作视频
  14. 如何成为一个区块链开发人员_成为开发人员是社会工作
  15. 上海喔趣科技有限公司面经 Java实习生(记录第一次面试)已oc
  16. linux添加mx25l25645g,stm32驱动NOR Flash 之MX25L51245G(64MB)
  17. 管理学经典故事-(2)
  18. 叶绿体基因组组装方法
  19. 从0开始学杂项 第二期:隐写分析(1) 直接附加
  20. vue 返回上一页 带参数

热门文章

  1. JavaScript实现飞机大战
  2. CSS学习------强制换行与不换行
  3. 在线测试音视频资源分享
  4. 清明培训 清北学堂 DAY1
  5. Python车道线检测模块
  6. 菜鸟学习----前端vue.js学习01
  7. 开普勒云平台:9个示例解析如何安装依赖
  8. 用1000字来详细描述一下如何解决目前物联网与信息化方向的设备标准不统一的问题...
  9. Android实现客制化系统apk在线签名
  10. 操作系统-并发控制原理及其实现