OpenCV实现目标追踪

目录

准备工作

语言:

软件包:

效果演示

代码解读

(1)导入OpenCV库

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

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

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

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

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

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

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

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

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

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

总体代码

总结


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

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


准备工作

语言:

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

软件包:

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


效果演示


代码解读

(1)导入OpenCV库

python 复制代码
import cv2

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

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

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

python 复制代码
# 读取第一帧
ret, fr = vid.read()

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

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

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

python 复制代码
# 初始化跟踪器
tracker = cv2.TrackerKCF_create()
tracker.init(fr, initial_box)

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

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

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

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

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

python 复制代码
    # 进行跟踪
    (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 毫秒。

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

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

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

python 复制代码
    # 按下 'q' 键退出循环
    if key == ord('q'):
        break

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

python 复制代码
# 释放资源
vid.release()
cv2.destroyAllWindows()

总体代码

python 复制代码
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~

相关推荐
沫儿笙几秒前
发那科机器人在氩弧焊中搭配节气装置的优势
人工智能·机器人
JELEE.3 小时前
Django登录注册完整代码(图片、邮箱验证、加密)
前端·javascript·后端·python·django·bootstrap·jquery
m0_650108244 小时前
【论文精读】CMD:迈向高效视频生成的新范式
人工智能·论文精读·视频扩散模型·高效生成·内容 - 运动分解·latent 空间
电鱼智能的电小鱼4 小时前
基于电鱼 AI 工控机的智慧工地视频智能分析方案——边缘端AI检测,实现无人值守下的实时安全预警
网络·人工智能·嵌入式硬件·算法·安全·音视频
年年测试4 小时前
AI驱动的测试:用Dify工作流实现智能缺陷分析与分类
人工智能·分类·数据挖掘
孫治AllenSun4 小时前
【算法】图相关算法和递归
windows·python·算法
唐兴通个人5 小时前
人工智能Deepseek医药AI培训师培训讲师唐兴通讲课课程纲要
大数据·人工智能
格图素书5 小时前
数学建模算法案例精讲500篇-【数学建模】DBSCAN聚类算法
算法·数据挖掘·聚类
共绩算力5 小时前
Llama 4 Maverick Scout 多模态MoE新里程碑
人工智能·llama·共绩算力
DashVector6 小时前
向量检索服务 DashVector产品计费
数据库·数据仓库·人工智能·算法·向量检索