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

文章目录

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

物体跟踪

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

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

我们来介绍一下跟踪器:

一、跟踪器

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

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

二、代码实现

1. 创建CSRT跟踪器实例

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

2. 打开视频文件

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

python 复制代码
cap = cv2.VideoCapture('video.wmv')

3. 主循环

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

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

python 复制代码
# 检查是否有按键被按下,如果是'a'健,则设置跟踪标志为True,并选择ROI
if cv2.waitKey(1) == ord('a'):
    tracking = True
    # 让用户在当前帧中选择一个矩形区域作为要跟踪的对象
    roi = cv2.selectROI('Tracking',frame,showCrosshair=False) # 是否显示十字准星
    # 初始化跟踪器,传入当前帧和选定的ROI
    tracker.init(frame,roi)
3.3 更新跟踪器,获取对象位置
python 复制代码
# 如果跟踪标志为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 显示视频每一帧
python 复制代码
# 显示处理后的帧
cv2.imshow('Tracking',frame)
# 检查是否按下了Esc键(ASCII码27),如果按下则退出循环
if cv2.waitKey(100) == 27:
    break
  • 展示跟踪效果

4. 释放资源和关闭窗口

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

5. 完整代码展示

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

"""-----打开默认摄像头-----"""
cap = cv2.VideoCapture('video.wmv')
while True:
    ret, frame = cap.read()  # 如果正确读取,ret为True
    if not ret:
        print("不能读取摄像头")
        break
    frame = cv2.resize(frame,dsize=None,fx=0.5,fy=0.5)
    # 检查是否有按键被按下,如果是'a'健,则设置跟踪标志为True,并选择ROI
    if cv2.waitKey(1) == ord('a'):
        tracking = True
        # 让用户在当前帧中选择一个矩形区域作为要跟踪的对象
        roi = cv2.selectROI('Tracking',frame,showCrosshair=False) # 是否显示十字准星
        # 初始化跟踪器,传入当前帧和选定的ROI
        tracker.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跟踪器对移动的目标进行跟踪。

相关推荐
sp_fyf_20245 分钟前
【大语言模型】ACL2024论文-35 WAV2GLOSS:从语音生成插值注解文本
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·数据挖掘
AITIME论道6 分钟前
论文解读 | EMNLP2024 一种用于大语言模型版本更新的学习率路径切换训练范式
人工智能·深度学习·学习·机器学习·语言模型
明明真系叻1 小时前
第二十六周机器学习笔记:PINN求正反解求PDE文献阅读——正问题
人工智能·笔记·深度学习·机器学习·1024程序员节
88号技师3 小时前
2024年12月一区SCI-加权平均优化算法Weighted average algorithm-附Matlab免费代码
人工智能·算法·matlab·优化算法
IT猿手3 小时前
多目标应用(一):多目标麋鹿优化算法(MOEHO)求解10个工程应用,提供完整MATLAB代码
开发语言·人工智能·算法·机器学习·matlab
88号技师3 小时前
几款性能优秀的差分进化算法DE(SaDE、JADE,SHADE,LSHADE、LSHADE_SPACMA、LSHADE_EpSin)-附Matlab免费代码
开发语言·人工智能·算法·matlab·优化算法
2301_764441333 小时前
基于python语音启动电脑应用程序
人工智能·语音识别
HyperAI超神经3 小时前
未来具身智能的触觉革命!TactEdge传感器让机器人具备精细触觉感知,实现织物缺陷检测、灵巧操作控制
人工智能·深度学习·机器人·触觉传感器·中国地质大学·机器人智能感知·具身触觉
galileo20163 小时前
转化为MarkDown
人工智能
一勺汤3 小时前
YOLO11改进-注意力-引入多尺度卷积注意力模块MSCAM
yolo·目标检测·计算机视觉·改进·魔改·yolov11·yolov11改进