OpenCV实现目标追踪

2024-02-29 10:52
文章标签 opencv 实现目标 追踪

本文主要是介绍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实现目标追踪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/758514

相关文章

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

qtcreater配置opencv遇到的坑及实践记录

《qtcreater配置opencv遇到的坑及实践记录》我配置opencv不管是按照网上的教程还是deepseek发现都有些问题,下面是我的配置方法以及实践成功的心得,感兴趣的朋友跟随小编一起看看吧... 目录电脑环境下载环境变量配置qmake加入外部库测试配置我配置opencv不管是按照网上的教程还是de

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各