当前位置: 首页 > news >正文

OpenCV实现目标追踪

目录

准备工作

语言:

软件包:

效果演示

代码解读

(1)导入OpenCV库

(2)使用 cv2.VideoCapture 打开指定路径的视频文件

(3)使用 vid.read() 读取视频的第一帧,ret 表示是否成功读取,fr 包含实际的视频帧

(4)弹出一个窗口,然后我们通过拖动鼠标选择需要跟踪的区域(ROI)。选择的ROI作为一个元组(initial_box)返回,表示对象跟踪的初始边界框

(5)创建一个KCF(Kernelized Correlation Filters)跟踪器,并使用初始边界框在第一帧上初始化

(6)获取视频的原始帧率,然后计算等待时间,确保每秒有 original_fps 帧

(7)开始一个循环,读取视频的每一帧,如果没有更多的帧可读,退出循环

(8)使用跟踪器更新并跟踪对象。如果跟踪成功,获取边界框的坐标,然后在当前帧上绘制一个矩形

(9)在窗口中显示带有跟踪结果的当前帧,然后等待 wait_time 毫秒。

(10)按下 'q' 键,退出循环,退出程序

(11)循环结束后,释放视频捕获对象和关闭所有OpenCV窗口

总体代码

总结


        最近有一直在玩无人机,但是局限于财力买的是很入门的款式,然后我也关注过更高级的无人机,例如大疆的mini4pro,他们有一个功能是选取视频中的框然后就可以实时的跟踪锁定这一个物体,例如跟车或者跟随人物等更加的有利于航拍。

        那么我虽然开发不了一个能集成到无人机飞控系统中的这样的软件,我就在思考能不能做一个小程序可以实时框选目标然后跟踪它。


准备工作

语言:

        在使用的语言之中我采用了Python来进行实现,因为Python的软件包是实在是很多,例如我们这次的程序就需要用到这个东西。

软件包:

        这次的程序和我之前的OpenCV程序比起来要简单很多,只使用了CV2也就是OpenCV这么一个软件包。


效果演示


代码解读

(1)导入OpenCV库

import cv2

(2)使用 cv2.VideoCapture 打开指定路径的视频文件

# 打开视频文件
vid = cv2.VideoCapture("D:\\Dji\\00002\\DJI_0029.MP4")

(3)使用 vid.read() 读取视频的第一帧,ret 表示是否成功读取,fr 包含实际的视频帧

# 读取第一帧
ret, fr = vid.read()

(4)弹出一个窗口,然后我们通过拖动鼠标选择需要跟踪的区域(ROI)。选择的ROI作为一个元组(initial_box)返回,表示对象跟踪的初始边界框

# 选择初始边界框
initial_box = cv2.selectROI("Select ROI", fr, fromCenter=False, showCrosshair=True)

(5)创建一个KCF(Kernelized Correlation Filters)跟踪器,并使用初始边界框在第一帧上初始化

# 初始化跟踪器
tracker = cv2.TrackerKCF_create()
tracker.init(fr, initial_box)

(6)获取视频的原始帧率,然后计算等待时间,确保每秒有 original_fps

# 获取视频的原始帧率
original_fps = vid.get(cv2.CAP_PROP_FPS)
wait_time = int(1000 / original_fps) if original_fps > 0 else 1  # 计算等待时间,确保每秒有 original_fps 帧

(7)开始一个循环,读取视频的每一帧,如果没有更多的帧可读,退出循环

while True:# 读取视频帧ret, fr = vid.read()if not ret:break

(8)使用跟踪器更新并跟踪对象。如果跟踪成功,获取边界框的坐标,然后在当前帧上绘制一个矩形

    # 进行跟踪(success, box) = tracker.update(fr)if success:(x, y, w, h) = [int(v) for v in box]cv2.rectangle(fr, (x, y), (x + w, y + h), (255, 255, 0), 1)

(9)在窗口中显示带有跟踪结果的当前帧,然后等待 wait_time 毫秒。

        为什么这里要等待,因为如果不等待的话视频的播放速度就是根据你的电脑的性能,一般都会导致视频加速。

    # 显示跟踪结果cv2.imshow("Output Frame", fr)key = cv2.waitKey(wait_time) & 0xFF

(10)按下 'q' 键,退出循环,退出程序

    # 按下 'q' 键退出循环if key == ord('q'):break

(11)循环结束后,释放视频捕获对象和关闭所有OpenCV窗口

# 释放资源
vid.release()
cv2.destroyAllWindows()

总体代码

import cv2# 打开视频文件
vid = cv2.VideoCapture("D:\\Dji\\00002\\DJI_0029.MP4")# 读取第一帧
ret, fr = vid.read()# 选择初始边界框
initial_box = cv2.selectROI("Select ROI", fr, fromCenter=False, showCrosshair=True)# 初始化跟踪器
tracker = cv2.TrackerKCF_create()
tracker.init(fr, initial_box)# 获取视频的原始帧率
original_fps = vid.get(cv2.CAP_PROP_FPS)
wait_time = int(1000 / original_fps) if original_fps > 0 else 1  # 计算等待时间,确保每秒有 original_fps 帧while True:# 读取视频帧ret, fr = vid.read()if not ret:break# 进行跟踪(success, box) = tracker.update(fr)if success:(x, y, w, h) = [int(v) for v in box]cv2.rectangle(fr, (x, y), (x + w, y + h), (255, 255, 0), 1)# 显示跟踪结果cv2.imshow("Output Frame", fr)key = cv2.waitKey(wait_time) & 0xFF# 按下 'q' 键退出循环if key == ord('q'):break# 释放资源
vid.release()
cv2.destroyAllWindows()

总结

ヾ( ̄▽ ̄)Bye~Bye~

相关文章:

OpenCV实现目标追踪

目录 准备工作 语言: 软件包: 效果演示 代码解读 (1)导入OpenCV库 (2)使用 cv2.VideoCapture 打开指定路径的视频文件 (3)使用 vid.read() 读取视频的第一帧,ret…...

【剑指offer--C/C++】JZ6 从尾到头打印链表

一、题目 二、本人思路及代码 直接在链表里进行翻转不太方便操作,但是数组就可以通过下标进行操作,于是, 思路1、 先遍历链表,以此存到vector中,然后再从后往前遍历这vector,存入到一个新的vector,就完成…...

算法-买卖股票的最佳时机

1、题目来源 121. 买卖股票的最佳时机 - 力扣(LeetCode) 2、题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖…...

【大数据】Flink SQL 语法篇(十):EXPLAIN、USE、LOAD、SET、SQL Hints

《Flink SQL 语法篇》系列,共包含以下 10 篇文章: Flink SQL 语法篇(一):CREATEFlink SQL 语法篇(二):WITH、SELECT & WHERE、SELECT DISTINCTFlink SQL 语法篇(三&…...

Java中List接口常见的实现类

目录 ArrayList实现类 数据存储 构造器 成员方法:CRUD Vector实现类 数据存储 构造器方法 成员方法 LinkedList实现类 数据存储 构造器方法 成员方法CRUD List总结 ArrayList:数组实现,随机访问速度快,增删慢&#x…...

SPI通信

SPI通信: 四根通信线:SCK,MOSI,MISO,SS(从机选择线) 同步时钟,全双工 支持总线挂载多个设备,一主多从 SPI相对IIC传输更快,最简单,最快速 SPI没有接收和应答机制,发送就发…...

【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 数论 区间合并 LeetCode3041. 修改数组后最大化数组中的连续元素数目 给你一个下标从 0 开始只包含 正 整数的数组 nums 。 一开始,你可以将数组中 任意数量 元素增加 至多 1 。 修改后,你可以从…...

字节后端实习 一面凉经

心脏和字节永远都在跳动 深圳还有没有大厂招后端日常实习生啊,求捞~(boss小公司也不理我) 很纠结要不要干脆直接面暑期实习,又怕因为没有后端实习经历,面不到大厂实习。死锁了...

倒计时37天

复习1001. 马走日问题: 1.P1002 [NOIP2002 普及组] 过河卒 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) //日常碎碎念:谁懂啊,dev突然不能用了,也不知道是哪里出了问题下了五六次都不能用,,,找远程安…...

【计算机考研】考408,还是不考408性价比高?

首先综合考虑,如果其他科目并不是很优秀,需要我们花一定的时间去复习,408的性价比就不高,各个科目的时间互相挤压,如果备考时间不充裕,考虑其他专业课也未尝不可。 复习408本来就是费力不讨好的事情 不同…...

测试入门篇

测试: 这里写目录标题 测试:基础概念:BUG:创建一个合理的bug:bug 的级别:跟开发争执如何解决: 测试用例:编写测试用例的万能公式:案例: 登录功能的测试:设计测试用例的方法: 进阶篇(主要介绍测试方法):自动化测试:自动化测试的分类:selenium( web 自动化测试工具 )环境部署:什么…...

b站小土堆pytorch学习记录—— P25-P26 网络模型的使用和修改、保存和读取

文章目录 一、修改1.方法2.代码 二、保存和读取1.方法2.代码(1)保存(2)加载 3.陷阱 一、修改 1.方法 add_module(name: str, module: Module) -> None name 是要添加的子模块的名称。 module 是要添加的子模块。 调用 add_m…...

[数据结构]OJ用队列实现栈

225. 用队列实现栈 - 力扣(LeetCode) 官方题解:https://leetcode.cn/problems/implement-stack-using-queues/solutions/432204/yong-dui-lie-shi-xian-zhan-by-leetcode-solution/ 首先我们要知道 栈是一种后进先出的数据结构&#xff0c…...

「优选算法刷题」:最长回文子串

一、题目 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba"…...

Java项目:41 springboot大学生入学审核系统的设计与实现010

作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本大学生入学审核系统管理员和学生。 管理员功能有个人中心,学生管理,学籍信息管理,入学办理管理等。 学生功能有…...

【数据结构与算法】常见排序算法(Sorting Algorithm)

文章目录 相关概念1. 冒泡排序(Bubble Sort)2. 直接插入排序(Insertion Sort)3. 希尔排序(Shell Sort)4. 直接选择排序(Selection Sort)5. 堆排序(Heap Sort)…...

Unity3D学习之XLua实践——背包系统

文章目录 1 前言2 新建工程导入必要资源2.1 AB包设置2.2 C# 脚本2.3 VSCode 的环境搭建 3 面板拼凑3.1 主面板拼凑3.2 背包面板拼凑3.3 格子复合组件拼凑3.4 常用类别名准备3.5 数据准备3.5.1 图集准备3.5.2 json3.5.3 打AB包 4 Lua读取json表及准备玩家数据5 主面板逻辑6 背包…...

前端技术研究越深入,越觉得技术不是决定录用唯一条件。

一、拒绝抬杠 我说技能不是唯一条件,不是说技能不重要,招聘前端条件是1X,其中1是技能,X是其他条件。 如果X条件很优秀,1这个条件可以降格为0.8、0.5,甚至更低。 有人就抬杠,那为啥不招聘清洁工来干前端&…...

vue组件的重新渲染的问题

目录 1.方式1 2.方式2 1.方式1 修改组件上的key属性 Vue是通过diffing算法比较虚拟DOM和真实DOM,来判断新旧 DOM 的变化。key是虚拟DOM对象的标识,在更新显示时key表示着DOM的唯一性。 DOM是否变化的核心是通过判断新旧DOM的key值是否变化&#xff0c…...

opengl 学习(二)-----你好,三角形

你好&#xff0c;三角形 分类demo效果解析 分类 opengl c demo #include "glad/glad.h" #include "glfw3.h" #include <iostream> #include <cmath> #include <vector>using namespace std;/** * 在学习此节之前&#xff0c;建议将这…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...