OpenCV视觉分析之目标跟踪(1)计算密集光流的类DISOpticalFlow的介绍

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

这个类实现了 Dense Inverse Search (DIS) 光流算法。更多关于该算法的细节可以在文献 146中找到。该实现包含了三个预设参数集,以提供速度和质量之间的合理折衷。然而,即使是速度最慢的预设仍然相对较快,如果你需要更好的质量和不关心速度的话,可以使用 DeepFlow。

与论文中描述的算法相比,这个实现还包含了几个附加特性,包括光流向量的空间传播(通过 getUseSpatialPropagation 控制),以及利用传递给 calc 方法的初始光流近似值的选项(如果传递前一帧的光流场,这基本上就是时间传播)。

cv::DISOpticalFlow 是 OpenCV 中用于计算密集光流(Dense Optical Flow)的一种方法,它基于半相关(displaced-phase correlation)技术。该方法特别适用于实时应用,因为它提供了较高的精度并且计算效率较高。

主要特点

  • 实时性:适合实时应用,因为计算速度快。
  • 高精度:相较于传统的光流算法,如 Lucas-Kanade 或 Farneback 方法,DISOpticalFlow 提供了更高的精度。
  • 密集光流:能够计算图像中每个像素的光流向量,而不是稀疏点。

成员函数

函数create()

cv::DISOpticalFlow::create 是一个静态工厂方法,用于创建 DISOpticalFlow 类的实例。这个方法允许你在创建对象时指定预设参数,这些参数会影响算法的速度和质量。

原型
static Ptr<DISOpticalFlow> cv::DISOpticalFlow::create
(int 	preset = DISOpticalFlow::PRESET_FAST
)	
参数
  • 参数preset:这是一个可选参数,默认值为 DISOpticalFlow::PRESET_FAST。它指定了算法使用的预设配置。预设参数提供了速度和质量之间的不同权衡。

预设参数
DISOpticalFlow 类提供了几种预设参数,具体如下:

  • DISOpticalFlow::PRESET_ULTRAFAST:最快的预设,牺牲了一部分质量以获得最高的速度。
  • DISOpticalFlow::PRESET_FAST:较快的预设,默认值,提供了较好的速度和质量平衡。
  • DISOpticalFlow::PRESET_MEDIUM:中等速度的预设,进一步提高了质量。
  • DISOpticalFlow::PRESET_ULTRA:最慢的预设,提供了最高质量的结果。

函数getFinestScale()

v::DISOpticalFlow::getFinestScale() 是一个成员函数,用于获取当前 DISOpticalFlow 对象所使用的最精细尺度(finest scale)。尺度是指在计算光流时对输入图像进行金字塔分解的程度,尺度越大,图像分辨率越低;尺度越小,图像分辨率越高。

原型
virtual int cv::DISOpticalFlow::getFinestScale	(		)	const
返回值

返回一个整数,表示当前设置的最精细尺度。

作用

在光流计算中,尺度的选择对算法的精度和速度有很大影响。较高的尺度意味着较低的分辨率,这样可以提高计算速度,但可能降低精度;较低的尺度则相反,可以提高精度,但会增加计算量。

函数getGradientDescentIterations()

cv::DISOpticalFlow::getGradientDescentIterations() 是一个成员函数,用于获取当前 DISOpticalFlow 对象在计算光流过程中执行梯度下降迭代的次数。这个参数对于算法的精度和性能有重要影响。

原型
virtual int cv::DISOpticalFlow::getGradientDescentIterations	(		)	const
返回值

返回一个整数,表示当前设置的梯度下降迭代次数。

作用

在光流计算过程中,梯度下降迭代次数决定了算法在每一步中优化光流场的次数。更多的迭代次数通常会导致更精确的光流估计,但也增加了计算时间。因此,在实际应用中需要在精度和速度之间做出权衡。

函数getPatchSize()

cv::DISOpticalFlow::getPatchSize() 是一个成员函数,用于获取当前 DISOpticalFlow 对象在计算光流时所使用的补丁(patch)大小。补丁大小是指在光流计算过程中用来匹配像素块的窗口大小,它对算法的精度和计算效率有直接影响。

原型
virtual int cv::DISOpticalFlow::getPatchSize() const;
返回值

返回一个整数,表示当前设置的补丁大小。

作用

在光流计算过程中,补丁大小决定了用于匹配的像素块的尺寸。较大的补丁大小可能会提高匹配的鲁棒性和精度,但也会增加计算复杂度。较小的补丁大小则可以加快计算速度,但可能会降低精度。

函数getPatchStride()

cv::DISOpticalFlow::getPatchStride() 是一个成员函数,用于获取当前 DISOpticalFlow 对象在计算光流时所使用的补丁(patch)步长。补丁步长决定了在计算光流的过程中,算法如何在图像上滑动补丁进行匹配。

原型
virtual int cv::DISOpticalFlow::getPatchStride	(		)	const
返回值

返回一个整数,表示当前设置的补丁步长。

作用

在光流计算过程中,补丁步长决定了补丁在图像上的移动距离。较大的步长可以减少计算的补丁数量,从而加快计算速度,但可能会导致精度下降。较小的步长则可以提高精度,但会增加计算量。

函数getUseMeanNormalization()

cv::DISOpticalFlow::getUseMeanNormalization() 是一个成员函数,用于查询当前 DISOpticalFlow 对象是否启用了均值归一化(mean normalization)。均值归一化是一种预处理技术,用于减小光照变化和其他环境因素对光流估计的影响。

原型
virtual bool cv::DISOpticalFlow::getUseMeanNormalization	(		)	const

返回值

返回一个布尔值,指示是否启用了均值归一化。

作用

均值归一化有助于提高光流估计的准确性,特别是在存在光照变化的情况下。通过均值归一化,算法会对图像中的每个补丁(patch)进行处理,使其均值接近于零,从而减少环境变化对光流估计的影响。

函数getUseSpatialPropagation()

cv::DISOpticalFlow::getUseSpatialPropagation() 是一个成员函数,用于查询当前 DISOpticalFlow 对象是否启用了空间传播(spatial propagation)。空间传播是一种后处理技术,用于改进光流估计的一致性和平滑性。

原型
virtual bool cv::DISOpticalFlow::getUseSpatialPropagation	(		)	const
返回值

返回一个布尔值,指示是否启用了空间传播。

作用

空间传播可以在光流估计之后,通过考虑周围像素的光流估计值来平滑和优化光流场。这有助于减少孤立的不一致估计,并且可以使最终的光流场更加一致和平滑。

函数getVariationalRefinementAlpha()

cv::DISOpticalFlow::getVariationalRefinementAlpha() 是一个成员函数,用于获取当前 DISOpticalFlow 对象在变分细化(variational refinement)过程中使用的 alpha 参数值。这个参数影响着细化过程中的平滑程度。

原型
virtual float cv::DISOpticalFlow::getVariationalRefinementAlpha	(		)	const
返回值

返回一个浮点数,表示当前设置的 alpha 参数值。

作用

在光流计算过程中,变分细化是一种后处理步骤,用于提高光流场的质量。alpha 参数控制了细化过程中平滑项的权重。较大的 alpha 值会导致更平滑的光流场,而较小的 alpha 值则保留更多细节。

函数getVariationalRefinementDelta()

cv::DISOpticalFlow::getVariationalRefinementDelta() 是一个成员函数,用于获取当前 DISOpticalFlow 对象在变分细化(variational refinement)过程中使用的 delta 参数值。这个参数影响着细化过程中的亮度一致性约束。

原型
virtual float cv::DISOpticalFlow::getVariationalRefinementDelta	(		)	const
返回值

返回一个浮点数,表示当前设置的 delta 参数值。

作用

在光流计算过程中,变分细化是一种后处理步骤,用于提高光流场的质量。delta 参数控制了亮度一致性约束的强度。较大的 delta 值意味着更高的容错性,即在亮度变化较大的情况下仍能保持较好的光流估计;较小的 delta 值则对亮度一致性要求更高,适用于亮度变化较小的情况。

函数getVariationalRefinementGamma()

cv::DISOpticalFlow::getVariationalRefinementGamma() 是一个成员函数,用于获取当前 DISOpticalFlow 对象在变分细化(variational refinement)过程中使用的 gamma 参数值。这个参数影响着细化过程中的平滑程度以及对噪声的敏感度。

原型

virtual float cv::DISOpticalFlow::getVariationalRefinementGamma	(		)	const
返回值

返回一个浮点数,表示当前设置的 gamma 参数值。

作用

在光流计算过程中,变分细化是一种后处理步骤,用于提高光流场的质量。gamma 参数控制了细化过程中对光流场平滑性和对噪声敏感性的平衡。较高的 gamma 值会使光流场更加平滑,但可能丢失一些细节;较低的 gamma 值则保留更多的细节,但也可能导致更多的噪声。

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>// 自定义函数,用于将光流向量转换为彩色图像
/// 自定义函数,用于将光流向量转换为彩色图像
void flowToColor(const cv::Mat& flow, cv::Mat& colorFlow) {const float maxMagnitude = 10.0f; // 可视化中的最大流速int cols = flow.cols;int rows = flow.rows;colorFlow.create(rows, cols, CV_8UC3);for (int y = 0; y < rows; ++y) {for (int x = 0; x < cols; ++x) {cv::Point2f fxy = flow.at<cv::Point2f>(y, x);float magnitude = std::sqrt(fxy.x * fxy.x + fxy.y * fxy.y);magnitude = std::min(magnitude / maxMagnitude, 1.0f); // 归一化// 使用HSV颜色空间来表示方向float angle = std::atan2(fxy.y, fxy.x);float hue = (angle + M_PI) / (2 * M_PI); // 转换为0-1范围内的Hue值hue = std::fmod(hue + 1.0f, 1.0f); // 确保Hue值在0-1之间// 构造HSV颜色cv::Vec3b hsv;hsv[0] = static_cast<uchar>(hue * 180); // Huehsv[1] = static_cast<uchar>(magnitude * 255); // Saturationhsv[2] = static_cast<uchar>(255); // Value// 将HSV颜色转换为BGR颜色cv::Vec3b bgr;cv::Mat hsvPixel(1, 1, CV_8UC3, hsv);cv::Mat bgrPixel;cvtColor(hsvPixel, bgrPixel, cv::COLOR_HSV2BGR);bgr = bgrPixel.at<cv::Vec3b>(0, 0);// 设置颜色colorFlow.at<cv::Vec3b>(y, x) = bgr;}}
}
int main( int argc, char** argv )
{// 创建 DISOpticalFlow 对象cv::Ptr< cv::DISOpticalFlow > dis = cv::DISOpticalFlow::create();// 打开默认摄像头cv::VideoCapture cap( 0 );if ( !cap.isOpened() ){std::cout << "无法打开摄像头" << std::endl;return -1;}cv::Mat frame, prevFrame, gray, flow, colorFlow;// 读取第一帧作为初始帧cap >> frame;if ( frame.empty() ){std::cout << "结束读取" << std::endl;return -1;}cv::cvtColor( frame, prevFrame, cv::COLOR_BGR2GRAY );cv::namedWindow( "Optical Flow", cv::WINDOW_NORMAL );while ( true ){cap >> frame;  // 读取下一帧if ( frame.empty() ){std::cout << "结束读取" << std::endl;break;}cv::cvtColor( frame, gray, cv::COLOR_BGR2GRAY );// 计算光流dis->calc( prevFrame, gray, flow );// 将光流向量转换为彩色图像flowToColor( flow, colorFlow );// 更新前一帧prevFrame = gray.clone();// 显示光流图像cv::imshow( "Optical Flow", colorFlow );if ( cv::waitKey( 30 ) >= 0 ){break;}}return 0;
}

运行结果

在这里插入图片描述

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

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

相关文章

Visual studio 下载安装

1&#xff0c;Visual stutdio 网址 下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 2&#xff0c;下划页面&#xff0c;点击 较早的下载 3&#xff0c;选择对应的版本进行下载

蓝牙技术的多种模式详解

蓝牙作为一种广泛应用的无线通信技术&#xff0c;已经在我们的日常生活中无处不在。随着技术的发展&#xff0c;蓝牙已经不再仅限于传统的音频传输&#xff0c;而是扩展到了各种应用领域。本文将深入探讨蓝牙的各种模式及其应用场景。 1. 经典蓝牙&#xff08;BR/EDR&#xff…

单链表OJ题:移除链表元素(力扣)

目录 解法一&#xff1a;带头节点的新链表 解法二&#xff1a;不带头节点的新指向关系链表 总结 这是一道简单的力扣题目&#xff0c;关于解法的话&#xff0c;这里提供了二种思路&#xff0c;重点解释前两种&#xff0c;还有一种思路好想&#xff0c;但是时间复杂度为O(n^2…

一站式学习 Shell 脚本语法与编程技巧,踏出自动化的第一步

文章目录 1. 初识 Shell 解释器1.1 Shell 类型1.2 Shell 的父子关系 2. 编写第一个 Shell 脚本3. Shell 脚本语法3.1 脚本格式3.2 注释3.2.1 单行注释3.2.2 多行注释 3.3 Shell 变量3.3.1 系统预定义变量&#xff08;环境变量&#xff09;printenv 查看所有环境变量set 查看所有…

SMT 生产可视化:提升电子组装流程效率

通过图扑 HT 对表面贴装技术&#xff08;SMT&#xff09;生产线的实时数据采集与可视化分析&#xff0c;实现对产品质量、产能利用率和流程优化的有效监控&#xff0c;助力生产效率最大化与质量提升。

听见文本的魅力:AI 与未来的语音交互

AI 与未来的语音交互 引言什么是文本转语音&#xff08;TTS&#xff09;&#xff1f;当前 TTS 技术现状国内海外文本转语音能力调研文本转语音能力说明多情感风格SSML语音合成标记语言 未来趋势 引言 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;文本转…

OpenCV视觉分析之运动分析(4)背景减除类:BackgroundSubtractorKNN的一系列set函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 BackgroundSubtractorKNN类有一系列的set函数&#xff0c;下面我们一一列举他们的名字和用法。 一系列set函数 函数setDetectShadows() setDe…

笔记整理—linux驱动开发部分(1)驱动梗概

驱动可以分为广义上的和狭义上的驱动。广义上的驱动是用于操作硬件的代码&#xff0c;而狭义上的驱动为基于内核系统之上让硬件去被操作的逻辑方法。 linux体系架构&#xff1a; 1.分层思想 &#xff1a;在OS中间还会有许多层。 : 2.驱动的上面是系统调用&#xff08;API&…

JavaScript网页设计案例教程:从零开始构建一个响应式网页

JavaScript网页设计案例教程&#xff1a;从零开始构建一个响应式网页 前言 在当今互联网时代&#xff0c;网页设计已成为一项重要技能。JavaScript作为网页开发的核心技术之一&#xff0c;能够让网页变得更加生动和交互。本文将带您通过一个实际案例&#xff0c;逐步学习如何…

万字图文实战:从0到1构建 UniApp + Vue3 + TypeScript 移动端跨平台开源脚手架

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f343; vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f…

【C语言】控制台学生成绩管理系统

文章目录 C语言编程&#xff1a;学生成绩管理系统一、程序概述二、代码实现三、程序解释 C语言编程&#xff1a;学生成绩管理系统 在这篇文章中&#xff0c;我们将一起探讨如何使用C语言来创建一个简单的学生成绩管理系统。这个系统将允许用户输入学生数量、学号和成绩&#x…

钉钉录播抓取视频

爬取钉钉视频 免责声明 此脚本仅供学习参考&#xff0c;切勿违法使用下载他人资源进行售卖&#xff0c;本人不但任何责任! 仓库地址: GItee 源码仓库 执行顺序 poxyM3u8开启代理getM3u8url用于获取m3u8文件userAgent随机请求头downVideo|downVideoThreadTqdm单线程下载和…

水轮发电机油压自动化控制系统解决方案介绍

在现代水电工程中&#xff0c;水轮机组油压自动化控制系统&#xff0c;不仅直接关系到水轮发电机组的安全稳定运行&#xff0c;还影响着整个水电站的生产效率和经济效益。 一、系统概述 国科JSF油压自动控制系统&#xff0c;适用于水轮发电机组调速器油压及主阀&#xff08;蝶…

Golang | Leetcode Golang题解之第503题下一个更大元素II

题目&#xff1a; 题解&#xff1a; func nextGreaterElements(nums []int) []int {n : len(nums)ans : make([]int, n)for i : range ans {ans[i] -1}stack : []int{}for i : 0; i < n*2-1; i {for len(stack) > 0 && nums[stack[len(stack)-1]] < nums[i%…

01 springboot-整合日志(logback-config.xml)

logback-config.xml 是一个用于配置 Logback 日志框架的 XML 文件&#xff0c;通常位于项目的 classpath 下的根目录或者 src/main/resources 目录下。 Logback 提供了丰富的配置选项&#xff0c;可以满足各种不同的日志需求。需要根据具体情况进行配置。 项目创建&#xff0…

Nginx、Tomcat等项目部署问题及解决方案详解

目录 前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的常见原因 2. 端口开启问题2.1 Windows环境下的端口开放2.2 Linux环境下的端口开放 3. 重视日志分析3.1 Nginx日志分析3.2 Tomcat日志分析 4. 开发环境与部署后运行结果不同4.1 开发环境与生产…

redis的配置文件解析

我的后端学习大纲 我的Redis学习大纲 1.1.Redis的配置文件&#xff1a; 1.Redis的配置文件名称是&#xff1a;redis.conf 2.在vim这个配置文件的时候&#xff0c;默认是不显示行号的&#xff0c;可以编辑下面这个文件&#xff0c;末尾加上set nu&#xff0c;就会显示行号: 1.…

kafka 如何减少数据丢失?

大家好&#xff0c;我是锋哥。今天分享关于【kafka 如何减少数据丢失?】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka 如何减少数据丢失? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Apache Kafka 是一个高吞吐量的分布式消息队列&#xff0c;广泛用…

初探Vue前端框架

文章目录 简介什么是Vue概述优势MVVM框架 Vue的特性数据驱动视图双向数据绑定指令插件 Vue的版本版本概述新版本Vue 3Vue 3新特性UI组件库UI组件库概述常用UI组件库 安装Vue安装Vue查看Vue版本 实例利用Vue命令创建Vue项目切换工作目录安装vue-cli脚手架创建Vue项目启动Vue项目…

Java应用程序的测试覆盖率之设计与实现(三)-- jacoco cli 客户端

一、背景 上文已把覆盖率数据采集好了,并提供远程连接的tcp地址及端口。 jacoco cli文档jacoco cli jar包jacococli.jar 我下载好了,放在github工程里。 本文主要是介绍如何使用jacoco cli 客户端读取并生成覆盖率报告。 二、使用 1、dump覆盖率统计 java -jar doc/jacoc…