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

news2025/7/20 6:49:51

文章目录

  • 一、项目思路
  • 二、问题清单
  • 三、算法详解
    • 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 Trackercv2.legacy.TrackerBoosting_create算法原理类似于Harr cascdes(AdaBoost),是一种很老的算法。速度慢并且不准。(最低支持OpenCV 3.0.0)
MIL Trackercv2.legacy.TrackerMIL_create比BOOSTING更精确,但是失败率比较高。(最低支持OpenCV 3.0.0)
KCF Trackercv2.legacy.TrackerKCF_create速度比BOOSTING和MIL更快,与BOOSTING和MIL一样不能很好的处理遮挡问题。
CSRT Trackercv2.legacy.TrackerCSRT_create比KCF更准一些,但是速度比KCF慢。(最低支持OpenCV 3.4.2)
TLD Trackercv2.legacy.TrackerTLD_create在多帧遮挡下效果最好。但是TLD的误报非常多。(最低支持OpenCV 3.0.0)
MedianFlowcv2.legacy.TrackerMedianFlow_create出色的跟踪故障报告。当运动是可预测的并且没有遮挡时,效果非常好,但是对于快速跳动或快速移动的物体,模型会失效。(最低支持OpenCV 3.0.0)
MOSSE Trackercv2.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:				要在什么图片上选择ROI
				showCrosshair:		是否在矩形框里画十字线,默认为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)						# 初始化tracker
	
	while True:
	    _, frame = cap.read()						# 读取帧图像
		if frame is None:							# 如果读到的帧数不为空,则继续读取;如果为空,则退出。
			break
			
	    bool_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(' '): 按空格结束
			break
	 
	cap.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) & 0xff
    if 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:
        break

vs.release()
cv2.destroyAllWindows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/368772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文教会你如何在Linux系统中使用Docker安装Redis 、以及如何使用可视化工具连接【详细过程+图解】

文章目录1、安装redis2、在外部创建配置文件3、创建redis4、启动测试redis5、数据持久化存储6、使用可视化工具连接redis前言在windows上安装过reids、在linux上也安装过redis,但是都没有docker上安装redis方便。这里给出docer安装redis的相关教程1、安装redis 默认…

Python|Pymol的安装

​Pymol的使用其实可以分为两种,一种是GUI图形操作界面,直接可以去Pymol官网上下,另一种则是使用API的方式直接调用,适合写脚本批量处理一些东西。建议画图,看结构直接用GUI,但是计算RMSD啥的,用…

【OJ】盐荒子孙

📚Description: 盐体图 盐是对人类生存具有重要意义的物质之一。当中国古人从肉食为主转向谷食为主的时候,吃盐的需求就发生了,因为动物血肉里面包含有足够人体所需的盐分,而谷 物本身不包含盐分。在长达几十万年的旧石器时代&…

localStorage和sessionStorage

目录 一、localStorage和SessionStorage在哪里,是什么 二、localStorage和sessionStorage区别 三、localStorage常用方法 四、sessionStorage常用方法 一、localStorage和SessionStorage在哪里,是什么 【1】在浏览器开发者工具的Application栏目里&…

2023年消费电子行业研究报告

第一章 行业概况 消费电子行业是电子信息行业的子行业。消费电子是指围绕着消费者应用而设计的与生活、工作和娱乐息息相关的电子类产品,通常会应用于娱乐、通讯以及文书用途,最终实现消费者自由选择资讯、享受娱乐的目的,主要侧重于个人购买…

Gephi快速入门

Gephi快速入门1. 导入文件(Import file)2. 布局(Layout)3. 排序(Ranking)4. 指标(Metrics)5. 标签(Label)6. 社区发现(Community detection&#…

AI入场,搜索这个“营销枢纽”有新故事吗?

哪里有内容,哪里就有搜索。 以前,互联网离我们生活很远,传统搜索与用户的距离分割,只有当用户想要了解什么,才会去使用。 如今,互联网与真实世界密不可分,加之新技术、新平台的不断涌现&#xf…

Python年利率计算器【N日年化收益率】

现在有闲钱的人,按照聪明等级从低到高排序应该是钱买股票,一年利率约为-20%钱放银行活期,年利率约为0.3%钱放银行定期,一年利率约为1.5%钱放余额宝(支付宝)或零钱通(微信)&#xff0…

ChatGPT和Web3:人工智能如何帮助您建立和发展您的 Web3 公司

ChatGPT是OpenAI在2022年11月推出的聊天机器人。该机器人建立在OpenAI的GPT-3人工智能家族上,并通过监督学习和强化学习技术进行了优化。 与ChatGPT机器人聊天时,你会感觉自己在与一个懂得一切并以非常教育性的方式回答的朋友交谈。回答在许多知识领域非…

文件上传+easyExcel

文章目录需求描述实现0、依赖1、编写配置类2、文件上传工具类3、编写Controller4、编写Service5、编写excel对应的类6、创建easyExcel的监听器7、最终效果需求描述 页面中当用户将excel表格上传到服务器后,将该excel文件保存在本地然后在服务器中将excel中的数据读取…

预编译(回顾)

浏览器运行机制变量提升机制私有变量提升步骤全局对象 GO 和全局变量对象 VO的区别带var和不带var的区别系统输出顺序变量提升在条件判断下的处理防止函数的变量提升 浏览器运行机制 为了能够让代码执行,浏览器首先会形成一个执行环境栈 ECStack(Execution Contex…

15- 答题卡识别及分数判定项目 (OpenCV系列) (项目十五)

项目要点 图片读取 : img cv2.imread(./images/test_01.png)灰度图: gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)高斯模糊: blurred cv2.GaussianBlur(gray, (5, 5), 0) # 去噪点边缘检测: edged cv2.Canny(blurred, 75, 200)检测轮廓: cnts cv2.findContours(e…

Ai作画studio环境布置

大家好,今天跟大家介绍如何用stable diffusion webui布置自己的Ai作画工作环境。这部分主要就是实操,没有太多理论知识介绍。跟着做就好了,当成是一次计算机实验上机课就好基础环境布置这次开发环境选择的是AutoDL的GPU云环境,链接…

ros下用kinectv2运行orbslam2

目录 前提 创建工作空间 orbslam2源码配置、测试: 配置usb_cam ROS功能包 配置kinect 前提 vim 、 cmake 、 git 、 gcc 、 g 这些一般都装了 主要是Pangolin 、 OpenCV 、 Eigen的安装 18.04建议Pangolin0.5 创建工作空间 我们在主目录下创建一个catkin_…

听车企做开发朋友说,面试Framework 必问~

近期听在车企工作的朋友说,今年去他们公司面试的人比往年增长了30%左右,但实际面试达到标准的人屈指可数,大多都是从 Android 开发方向转过来的。 车企招聘要求有哪些? 每个车企因为业务部门的不同,他们的要求也会有…

Tapdata Connector 实用指南:实时数仓场景之数据实时同步至 ClickHouse

【前言】作为中国的 “Fivetran/Airbyte”, Tapdata 是一个以低延迟数据移动为核心优势构建的现代数据平台,内置 60 数据连接器,拥有稳定的实时采集和传输能力、秒级响应的数据实时计算能力、稳定易用的数据实时服务能力,以及低代码可视化操作…

搭建直播平台服务器什么配置最合适?直播平台专用服务器(驰网i9-13900k服务器)

如今,视频直播越来越受欢迎,视频和直播平台也越来越多,直播平台和视频网站都需要更好的服务器来支持。那么,视频直播平台需要什么服务器呢?以一个简单的直播网站为例。如果每天在线人数约1000人,同时在线人…

Win10 22H2 19045.2670系统原版镜像

相比以前系统,修复了如下KB5022906 修复了诸多问题,IT之家将官方更新日志翻译如下:修复了在 Microsoft Excel 中无法打开超链接的问题修复了影响 Appx 状态存储库的问题。在用户删除用户配置文件后,相关清理工作未能妥善完成&…

【nohup引发磁盘读写高】nohup命令导致服务器磁盘读写占满该如何修复?

【写在前面】自己在跑一个项目的时候,猛然发现服务器挂了,直接访问不了,呈现出一种卡死现象,我当时都懵了,难道阿里在后端升级,也不会选择在工作日的时间升级吧,于是乎就咨询了一下客服。才有下…

【项目精选】jsp码头船只出行及配套货柜码放管理系统的设计与实现(视频+源码+论文)

点击下载源码 jsp码头船只出行及配套货柜码放管理系统主要用于实现高校在线考试,基本功能包括:用户登录、修改个人信息、查看码头信息;系统管理人员管理;船只信息管理;船只路线信息管理;货柜信息管理等。本…