OpenCV-光流估计

文章目录

  • 一、光流估计介绍
    • 1.光流估计的基本概念
    • 2.光流估计的原理
    • 3.光流估计的前提
    • 4.OpenCV中的光流估计算法
    • 5.参数设置与调整
  • 二、代码实现
  • 三、注意事项

OpenCV中的光流估计是计算机视觉领域中的一项重要技术,它通过分析图像序列中像素点的运动,来估计物体的运动信息。以下是对OpenCV中光流估计的详细解析:

一、光流估计介绍

1.光流估计的基本概念

光流是空间运动物体在观测成像平面上的像素运动的“瞬时速度”。具体来说,当给定两帧图像时,光流估计旨在找出上一帧图像中的每一个点在下一帧图像中的位置变化,即这些点移动到了什么位置。这个过程可以用来对图像进行动态分析,如目标跟踪等。

2.光流估计的原理

光流估计的基本思想是,如果两帧图像中的某个像素点的强度发生了变化,那么这个像素点可能是由于物体的运动引起的。因此,光流估计的目标是找到每个像素点的位移矢量,以表示其运动方向和速度。

为了实现这一目标,需要基于一些假设,如亮度恒定(同一点随着时间的变化,其亮度不会发生改变)、小运动(随着时间的变化不会引起位置的剧烈变化)和空间一致(一个场景上邻近的点投影到图像上也是邻近点,且邻近点速度一致)等。这些假设有助于构建光流估计的数学模型,并通过求解该模型来得到光流场。

3.光流估计的前提

(1)亮度恒定:同一点随着时间的变化,其亮度不会发生改变。
(2)小运动:随着时间的变化不会引起位置的剧烈变化,只有小运动情况下才能用前后帧之间单位位置变化引起的灰度变化去近似灰度对位置的偏导数。
(3)空间一致:一个场景上邻近的点投影到图像上也是邻近点,且邻近点速度一致。因为光流法基本方程约束只有一个,而要求x,y方向的速度,有两个未知变量。所以需要连立n多个方程求解。

4.OpenCV中的光流估计算法

OpenCV提供了多种光流估计算法,其中常见的有Lucas-Kanade法和Farneback法。

Lucas-Kanade法:

  • 假设图像中的像素在一个小的时间窗口内的运动是一个刚体的平移运动。
  • 使用稀疏光流方法,即只计算一些特征点(如角点)的光流。
  • 可以通过设置搜索窗口大小、金字塔层数等参数来调整算法的性能。

Farneback法:

  • 通过对图像进行多尺度处理,计算像素在时间上的运动。
  • 使用稠密光流方法,即计算整个图像的光流场。
  • 适用于需要精确估计整个图像运动的情况。

5.参数设置与调整

在进行光流估计时,需要设置一些参数来控制算法的性能。这些参数包括最大/最小光流值、阈值、窗口大小和迭代次数等。

  • 最大/最小光流值:表示像素点在相邻帧之间可以移动的最大/最小距离。这些值可以根据实际场景进行调整。
  • 阈值:用于控制算法的灵敏度。当光流值大于阈值时,认为该像素点是前景目标;当光流值小于等于阈值时,认为该像素点是背景。
  • 窗口大小:用于控制算法的局部性。窗口大小越大,算法考虑的局部信息越多,但计算量也越大;窗口大小越小,算法考虑的局部信息越少,但计算量也越小。
  • 迭代次数:在一些光流估计算法中,需要进行迭代计算才能得到最终的光流值。迭代次数越多,计算量越大,但光流值的精度也可能越高。

二、代码实现

以下是运用Lucas-Kanade法进行光流估计的代码,我们对其进行逐一讲解,并为其注释,以便大家更好的理解代码。

import numpy as np
import cv2# 创建了一个 VideoCapture 对象,用于从视频文件 'test.avi' 中读取帧。
cap = cv2.VideoCapture('test.avi')
# 生成一个 100x3 的数组,包含随机整数,范围从 0 到 255。这些整数代表 RGB 颜色值,用于绘制轨迹
color = np.random.randint(0, 255, (100, 3))
# 读取视频的第一帧,ret 是一个布尔值,表示是否成功读取。
ret, old_frame = cap.read()
# 将第一帧从 BGR 转换为灰度图像,因为光流算法通常在灰度图像上运行
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)  # **:关键字参数解包,用于将字典解包为关键字参数,
# 创建一个与当前帧大小相同的全零掩模,用于绘制轨迹
mask = np.zeros_like(old_frame)
# 定义Lucas-Kanade光流参数
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)# 使用 Lucas-Kanade 方法计算从上一帧到当前帧的光流。p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)# 筛选有效特征点,st 是一个状态数组,st == 1 表示成功找到对应点的特征点。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()c, d = old.ravel()a, b, c, d = int(a), int(b), int(c), int(d)# 在掩膜上绘制线段,连接新点和旧点mask = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 2)cv2.imshow('mask', mask)# 将掩膜添加到当前帧img = cv2.add(frame, mask)cv2.imshow('frame', img)# 等待150毫秒,检测是否按下ESC键k = cv2.waitKey(150) & 0xffif k == 27:break# 更新旧灰度图和就特征点old_gray = frame_gray.copy()p0 = good_new.reshape(-1, 1, 2)  # 重新整理特征点cv2.destroyAllWindows()
cap.release()

这段代码实现了使用 Lucas-Kanade 光流算法来跟踪视频中的特征点,并绘制它们的运动轨迹。通过逐帧读取视频,计算光流,并更新特征点的位置,代码能够实时显示特征点的运动轨迹。

三、注意事项

  • 光流估计对图像质量要求较高,因此在实际应用中需要对图像进行预处理,如去噪、增强等。
  • 光流估计的算法复杂度较高,需要消耗较多的计算资源。因此,在选择算法时需要根据实际场景和硬件条件进行权衡。
  • 光流估计对遮挡和多目标运动等复杂场景的处理能力有限。因此,在需要处理这些场景时,需要结合其他算法和技术进行改进和优化。

综上所述,OpenCV中的光流估计是一项强大的技术,可以用于实现各种计算机视觉任务。通过合理选择算法和参数,并结合其他技术进行优化和改进,可以实现对运动物体的精确跟踪和定位。

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

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

相关文章

约克VRF打造舒适绿色无污染的生活环境

在生活的各个方面,约克VRF都采取了多种措施助力碳中和。 采用国际领先的空气源热泵技术,只需少量电力就可将空气中的能量转化为室内热量,被称为“大自然的搬运工”!COP能效值最高可达4.24(每用一度电产生4.24度电热量&…

线性系统性能分析方法3——频率特性分析法(频域分析法)

一种图解的分析方法,不必直接求解系统输出的时域表达式,不需要求解系统的闭环特征根,具有较多的优点。如: ①根据系统的开环频率特性揭示闭环系统的动态性能和稳态性能,得到定性和定量的结论,可以简单迅速…

Qt界面开发(对象树概念、信号与槽机制)

🌳对象树 在Qt框架中,对象树(Object Tree)是针对QObject类以及其子类的结构化组织方式/每一个QObject实例都可以有一个父对象和多个子对象,形成一种层次化的树状关系。这种设计在Qt中具有多个用途和优势。 概念&…

Apache Seata快速入门

前置推荐阅读:Apache Seata 简介-CSDN博客 快速开始 让我们从一个微服务示例开始。 用例​ 用户购买商品的业务逻辑。整个业务逻辑由 3 个微服务提供支持: 仓储服务:对给定的商品扣除仓储数量。订单服务:根据采购需求创建订单…

【Linux】解答:为什么创建目录文件,硬链接数是2;创建普通文件时,硬链接数是1?(超详细图文)

前言 大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Lin…

gitlab配置ssh密钥

1.配置用户信息 git config --global user.name "你的名字" git config --global user.email "你的邮箱" 查看配置是否成功 git config --global --list 2.生成密钥 终端 或 右键文件夹open git bash here 输入命令 ssh-keygen -t rsa -C 随意(生…

接口测试(二)jmeter——实现http请求、察看结果树、请求默认值

一、实现http请求,察看结果树 1. 测试计划 --> 添加 --> 线程(用户) --> 线程组 2. 线程组配置 默认配置 线程数:虚拟用户数,一个虚拟用户占用一个进程或线程。 Ramp-Up 时间(秒):全部线程执行完…

使用Jenkins部署项目

部署中的痛点 为什么要用Jenkins?我说下我以前开发的痛点,在一些中小型企业,每次开发一个项目完成后,需要打包部署,可能没有专门的运维人员,只能开发人员去把项目打成一个exe包,可能这个项目已…

Kettle基本使用

目录 一、安装Kelttle 1-1 安装java环境 1-2 Kettle安装 二、Kettle的基本使用 2-1 将txt文本数据转为excel数据 创建txt文件 创建kettle的转换任务 定义转换流程 配置输入文件 连接读取和写入任务 配置excel输出 保存转换任务 执行转换任务 2-2 将txt文件输出到M…

数据库管理-第252期 深入浅出多主多活数据库技术- Cantian存储引擎(二)(20241017)

数据库管理252期 2024-10-17 数据库管理-第252期 深入浅出多主多活数据库技术- Cantian存储引擎(二)(20241017)1 部署规划2 服务器基础配置2.1 配置HOSTS2.2 关闭防火墙2.3 关闭SELinux2.4 配置yum源 3 编译服务器配置3.1 安装git…

「Python精品教程」Python快速入门,基础数据结构:数字

​***奕澄羽邦精品教程系列*** 编程环境: 1、Python 3.12.5 2、Visual Studio Code 1.92.1 在现实世界中,我们经常要面对各式各样的数字,通过简单或者复杂的数学运算,来帮助我们计算出想要的结果。程序开发过程中,数字…

自动化测试工具在API测试中的优势是什么?

在设计API接口时,确保数据获取的效率和准确性是至关重要的。以下是一些最佳实践和代码示例,帮助你提高API的数据获取效率和准确性。 1. 使用高效的数据访问模式 选择合适的数据库访问模式对于提高数据获取效率至关重要。例如,使用索引可以显…

【启明智显分享】ZX7981PM WIFI6 5G-CPE:2.5G WAN口,2.4G/5G双频段自动调速

昨天,我们向大家展现了ZX7981PG WIFI6 5G-CPE,它强大的性能也引起了一波关注,与此同时,我们了解到部分用户对更高容量与更高速网口的需求。没关系!启明智显早就预料到了!ZX7981PM满足你的需求! …

Vue3 集成Monaco Editor编辑器

Vue3 集成Monaco Editor编辑器 1. 安装依赖2. 使用3. 效果 Monaco Editor (官方链接 https://microsoft.github.io/monaco-editor/)是一个由微软开发的功能强大的在线代码编辑器,被广泛应用于各种 Web 开发场景中。以下是对 Monaco Editor 的…

HTML5教程(三)- 常用标签

1 文本标签-h 标题标签&#xff08;head&#xff09;&#xff1a; 自带加粗效果&#xff0c;从h1到h6字体大小逐级递减一个标题独占一行 语法 <h1>一级标题</h1><h2>二级标题</h2><h3>三级标题</h3><h4>四级标题</h4><h5…

关于md5强比较和弱比较绕过的实验

在ctf比赛题中我们的md5强弱比较的绕过题型很多&#xff0c;大部分都是结合了PHP来进行一个考核。这一篇文章我将讲解一下最基础的绕过知识。 MD5弱比较 比较的步骤 在进行弱比较时&#xff0c;PHP会按照以下步骤执行&#xff1a; 确定数据类型&#xff1a;检查参与比较的两…

jmeter响应断言放进csv文件遇到的问题

用Jmeter的json 断言去测试http请求响应结果&#xff0c;发现遇到中文时出现乱码&#xff0c;导致无法正常进行响应断言&#xff0c;很影响工作。于是&#xff0c;察看了其他测试人员的解决方案&#xff0c;发现是jmeter本身对编码格式的设置导致了这一问题。解决方案是在jmete…

【文化课学习笔记】【化学】选必三:同分异构体的书写

【化学】选必三&#xff1a;同分异构体的书写 如果你是从 B 站一化儿笔记区来的&#xff0c;请先阅读我在第一篇有机化学笔记中的「读前须知」(点开头的黑色小三角展开)&#xff1a;链接 链状烃的取代和插空法 取代法 一取代物 甲烷、乙烷、丙烷、丁烷的种类 甲烷&#xff1a;只…

游戏逆向基础-找释放技能CALL

思路&#xff1a;通过send断点然后对send的data参数下写入断点找到游戏里面的技能或者攻击call 进入游戏先选好一个怪物&#xff08;之所以要先选好是因为选怪也会断&#xff0c;如果直接左键打怪的话就会断几次&#xff09; 断下来后对参数下硬件写入断点 硬件断点断下来后先…

如何用pyhton修改1000+图片的名字?

import os oldpath input("请输入文件路径&#xff08;在windows中复制那个图片文件夹的路径就可以):") #注意window系统中的路径用这个‘\分割&#xff0c;但是编程语言中一般都是正斜杠也就是’/‘ #这里写一个代码&#xff0c;将 \ > / path "" fo…