当前位置: 首页 > 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~

http://www.lryc.cn/news/313183.html

相关文章:

  • 【剑指offer--C/C++】JZ6 从尾到头打印链表
  • 算法-买卖股票的最佳时机
  • 【大数据】Flink SQL 语法篇(十):EXPLAIN、USE、LOAD、SET、SQL Hints
  • Java中List接口常见的实现类
  • SPI通信
  • 【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目
  • 字节后端实习 一面凉经
  • 倒计时37天
  • 【计算机考研】考408,还是不考408性价比高?
  • 测试入门篇
  • b站小土堆pytorch学习记录—— P25-P26 网络模型的使用和修改、保存和读取
  • [数据结构]OJ用队列实现栈
  • 「优选算法刷题」:最长回文子串
  • Java项目:41 springboot大学生入学审核系统的设计与实现010
  • 【数据结构与算法】常见排序算法(Sorting Algorithm)
  • Unity3D学习之XLua实践——背包系统
  • 前端技术研究越深入,越觉得技术不是决定录用唯一条件。
  • vue组件的重新渲染的问题
  • opengl 学习(二)-----你好,三角形
  • mongodb4.2升级到5.0版本,升级到6.0版本, 升级到7.0版本案例
  • CPU处理器模式与异常
  • Day 53 |● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和
  • ant-desgin charts双轴图DualAxes,柱状图无法立即显示,并且只有在调整页面大小(放大或缩小)后才开始显示
  • 获取别人店铺的所有商品API接口
  • 成都正信:亲戚借了钱一直不还怎么委婉的说
  • Truenas入门级教程
  • 窗口函数dense() over(条件)
  • 蓝牙APP开发实现汽车遥控钥匙解锁汽车智能时代
  • 第三天 Kubernetes进阶实践
  • redis小结