OpenCV中的光流估计方法详解
文章目录
- 一、引言
- 二、核心算法原理
- 1. 光流法基本概念
- 2. 算法实现步骤
- 三、代码实现详解
- 1. 初始化设置
- 2. 特征点检测
- 3. 光流计算与轨迹绘制
- 四、实际应用效果
- 五、优化方向
- 六、结语
一、引言
在计算机视觉领域,运动目标跟踪是一个重要的研究方向,广泛应用于视频监控、自动驾驶、人机交互等场景。本文将介绍如何使用OpenCV中的Lucas-Kanade光流法实现简单的运动目标轨迹跟踪,并详细解析代码实现。
二、核心算法原理
1. 光流法基本概念
光流(Optical Flow)是图像中物体运动造成的视觉"流动",描述了像素点在连续帧之间的运动模式。Lucas-Kanade算法是一种经典的稀疏光流算法,它基于以下三个假设:
- 亮度恒定(同一特征点的亮度不随时间变化)
- 时间持续性(运动随时间缓慢变化)
- 空间一致性(邻近点有相似运动)
2. 算法实现步骤
- 特征点检测:使用Shi-Tomasi角点检测
- 光流计算:金字塔Lucas-Kanade方法
- 轨迹绘制:连接连续帧中的特征点
三、代码实现详解
1. 初始化设置
import numpy as np
import cv2# 视频读取和参数初始化
cap = cv2.VideoCapture('test.avi')
color = np.random.randint(0,255,(100,3)) # 随机颜色用于轨迹绘制
2. 特征点检测
# 读取第一帧并转换为灰度图
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)# Shi-Tomasi角点检测参数
feature_params = dict(maxCorners=100, qualityLevel=0.3, minDistance=7)
p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)
- 使用角点检测方法找到特征点
goodFeaturesToTrack(image,maxCorners,qualityLevel,minDistance,corners=None,mask=None,blockSize=None)
- image:输入单通道图像。用灰度图
- maxCorners:设定最大的角点个数,是最有可能的角点数,如果这个参数不大于0,那么表示没有角点数的限制。
- qualityLevel:图像角点的最小可接受参数,质量测量值乘以这个参数就是最小特征值,小于这个数的会被抛弃。
- minDistance:角点之间最小的欧氏距离
- mask:检测区域,如果图像不是空的,它指定检测角的区域。
- 返回所有角点坐标位置:corners
3. 光流计算与轨迹绘制
# LK光流参数
lk_params = dict(winSize=(15,15), maxLevel=2)while True:ret, frame = cap.read()if not ret:breakframe_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 计算光流p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)# 筛选成功跟踪的点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().astype(int)c, d = old.ravel().astype(int)mask = cv2.line(mask, (a,b), (c,d), color[i].tolist(), 2)img = cv2.add(frame, mask)cv2.imshow('frame', img)# 更新前一帧数据old_gray = frame_gray.copy()p0 = good_new.reshape(-1,1,2)
计算光流,获取新的特征点位置和状态
calcOpticalFlowPyrLK(prevImg,nextImg,prevPts,nextPts,status=None,err=None,winSize=None,maxLevel=None,criteria=None,flags=None,minEigThreshold=None)
- prevImg:前一帧图像
- nextImg:当前帧图像
- prevPts:前一帧图像中特征点坐标位置
- nextPts:当前帧图像中特征点坐标,可以为None
- winSize:搜索窗口的大小
- maxLevel:金字塔层数
- criteria:停止迭代的准则
- 返回值:
- nextPts:在当前帧中估计出的特征点坐标
- status:一个与prevPts一样大小的状态向量,用于表示特征点是否被成功跟踪到。
- err:一个与prevPts一样大小的误差向量,用于表示估计误差
四、实际应用效果
运行程序后,可以看到视频中检测到的特征点及其运动轨迹。不同颜色的线条代表不同特征点的运动路径,直观展示了物体的运动情况。
显示效果如下:左边是一段有很多人在走动的视频,右边就是根据人物运动的轨迹画出的轨迹图。
五、优化方向
- 特征点选择优化:可以尝试其他特征检测算法如SIFT、SURF等
- 运动模型改进:引入卡尔曼滤波等预测算法提高跟踪稳定性
- 遮挡处理:添加特征点重新检测机制应对遮挡情况
- 性能优化:使用多线程处理提高实时性
六、结语
本文实现了一个基于OpenCV的简单运动目标跟踪系统,展示了光流法的基本应用。虽然实现相对简单,但包含了目标跟踪的核心思想。读者可以在此基础上进行扩展,开发更复杂的跟踪系统。
我们定能不负所托 不负所望!!!🚀🚀🚀
相关文章:
OpenCV中的光流估计方法详解
文章目录 一、引言二、核心算法原理1. 光流法基本概念2. 算法实现步骤 三、代码实现详解1. 初始化设置2. 特征点检测3. 光流计算与轨迹绘制 四、实际应用效果五、优化方向六、结语 一、引言 在计算机视觉领域,运动目标跟踪是一个重要的研究方向,广泛应用…...
Java集合框架详解与使用场景示例
Java集合框架是Java标准库中一组用于存储和操作数据的接口和类。它提供了多种数据结构,每种数据结构都有其特定的用途和性能特点。在本文中,我们将详细介绍Java集合框架的主要组成部分:List、Set和Queue,并通过代码示例展示它们的…...
多模态融合【十九】——MRFS: Mutually Reinforcing Image Fusion and Segmentation
目录 一.摘要 二.Introduction 三. 背景与动机 四.方法 4.1. 概述 4.2. IGM-Att模块 4.3. PC-Att模块 4.4. 任务头 五.实验 5.1. 数据集与实现细节 5.2. 语义分割 5.3. 图像融合 5.4. 消融研究 5.5. IGM-Att和PC-Att的应用增益 5.6. 复杂度讨论 5.7. 目标检测的…...
音频转文字-在线工具包及使用记录
资料来源:https://zhuanlan.zhihu.com/p/269603431(多种方案) 视频教程:https://www.youtube.com/watch?vL1H5ov4WTBg https://github.com/openai/whisper // 创建虚拟环境 python -m venv myvnev// 激活虚拟环境 source myvne…...
集合-进阶
Collection collection的遍历方式 迭代器遍历 不依赖索引 import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;public class mycollection {public static void main(String[] args) {//1.创建集合并添加元素Collection<String> co…...
【阿里云】阿里云 Ubuntu 服务器无法更新 systemd(Operation not permitted)的解决方法
零、前言 目前正在使用的Ubuntu服务器中,仅阿里云(不止一台)出现了这个问题,因此我判定是阿里云服务器独有的问题。如果你的服务器提供商不是阿里云,那么这篇文章可能对你没有帮助。 如果已经因为升级错误导致依赖冲突…...
wpf DataGrid 行选择 命令绑定
在WPF中实现DataGrid行选择与命令绑定的MVVM模式,可通过以下方式结合代码示例实现: 1. 基础绑定与命令触发(SelectionChanged事件绑定) 通过Interaction.Triggers捕获SelectionChanged事件,并绑定到ViewModel中的命令: <DataGrid ItemsSource="{Binding I…...
【认知思维】验证性偏差:认知陷阱的识别与克服
什么是验证性偏差 验证性偏差(Confirmation Bias)是人类认知中最普遍、最根深蒂固的心理现象之一,指的是人们倾向于寻找、解释、偏爱和回忆那些能够确认自己已有信念或假设的信息,同时忽视或贬低与之相矛盾的证据。这种认知偏差影…...
大容量存储的高性能 T-BOX 方案对智能网联汽车的支撑
在智能网联汽车快速发展的当下,车载 T-BOX(Telematics Box)作为车辆与云端互联的核心枢纽,其性能和可靠性直接决定了用户体验的上限。米客方德(MK)推出的基于 STM32H7RX 主控芯片与 MKDV4GIL-AST࿰…...
Linux 内核网络协议栈:从 Socket 类型到协议注册的深度解析
Linux 内核的网络协议栈是一个复杂而高效的体系,涉及多层次的协议处理与数据流转。本文通过分析核心数据结构(如 inetsw 数组、sock_type 枚举)和关键函数(如 inet_add_protocol),深入探讨其工作原理与设计哲学。 一、Socket 类型与 sock_type 枚举 1.1 Socket 类型的定…...
vim,gcc/g++,makefile,cmake
一、vim:你的小帮手——文本编辑器 它是干嘛的? 想象你的代码就像是写在一本“程序的笔记本”里,vim就是一个超级厉害的“数字笔记本”或“文字编辑器”。 它有什么用? 编写代码:编辑、修改你的源代码代码高亮&…...
解决 CentOS 7 镜像源无法访问的问题
在国内使用 CentOS 系统时,经常会遇到镜像源无法访问或者下载速度慢的问题。尤其是默认的 CentOS 镜像源通常是国外的,如果你的网络环境无法直接访问国外服务器,就会出现无法下载包的情况。本文将介绍如何修改 CentOS 7 的镜像源为国内镜像源…...
“傅里叶变换算法”来检测货物外形损坏
“傅里叶变换算法”来检测货物外形损坏 要使用傅里叶变换算法来检测货物外形损坏,首先需要理解基本概念。傅里叶变换是一种数学变换,用于将信号从时域(或空间域)转换到频域。在图像处理中,二维傅里叶变换可以用来分析…...
python打卡day24
可迭代对象、OS模块 知识点回顾: 元组可迭代对象os模块 作业:对自己电脑的不同文件夹利用今天学到的知识操作下,理解下os路径 1.元组 在day3的打卡内容中就介绍了元组,跟列表比起来就是用了圆括号,有序可以重复&#x…...
MapReduce 入门实战:WordCount 程序
一、引言 在大数据处理领域,MapReduce 是一种开创性的编程模型和处理框架,它使得我们能够高效地在大规模分布式系统上处理海量数据。而 WordCount 程序作为 MapReduce 的经典入门案例,堪称大数据领域的 “Hello World”,帮助无数…...
深度剖析:Vue2 项目兼容第三方库模块格式的终极解决方案
当我们为 Vue2 项目引入某些现代 JavaScript 库时,常常会遇到这样的报错: error in ./node_modules/some-lib/lib/index.mjs Cant import the named export xxx from non EcmaScript module这类问题的本质是模块格式的世纪之争 —— ES Moduleÿ…...
5.11作业
拓扑图: 需求分析: 要求五台路由器的环回地址均可以相互访问 配置: r1 int g 0/0/0 i…...
MyBatis 批量新增与删除功能完整教程
一、功能概述 通过 MyBatis 动态 SQL 实现以下功能: 批量新增:一次性插入多条员工记录,支持自增主键回填。批量删除:根据 ID 数组一次性删除多条记录。二、代码逐行解析 1. Mapper 接口定义 // 批量新增:传入员工对象集合 void insertAll(List<Emp> empList);// …...
Spark,RDD中的行动算子
RDD中的行动算子 collect算子 格式:def collect(): Array[T] 参数说明:该算子没有参数。 并以数组的形式返回 统计个数 reduce算子 格式:def reduce(func: (T, T) > T): T 返回值:返回一个单一的值,其类型与…...
Linux:进程控制2
一:进程程序替换 1. 一旦程序替换成功,就去执行新代码了,原始代码的后半部分已经不存在了 2. exec*系列的函数,没有成功返回值,只有失败返回值-1 在程序替换的过程中,并没有创建新的进程,只是…...
Java jar包程序 启动停止脚本 shell bash
启动 启动时 可指定前缀(名称) start.sh #!/bin/bash # 使用时直接运行# 寻找当前目录下后缀为 .jar 的文件 #options($(find . -maxdepth 1 -type f -name "*.jar")) # 寻找当前目录下后缀为 .jar 的文件,并按时间倒序排序 opt…...
【Linux】进程通信 管道
🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、👑进程间通信分类 二、👑管道 🌟什么是管道? 🌟匿名管道 🎉原理: 🔥站在文件描述…...
基于智能家居项目 解析DHT11温湿度传感器
一、模块简介 DHT11 是一款数字式温湿度传感器,内部集成了温度传感元件、湿度传感元件以及一个 8 位单片机芯片,用于采集数据和通信。。 测量范围:湿度 20%~90% RH,温度 0~50℃ 精度:湿度 5% …...
3.1 泰勒公式出发点
第一步:引入背景与动机 首先,泰勒公式(Taylor Series)是数学分析中的一个重要工具,它允许我们将复杂的函数近似为多项式形式。这不仅简化了计算,还帮助我们更好地理解函数的行为。那么为什么我们需要这样一…...
裸机开发的核心技术:轮询、中断与DMA
一、裸机开发的核心技术:轮询、中断与DMA 1. 轮询(Polling) 定义:程序主动、周期性地检查硬件状态或数据。应用场景:适用于简单、实时性要求不高的任务。示例: C while (1) { if (GPIO_ReadPin(SENSOR_P…...
从零开始:使用 Vue-ECharts 实现数据可视化图表功能
目录 前言为什么选择 Vue-ECharts案例:Vue-Echart开发一个分组柱状图 安装依赖 引入 全局引入 按需引入编写组件总结 前言 你好,小二!很高兴你愿意分享关于 Vue-ECharts 的使用经验。 📊 Vue-ECharts:让你在 Vue 项…...
Antd中Form详解:
1.获取Form表单值的方式: ① 使用Form.useForm()钩子(推荐方式) const [form] Form.useForm();const getFormValues () > {const values form.getFieldsValue();};<Form form{form}>...<Form.Item label{null}><Button onClick{ge…...
(2)python开发经验
文章目录 1 pyside6加载ui文件2 使用pyinstaller打包 更多精彩内容👉内容导航 👈👉Qt开发 👈👉python开发 👈 1 pyside6加载ui文件 方法1: 直接加载ui文件 from PySide6.QtWidgets import QAp…...
Landsat 5介绍
USGS Landsat 5 Level 2, Collection 2, Tier 1 数据集可用性:1984-03-16T16:18:01Z–2012-05-05T17:54:06Z 数据集提供程序 USGS Earth Engine 代码段 ee.ImageCollection("LANDSAT/LT05/C02/T1_L2") open_in_new 重新访问间隔:16 天 说…...
PowerShell 实现 conda 懒加载
问题 执行命令conda init powershell会在 profile.ps1中添加conda初始化的命令。 即使用户不需要用到conda,也会初始化conda环境,拖慢PowerShell的启动速度。 解决方案 本文展示了如何实现conda的懒加载,默认不加载conda环境,只…...
解锁ozon运营新路径:自养号测评技术如何实现降本增效
OZON测评自养号技术在跨境电商运营中具有显著的技术优势,主要体现在环境安全、账号控制、成本效率及风险规避等方面。以下是具体分析: 一:安全可控的测评环境搭建通过模拟俄罗斯本地物理环境和家庭住宅IP,自养号测评可规避平台风…...
算法第十七天|654. 最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
654. 最大二叉树 题目 思路与解法 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def constructMaximumB…...
Spring Boot 的自动配置为 Spring MVC 做了哪些事情?
Spring Boot 的自动配置为 Spring MVC 做了大量的工作,极大的简化了我们开发时的配置负担,我们可以快速启动并运行一个基于 Spring MVC 的 Web 应用。以下是 Spring Boot 自动配置为 Spring MVC 所做的主要事情: DispatcherServlet 的自动注册…...
【python】—conda新建python3.11的环境报错
1.报错 conda create -n py3.11 python3.11 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ Collecting package metadata: done Solving environment: failed PackagesNotFoundError: The following packages are not available from current channel…...
桑德拉精神与开源链动2+1模式AI智能名片S2B2C商城小程序的协同价值研究
摘要:本文深入剖析桑德拉无私奉献精神在商业领域的映射价值,结合开源链动21模式、AI智能名片及S2B2C商城小程序的技术特性,系统探讨其在用户赋能、资源协同与价值共创中的协同效应。研究表明,该技术组合通过去中心化激励、智能需求…...
JavaEE--初识网络
目录 一、IP地址 二、端口号 三、认识协议 四、五元组 五、协议分层 1. OSI七层模型 2. TCP/IP五层(或四层)模型 3. 网络设备所在分层 4. 封装和分用 一、IP地址 IP地址(Internet Protocol Address)是用于标识设备在网络…...
2.7/Q2,Charls最新文章解读
文章题目:Climate risks, multi-tier medical insurance systems, and health inequality: evidence from Chinas middle-aged and elderly populations DOI:10.1186/s12913-025-12648-2 中文标题:气候风险、多层次医疗保险制度和健康不平等—…...
Mac显卡的工作原理及特殊之处
目录 🧠 一、显卡的基本工作原理(适用于所有平台) 🍏 二、Mac 显卡的工作机制 1. Mac 使用的显卡类型 Intel 架构时代(Intel CPU Intel/AMD 显卡) Apple Silicon 时代(M1/M2/M3 芯片&…...
MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置
视频讲解: MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置 今天分享的主题为创建自动化脚本编译MUSE Pi Pro的kernel内核,脚本已经上传到中 GitHub - LitchiCheng/MUSE-Pi-Pro-Learning: MUSE-Pi-Pro-Learning ,有需要可以自行clon…...
flink的TaskManager 内存模型
Flink TaskManager 的内存模型是一个多层管理体系,从 JVM 进程到具体任务的内存分配均有明确的逻辑划分和配置策略。以下是其核心构成及运行机制: 一、内存模型总览 TaskManager 内存整体分为 JVM 特有内存 和 Flink 管理内存 两大层级&…...
【NLP 72、Prompt、Agent、MCP、function calling】
命运把我们带到哪里,就是哪里 —— 25.5.13 一、Prompt 1.User Prompt 用户提示词 当我们与大模型进行对话时,我们向大模型发送的消息,称作User Prompt,也就是用户提示词,一般就是我们提出的问题或者想说的话 但是我们…...
无人机俯视风光摄影Lr调色预设,手机滤镜PS+Lightroom预设下载!
调色详情 无人机俯视风光摄影 Lr 调色是利用 Adobe Lightroom 软件,对无人机从俯视角度拍摄的风光照片进行后期处理的调色方式。通过调整色彩、对比度、光影等多种参数,能够充分挖掘并强化画面独特视角下的壮美与细节之美,让原本平凡的航拍风…...
【HTML5】【AJAX的几种封装方法详解】
【HTML5】【AJAX的几种封装方法详解】 AJAX (Asynchronous JavaScript and XML) 封装是为了简化重复的异步请求代码,提高开发效率和代码复用性。下面我将介绍几种常见的 AJAX 封装方式。 方法1. 基于原生 XMLHttpRequest 的封装 XMLHttpRequest。其主要特点如下…...
STM32 __rt_entry
STM32中__rt_entry函数的深度解析 在STM32的启动流程中,__rt_entry是一个由ARM C库提供的核心函数,负责在__main完成基础初始化后,搭建完整的C语言运行环境。以下是其核心功能及工作机制的详细分析: 一、__rt_entry的核心作用 …...
YOLOv11融合[AAAI2025]的PConv模块
YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《Pinwheel-shaped Convolution and Scale-based Dynamic Loss for Infrared Small Target Detection》 一、 模块介绍 论文链接:https://…...
point3d 视野朝向设置
这里写自定义目录标题 point3d 视野朝向设置三维相机朝向的直观理解 point3d 视野朝向设置 open3d.visualization.Visualizer 中的 get_view_control() 方法返回一个 ViewControl 对象,用来控制 3D 可视化窗口中的相机视角。通过这个对象可以设置视角朝向ÿ…...
基于大模型的腰椎管狭窄术前、术中、术后全流程预测与治疗方案研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、腰椎管狭窄概述 2.1 定义与分类 2.2 发病原因与机制 2.3 临床表现与诊断方法 三、大模型技术原理与应用现状 3.1 大模型的基本原理 3.2 在医疗领域的应用案例 3.3 选择大模型预测腰椎管狭窄的依据 四、…...
Matlab基于SSA-MVMD麻雀算法优化多元变分模态分解
Matlab基于SSA-MVMD麻雀算法优化多元变分模态分解 目录 Matlab基于SSA-MVMD麻雀算法优化多元变分模态分解效果一览基本介绍程序设计参考资料效果一览 基本介绍 Matlab基于SSA-MVMD麻雀算法优化多元变分模态分解 可直接运行 分解效果好 适合作为创新点(Matlab完整源码和数据),…...
工程师必读! 3 个最常被忽略的 TDR 测试关键细节与原理
TDR真的是一个用来看阻抗跟Delay的好工具,通过一个Port的测试就可以看到通道各个位置的阻抗变化。 可是使用上其实没这么单纯,有很多细节需要非常地小心,才可以真正地看到您想看的信息! 就让我们整理3个极为重要的TDR使用小细节&…...
Spring Boot 项目中什么时候会抛出 FeignException?
在 Spring Boot 项目中使用 Feign 时,FeignException 是 Feign 客户端在执行 HTTP 请求过程中可能抛出的基础异常。它有很多子类,分别对应不同类型的错误。以下是一些常见的会抛出 FeignException (或其子类) 的情况: 网络连接问题 (Network …...