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

news2025/1/19 14:57:14

文章目录

  • 物体跟踪
    • 一、跟踪器
    • 二、代码实现
      • 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为True
    if not ret:
        print("不能读取摄像头")
        break
    frame = 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) # 是否显示十字准星
    # 初始化跟踪器,传入当前帧和选定的ROI
    tracker.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为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跟踪器对移动的目标进行跟踪。

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

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

相关文章

Nvidia Jetson Orin平台部署CenterPoint模型

最近尝试将CenterPoint模型部署到Orin平台,网络上教程很多,也很杂乱,于是便整理一版自用。 主要根据NVIDIA Lidar AI Solution进行复现。并在此基础上进行补充 Orin平台: python:3.8 CUDA:11.4 torch:1.14.0 torchvision:0.15.1 TensorRT: 8.5.2.1 在Compile &&a…

第十九篇——复盘:数学给了我什么启示?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 数学带给这个世界什么?数学在我们的人生路上意味着什么&#…

Arthas 介绍,阿里开源线上JVM性能监控工具

1.官网 https://arthas.aliyun.com/ arthas (aliyun.com) Arthas 是一款由阿里巴巴开发并开源的 Java 应用诊断工具,主要用于帮助开发人员实时监控、诊断和调优 Java 应用程序。这款工具对于处理复杂的生产环境问题特别有效,尤其在定位那些难以复现的…

面网易后台开发居然遇到了一个困难难度算法题

在提供面经的同学中,竟然有同学在面试网易后台研发的时候遇到了一道困难难度的算法题。 一般来说,大多数面试的算法题都是以中等难度为主,遇到困难难度的算法题也许是公司现在不缺人、也许是在选拔人才、当然也很可能是面试官其实并不想要你…

基于LSTM-Transformer混合模型实现股票价格多变量时序预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…

【WRF工具】服务器上安装convert_geotiff

【WRF工具】服务器上安装convert_geotiff convert_geotiff简介方法1:下载安装包后下载convert_geotiff依赖库安装库1:libtiff库2:sqlite库3:curl库4:projcmake更新(可选)库5:geotiff…

mysql--表的约束

目录 理解表的约束和操作 如何理解? 1、空属性null 2、默认值default 3、列描述comment 4、自动填充zorefill 5、主键primary key (1)创建表时指定可以 (2)创建表后指定key (3)删除主…

Cocos Creator导出obj文件用于后端寻路

Cocos Creator 3.8.0 用这个扩展插件 【杨宗宝】两年前写的网格工具,今天将它开源了。 - Creator 3.x - Cocos中文社区carlosyzy_extensions_mesh: Cocos Creator 3.x mesh插件,负责网格数据的导出。合并,拆封等一系列操作 (gitee.com) 下…

Avalonia开发实践(四)——关于Setter优先级的问题

首先看一段样例代码&#xff1a; <StackPanel Orientation"Horizontal" Spacing"50" HorizontalAlignment"Center"><StackPanel.Styles><Style Selector"Button.default"><Setter Property"Background&quo…

健身俱乐部预约报名系统

这个是我新开发搭建的健身俱乐部行业的预约报名系统。 首页 焦点图大图展示 右侧联系栏目 关于我们 底部版权信息 在线咨询 一键拨号 添加微信 转发分享 预约来校 专业资质 室内环境相册 教练名片列表 教练名片详情 关于我 联系我 分享给好友 课程介绍 保存到通讯录 行业新闻 …

Vue3概述

1. Vue3概述 1.1 Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece。 1.2 vite简介 vite是新一代前端构建工具&#xff0c;官网地址&#xff1a;Vite中文网。 1.3 Vue2和Vue3区别 Vue2的API设计是Options&#xff08;配置&…

模拟设计工程师必知必会:一文讲透PLL学习重点

在模拟设计中&#xff0c;相位锁定环&#xff08;PLL&#xff09;是一种极其重要的技术。它在频率合成、时钟恢复、数据同步等多个方面发挥着关键作用。作为一名模拟设计工程师&#xff0c;对PLL的深入理解和熟练应用是必不可少的。本文将通过移知公开课《模拟设计工程师必知必…

QD1-P32 CSS 边框属性(3)padding(元素的内边距)

本节学习&#xff1a;CSS padding属性&#xff08;元素的内边距&#xff09; 本节视频 https://www.bilibili.com/video/BV1n64y1U7oj?p32 ‍ padding 属性的用途 ​​ ‍ 在CSS中&#xff0c;padding​ 属性用于设置元素内部的空间&#xff0c;即在元素内容和其边界&…

用html、css和js来实现冒泡排序

效果图如下 代码如下 <meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>冒泡排序动画</title><style>body {display: flex;flex-direction: column;justify-con…

【Redis】zset有序集合的常见命令

zset是一个有序集合&#xff0c;有着set的特点&#xff0c;还引入了排序。每个元素额外会有一个分数(score)&#xff0c;元素不可重复&#xff0c;但是分数可以重复。排序以分数为主&#xff0c;如果分数相同&#xff0c;则按元素字典序。 推荐启动服务器时使用该命令&#x…

并发编程-CompletableFuture

并发编程-CompletableFuture 本篇主要讲述 JDK1.8 里面 CompletableFuture 的原理与源码分析。这一篇暂且作为整个章节的最后一篇(若有时间继承增加关于并发编程的其他内容)。闲话少叙&#xff0c;进入正题。在深入了解 CompletableFuture 之前我们先要看一下 Future&Call…

给自己气笑了

正如你所见这是AC代码&#xff0c;我也一直坚信&#xff0c;我调了一个早上一直给我报语法错误 我今天一直在想这个问题&#xff0c;为什么会语法错误&#xff0c;我想了很多很多&#xff0c;军训的时候我一直在想这个事情。 因为我坚信我的逻辑是正确的&#xff0c;不调出来…

JFinalcms代码审计

JFinalCms是开源免费的JAVA企业网站开发建设管理系统&#xff0c;极速开发&#xff0c;动态添加字段&#xff0c;自定义标签&#xff0c;动态创建数据库表并crud数据&#xff0c;数据库备份、还原&#xff0c;动态添加站点(多站点功能)&#xff0c;一键生成模板代码。 环境布置…

管家婆-本地化-重装数据库导入数据库mdf——未来之窗数据恢复专家

一、进入数据库管理软件 二、数据附加 三、选择文件mdf 四、错误处理 关闭管家婆和数据库服务重启 五、确定文件 六、确认附加 七、替换管家婆账套 八、阿雪技术观 拥抱开源与共享&#xff0c;见证科技进步奇迹&#xff0c;畅享人类幸福时光&#xff01; 让我们积极投身于技术…

boost函数对象

文章目录 bindref函数FunctionLambda 本章介绍的是函数对象&#xff0c;可能称为’高阶函数’更为适合。 它实际上是指那些可以被传入到其它函数或是从其它函数返回的一类函数。 在C中高阶函数是被实现为函数对象的&#xff0c;所以这个标题还是有意义的。 bind 和C中的 std::…