计算机视觉(opencv)实战二十七——目标跟踪 - 教程

news/2025/9/25 20:50:34/文章来源:https://www.cnblogs.com/lxjshuju/p/19111981


光流法与特征点跟踪 —— 原理解析与代码实现

在计算机视觉中,目标跟踪是一个非常常见的任务。它的目标是:在一段视频中,自动地跟踪目标物体或者特征点的运动轨迹。本文通过一个实际的 OpenCV 代码示例,演示如何用 角点检测 + Lucas-Kanade 光流法 来跟踪视频中显著的特征点,并绘制出它们的运动轨迹。


一、核心原理

1. 特征点检测(Shi-Tomasi)

首先需要找到“容易被跟踪”的点。OpenCV 提供了 cv2.goodFeaturesToTrack 函数,它基于 Shi-Tomasi 角点检测算法,能够找到一幅图像中最稳定、最有代表性的角点。

  • 角点(Corner):图像局部区域的梯度变化显著的点。例如:十字路口、物体边缘的尖角、纹理丰富的区域。这类点在相邻帧中比较容易匹配。

  • Shi-Tomasi 算法:通过计算图像的二阶矩矩阵(结构张量),选择响应值最大的若干个点作为角点。

2. 光流法(Optical Flow)

当我们获得了角点,就需要在下一帧图像中找到它们的新位置。光流法的基本思想是:

  • 假设相邻两帧之间,像素的灰度值保持不变;

  • 在一个小的邻域窗口内,通过最小化误差来求解像素的新位置。

这里使用的是 Lucas-Kanade 光流法,它在小窗口内假设所有像素具有相同的运动,从而用最小二乘法快速解算出运动向量。

3. 金字塔光流法

为了应对较大位移,OpenCV 提供了 金字塔 Lucas-Kanade 光流法:先在低分辨率图像中计算粗略位移,再逐级在更高分辨率的图像中细化结果,从而提高算法的鲁棒性和准确性。


二、代码详解

import numpy as np
import cv2
# 打开视频文件
cap = cv2.VideoCapture('test.avi')
# 随机生成颜色,用于绘制轨迹
color = np.random.randint(0, 255, (100, 3))
# 读取视频的第一帧
ret, old_frame = cap.read()
# 转为灰度图像
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)

首先读取视频的第一帧,转成灰度图,因为光流计算只需要灰度信息,减少计算量


特征点检测

feature_params = dict(maxCorners=100,
qualityLevel=0.3,
minDistance=7)
# 检测角点
p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)

参数解释:

  • maxCorners=100:最多检测 100 个角点;

  • qualityLevel=0.3:只保留质量值大于 0.3 * 最大质量值的角点;

  • minDistance=7:确保角点之间的最小距离,避免聚集在一起。


光流法参数

lk_params = dict(winSize=(15, 15),
maxLevel=2)
  • winSize:搜索窗口大小,越大越能容忍较大位移,但会降低速度;

  • maxLevel:金字塔层数,2 表示在原图、缩小一半、再缩小一半的三层图像上计算。


主循环与光流计算

mask = np.zeros_like(old_frame)
while True:
ret, frame = cap.read()
if not ret:
break
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, nextPts=None, **lk_params)

这里使用 cv2.calcOpticalFlowPyrLK 计算光流,得到:

  • p1:新位置;

  • st:状态向量(1 表示跟踪成功,0 表示跟踪失败);

  • err:跟踪误差。


绘制轨迹

good_new = p1[st == 1]
good_old = p0[st == 1]
for i, (new, old) in enumerate(zip(good_new, good_old)):
a, b = new.ravel()  # 获取新点的坐标 或者[a, b] = new
c, d = old.ravel()  # 获取旧点的坐标
a, b, c, d = int(a), int(b), int(c), int(d)  # 转换为整数
# 在掩模上绘制线段,连接新点和旧点
mask = cv2.line(mask, pt1=(a, b), pt2=(c, d), color=color[i].tolist(), thickness=2)
cv2.imshow(winname='mask', mat=mask)

每对跟踪到的特征点用一条彩色线段连接,形成运动轨迹。轨迹被累积到 mask 上,叠加到视频帧中显示。


更新特征点

img = cv2.add(frame, mask)
# 显示结果图像
cv2.imshow(winname='frame', mat=img)
# 等待150ms,检测是否按下了Esc键(键码为27)
k = cv2.waitKey(150)
if k == 27:  # 按下Esc键,退出循环
break
# 更新旧灰度图和旧特征点
old_gray = frame_gray.copy()
p0 = good_new.reshape(-1, 1, 2)  # 重新整理特征点为适合下次计算的形状 (38,2)-->(38,1,2)
# 释放资源
cap.release()
cv2.destroyAllWindows()

把当前帧作为下一轮的“上一帧”,继续跟踪新的点位置。


三、运行效果

执行程序后,能看到视频中检测到的角点被彩色线段连接,每一帧都会更新,形成流畅的轨迹,就像在画出物体的运动轨迹。这在运动分析、目标跟踪、视频稳定、行为识别中都有重要应用。


四、应用场景

  • 运动目标跟踪:监控场景下跟踪行人、车辆的移动轨迹;

  • 视频稳定:通过估计相机运动,消除视频抖动;

  • 运动分析:分析物体的速度、方向;

  • 机器人视觉导航:帮助机器人估计环境中相对运动。


五、注意事项与优化

  1. 特征点丢失:如果某些点跟踪失败,需要重新检测角点。

  2. 遮挡问题:遮挡会导致跟踪失败,可结合对象检测动态更新特征点。

  3. 参数调整:根据视频分辨率和运动速度调整 winSizemaxLevel 以平衡精度和速度。

  4. 性能优化:在实时视频中,建议降低分辨率或使用多线程以提高帧率。


总结
本文完整解析了基于角点检测与 Lucas-Kanade 光流法的特征点跟踪方法,结合 OpenCV 代码演示了如何实现轨迹可视化。通过理解参数和原理,你可以灵活调整,应用在不同的计算机视觉任务中。

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

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

相关文章

P8367 [LNOI2022] 盒

传送门。 神仙题,做了半年。 整体是不好做的,考虑每个\(w_i\)对整体的贡献。记\(s_i=\sum_{i=1}^{i}a_i\),\(d_i=\sum_{i=1}^{i}b_i\),当且仅当\(s_i\neq d_i\)时,才会有货物流通\(i\)号点。所以总体的答案为: \…

蓝桥杯 2025 省 B 题:画展布置 - 题解笔记

蓝桥杯 2025 省 B 题:画展布置 - 题解笔记.md 一、题目核心信息 1. 问题描述 给定 N 幅画作的艺术价值数组 A,需从其中挑选 M 幅并排列成序列 B(长度为 M),目标是最小化评价指标 L,L 的定义为: \[L = \sum_{i=1…

二维坐标下的运算

在二维图中,常常遇到一些需要大量坐标运算的题目,这时可以封装一个Point类,实现坐标高效运算。 // #define LOCAL #include<iostream> #include<queue> #include<map> using namespace std; #define…

凡科建站怎么导出网页网站优化方案和实施

有一个数据库应用程序存在过多的解析问题&#xff0c;因此需要找到产生大量硬解析的主要语句。 什么是硬解析 Oracle数据库中的硬解析&#xff08;Hard Parse&#xff09;是指在执行SQL语句时&#xff0c;数据库需要重新解析该SQL语句&#xff0c;并创建新的执行计划的过程。这…

Polar2025秋季个人挑战赛web-writeup

感觉难度还行polar快递 在登录页面下载备忘录发现用户等级分四个,抓包发现有id=user,改为最高等级的root登录即可获取flag white 常规输入执行命令发现很多符号都被ban了/[;&$"<>?*[]{}()#@!%]/`,发…

题解:P12751 [POI 2017 R2] 集装箱 Shipping containers

cnblogs 题面 第二道根号分治,对初学者来说很友好的一道题。 题意在题面中写的很清楚,这里不多赘述。 思路 先从暴力开始想。 每次暴力的时间复杂度最坏明显是 \(O(n^2)\) 的,因为是类似区间加和最后统计的问题,可…

弱网配置

sudo tc qdisc replace dev eno1 root netem delay 120ms 30ms 25% loss 5% 解除sudo tc qdisc del dev eno1 ingresshttps://blog.csdn.net/2303_78922833/article/details/151372115

网站建设网页设计小江wordpress重写插件

上篇文章《C自动注册的工厂与--whole-archive》提到了--whole-archive选项在自动工厂示例的必要&#xff0c;“貌似也没其他方法了”。 这篇文章介绍另一种可以替代的方式&#xff0c;并分析其优缺点&#xff0c;采用的代码示例同上篇文章。文章最后附代码。 方法介绍 ld链接器…

net网站开发教学视频牌子网排行榜

报告来源&#xff1a;国泰君安&#xff08;訾猛&#xff09;亚马逊以技术为核心驱动力&#xff0c;实现从电商向科技公司的跨越&#xff0c;形成电商、物流、AWS、新零售协同发展的完整生态圈。亚马逊从1995年开始为用户提供线上商品&#xff0c;从一家网上书店发展成全品类电商…

选择网站做友情链接的标准一般是wordpress点击折叠展开内容

Java概况 JavaSE是java分类中的标准版&#xff0c;是刚接触java要学习的基础知识。 JavaEE是java分类中的企业版&#xff0c;是java中的高级&#xff0c;涉及到的知识广泛。 JavaME中M是Micro的缩写&#xff0c;用在嵌入式等电子设备中。 Java软件工程师&#xff1a;通过Ja…

通过【开题答辩过程】以《基于JavaEE的创意产品众筹平台的设计与实现》为例,不会开题答辩的能够进来看看

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Nano-Banana免费使用指南:一键生成专属3D手办,附超详细提示词 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

绘制金融集团监控大屏的地图demo

<!-- 引入ECharts和地图数据 --> <script src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script> <script src="https://geo.datav.aliyun.com/areas_v3/…

如何在CentOS 7上安装bzip2-1.0.6-13.el7.x86_64.rpm RPM包(详细步骤)

如何在CentOS 7上安装bzip2-1.0.6-13.el7.x86_64.rpm RPM包(详细步骤)​bzip2​ 是一个在 Linux 系统中常用的文件压缩工具,这个 RPM 包是专门为 ​CentOS 7 / RHEL 7(64位系统)​​ 准备的安装版本 一、先确认你…

实用指南:《原神助手》开源神器:游戏体验大升级

实用指南:《原神助手》开源神器:游戏体验大升级pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

百度收录网站需要多久做海外推广的公司

一、Git概述&#xff08;1&#xff09;定义Git是目前世界上最先进的分布式版本控制系统。&#xff08;2&#xff09;能干什么&#xff1f;解决冲突、管理权限、代码备份、协同开发、版本还原、历史追查、版本记录、分支管理、代码审查&#xff08;3&#xff09;集中管理型版本管…

AM1.5G 太阳光谱 - 教程

AM1.5G 太阳光谱 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…

2025年Java常见面试题

2025年Java常见面试题2025年Java常见面试题 原文链接:https://zhuanlan.zhihu.com/p/1913568498535360114 数据库事务特性。原子性、一致性、隔离性、持久性如何防止SQL注入:使用#不要使用$符号;对所有的入参做校验…

实用指南:k8s 跟 nacos 关于服务注册以及服务发现

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

9-25

今天满课。。。 最近在忙大创,电控这方面需要合作完成,重拾了单片机的知识 驱动电机使用的是TB6612,驱动130直流电机 使用pwm控制转速 PWM 是 脉冲宽度调制(Pulse Width Modulation)的缩写,是一种通过调节脉冲信…