【进阶OpenCV】 (13)--视频物体跟踪

news/2024/10/15 9:33:45/

文章目录

  • 物体跟踪
    • 一、跟踪器
    • 二、代码实现
      • 1. 创建CSRT跟踪器实例
      • 2. 打开视频文件
      • 3. 主循环
        • 3.1 读取每一帧
        • 3.2 设置跟踪目标
        • 3.3 更新跟踪器,获取对象位置
        • 3.4 显示视频每一帧
      • 4. 释放资源和关闭窗口
      • 5. 完整代码展示
  • 总结

物体跟踪

本篇我们来介绍,如何对移动的目标进行跟踪。

我们既然要对物体进行跟踪,当然要使用方法,什么方法能够对目标进行跟踪呢?

我们来介绍一下跟踪器:

一、跟踪器

CSRT跟踪器,全称为Channel and Spatial Reliability Tracker,是一种在视频序列中进行目标跟踪的算法实现。CSRT跟踪器能够实时跟踪视频中的目标对象,即使目标对象在视频序列中发生尺度变化、变形或受到遮挡,也能保持稳健的跟踪效果。

  • 定义:CSRT跟踪器是一种基于判别类模型方法中的相关滤波器跟踪算法,它结合了判别相关滤波器(DCF)和通道与空间可靠性图,以提高跟踪的准确性和鲁棒性。
  • 原理:CSRT跟踪器利用图像中的颜色和梯度特征,在空间和通道上进行可靠性估计。它首先通过深度卷积神经网络(CNN)提取图像特征,然后使用这些特征来训练一个分类器,该分类器能够区分目标对象和其他背景。在跟踪过程中,CSRT利用多通道特征(如颜色、纹理)和空间可靠性来提高跟踪的准确性和鲁棒性。此外,它还考虑了目标的尺度变化和变形,使得跟踪更加稳定。

二、代码实现

1. 创建CSRT跟踪器实例

import cv2
# 创建一个CSRT跟踪器实例
tracker = cv2.TrackerCSRT_create()
# 跟踪标志,默认为False
tracking = False

2. 打开视频文件

使用cv2.VideoCapture()函数打开视频文件:

cap = cv2.VideoCapture('video.wmv')

3. 主循环

3.1 读取每一帧
while True:ret, frame = cap.read()  # 如果正确读取,ret为Trueif not ret:print("不能读取摄像头")breakframe = cv2.resize(frame,dsize=None,fx=0.5,fy=0.5)
3.2 设置跟踪目标

检查是否有按键被按下,如果是‘a’健,则设置跟踪标志为True,并选择ROI,然后可在视频中框选矩形区域,锁定目标:

# 检查是否有按键被按下,如果是‘a’健,则设置跟踪标志为True,并选择ROI
if cv2.waitKey(1) == ord('a'):tracking = True# 让用户在当前帧中选择一个矩形区域作为要跟踪的对象roi = cv2.selectROI('Tracking',frame,showCrosshair=False) # 是否显示十字准星# 初始化跟踪器,传入当前帧和选定的ROItracker.init(frame,roi)

在这里插入图片描述

3.3 更新跟踪器,获取对象位置
# 如果跟踪标志为True,则更新跟踪器
if tracking:success,box = tracker.update(frame)# 如果跟踪成功,获取对象的位置if success:x,y,w,h = [int(v) for v in box] # 确保所有坐标都是整数# 在frame上绘制矩形框以显示跟踪结果cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
3.4 显示视频每一帧
# 显示处理后的帧
cv2.imshow('Tracking',frame)
# 检查是否按下了Esc键(ASCII码27),如果按下则退出循环
if cv2.waitKey(100) == 27:break
  • 展示跟踪效果

在这里插入图片描述

在这里插入图片描述

4. 释放资源和关闭窗口

# 释放摄像头资源
cap.release()
# 关闭所有创建的窗口
cv2.destroyAllWindows()

5. 完整代码展示

import cv2
# 创建一个CSRT跟踪器实例
tracker = cv2.TrackerCSRT_create()
# 跟踪标志,默认为False
tracking = False"""-----打开默认摄像头-----"""
cap = cv2.VideoCapture('video.wmv')
while True:ret, frame = cap.read()  # 如果正确读取,ret为Trueif not ret:print("不能读取摄像头")breakframe = cv2.resize(frame,dsize=None,fx=0.5,fy=0.5)# 检查是否有按键被按下,如果是‘a’健,则设置跟踪标志为True,并选择ROIif cv2.waitKey(1) == ord('a'):tracking = True# 让用户在当前帧中选择一个矩形区域作为要跟踪的对象roi = cv2.selectROI('Tracking',frame,showCrosshair=False) # 是否显示十字准星# 初始化跟踪器,传入当前帧和选定的ROItracker.init(frame,roi)# 如果跟踪标志为True,则更新跟踪器if tracking:success,box = tracker.update(frame)# 如果跟踪成功,获取对象的位置if success:x,y,w,h = [int(v) for v in box] # 确保所有坐标都是整数# 在frame上绘制矩形框以显示跟踪结果cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)# 显示处理后的帧cv2.imshow('Tracking',frame)# 检查是否按下了Esc键(ASCII码27),如果按下则退出循环if cv2.waitKey(100) == 27:break
# 释放摄像头资源
cap.release()
# 关闭所有创建的窗口
cv2.destroyAllWindows()

总结

本篇介绍了如何使用CSRT跟踪器对移动的目标进行跟踪。


http://www.ppmy.cn/news/1539371.html

相关文章

八:linux之mysql57读写分离mysql-proxy

linux之mysql57读写分离mysql-proxy 1 https://downloads.mysql.com/archives/proxy/ 去下载或者 https://cdn.mysql.com/archives/mysql-proxy/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz 解压 tar -zxvf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz 2 默…

linux修改mac和ip地址的方法

在 Linux 系统中,你可以通过以下步骤修改 MAC 地址和 IP 地址。 修改 MAC 地址 修改 MAC 地址通常需要管理员权限。以下是修改 MAC 地址的几种方法: 方法一:使用 ip 命令 关闭网络接口: sudo ip link set dev eth0 down其中 et…

【IPv6】IPv6 NAT66介绍

参考链接 IPv6-to-IPv6 Network Address Translation (NAT66) (ietf.org)https://datatracker.ietf.org/doc/id/draft-mrw-nat66-00.html IPv6 NAT66 NAT66,全称为Network Address Translation for IPv6 to IPv6,是一种用于IPv6网络的地址转换技术。在…

Flume面试整理-Flume的基本架构

Apache Flume的基本架构由三个主要组件(Source、Channel、Sink)和一个代理(Agent)组成。Flume的架构设计使其能够高效地从各种来源收集、聚合和传输大量的数据,通常用于大数据环境下的日志和事件数据收集。以下是Flume基本架构的详细描述: 1. Flume的核心组件 1.1 Source…

通俗解释选择、插入和冒泡排序

1. 选择排序(Selection Sort) 选择排序的过程就像我们选最小(或最大)的东西一样。它的操作逻辑是不断从未排序的部分中选出一个最小(或最大)的数,放到前面的已排序部分。想象一下,你…

【Vue】鼠标滚轮横向滚动操作设计

需求&#xff1a; 鼠标滑轮滚动&#xff0c;操作横向滚动条 解决&#xff1a; 监控滚动操作&#xff0c;根据滚动偏移量&#xff0c;修改横向滚动条的位置 <template><div class"image_view"><div class"image_content"><divv-fo…

windows主机重新安装zabbix agent提示please clear the previous agent registration

目录 1. Zabbix Agent1.1 错误提示 2. 解决方法2.1 管理员运行cmd2.2 可以正常安装 1. Zabbix Agent 1.1 错误提示 2. 解决方法 2.1 管理员运行cmd 输入 sc.exe delete “Zabbix Agent” 或者 sc.exe delete “Zabbix Agent 2” 如果成功会出现“[SC] DeleteService SUCCES…

蓝桥杯备赛(c/c++)

排序 9. 实现选择排序 10. 实现插入排序 11. 实现快速排序 12. 实现归并排序 13. 实现基数排序 14. 合并排序数组