当前位置: 首页 > news >正文

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;
}

运行结果

在这里插入图片描述

相关文章:

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

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 这个类实现了 Dense Inverse Search (DIS) 光流算法。更多关于该算法的细节可以在文献 146中找到。该实现包含了三个预设参数集&#xff0c;以提…...

Lucas带你手撕机器学习——套索回归

好的&#xff0c;下面我将详细介绍套索回归的背景、理论基础、实现细节以及在实践中的应用&#xff0c;同时还会讨论其优缺点和一些常见问题。 套索回归&#xff08;Lasso Regression&#xff09; 1. 背景与动机 在机器学习和统计学中&#xff0c;模型的复杂性通常会影响其在…...

面试中的一个基本问题:如何在数据库中存储密码?

面试中的一个基本问题&#xff1a;如何在数据库中存储密码&#xff1f; 在安全面试中&#xff0c;“如何在数据库中存储密码&#xff1f;”是一个基础问题&#xff0c;但反映了应聘者对安全最佳实践的理解。以下是安全存储密码的最佳实践概述。 了解风险 存储密码必须安全&am…...

XML HTTP Request

XML HTTP Request 简介 XMLHttpRequest(XHR)是一个JavaScript对象,它最初由微软设计,并在IE5中引入,用于在后台与服务器交换数据。它允许网页在不重新加载整个页面的情况下更新部分内容,这使得网页能够实现动态更新,大大提高了用户体验。虽然名字中包含“XML”,但XML…...

TLS协议基本原理与Wireshark分析

01背 景 随着车联网的迅猛发展&#xff0c;汽车已经不再是传统的机械交通工具&#xff0c;而是智能化、互联化的移动终端。然而&#xff0c;随之而来的是对车辆通信安全的日益严峻的威胁。在车联网生态系统中&#xff0c;车辆通过无线网络与其他车辆、基础设施以及云端服务进行…...

当遇到 502 错误(Bad Gateway)怎么办

很多安装雷池社区版的时候&#xff0c;配置完成&#xff0c;访问的时候可能会遇到当前问题&#xff0c;如何解决呢&#xff1f; 客户端&#xff0c;浏览器排查 1.刷新页面和清除缓存 首先尝试刷新页面&#xff0c;因为有时候 502 错误可能是由于网络临时波动导致服务器无法连…...

学习记录:js算法(七十五): 加油站

文章目录 加油站思路一思路二思路三思路四思路五 加油站 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xf…...

强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断

强心剂&#xff01;EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断 目录 强心剂&#xff01;EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断效果一览基本介绍程序设计参考资料 效果一览 基本介绍 EEMD-MPE-KPCA-LSTM(集合经验模态分解-多尺…...

yarn的安装与使用以及与npm的区别(安装过程中可能会遇到的问题)

一、yarn的安装 使用npm就可以进行安装 但是需要注意的一点是yarn的使用和node版本是有关系的必须是16.0以上的版本。 输入以下代码就可以实现yarn的安装 npm install -g yarn 再通过版本号的检查来确定&#xff0c;yarn是否安装成功 yarn -v二、遇到的问题 1、问题描述…...

大数据行业预测

大数据行业预测 编译 李升伟 和所有预测一样&#xff0c;我们必须谨慎对待这些预测&#xff0c;因为其中一些预测可能成不了事实。当然&#xff0c;真正改变游戏规则的创新往往出乎意料&#xff0c;甚至让最警惕的预言家也措手不及。所以&#xff0c;如果在来年发生了一些惊天…...

可能是NextJs(使用ssr、api route)打包成桌面端(nextron、electron、tauri)的最佳解决方式

可能是NextJs(使用ssr、api route)打包成桌面端(nextron、electron、tauri)的最佳解决方式 前言 在我使用nextron&#xff08;nextelectron&#xff09;写了一个项目后打包发现nextron等一系列桌面端框架在生产环境是不支持next的ssr也就是api route功能的这就导致我非常难受&…...

二百七十、Kettle——ClickHouse中增量导入清洗数据错误表

一、目的 比如原始数据100条&#xff0c;清洗后&#xff0c;90条正确数据在DWD层清洗表&#xff0c;10条错误数据在DWD层清洗数据错误表&#xff0c;所以清洗数据错误表任务一定要放在清洗表任务之后。 更关键的是&#xff0c;Hive中原本的SQL语句&#xff0c;放在ClickHouse…...

CentOS6升级OpenSSH9.2和OpenSSL3

文章目录 1.说明2.下载地址3.升级OpenSSL4.安装telnet 服务4.1.安装 telnet 服务4.2 关闭防火墙4.2.使用 telnet 连接 5.升级OpenSSH5.1.安装相关命令依赖5.2.备份原 ssh 配置5.3.卸载原有的 OpenSSH5.4.安装 OpenSSH5.5.修改 ssh 配置文件5.6关闭 selinux5.7.重启 OpenSSH 1.说…...

2024 年 MathorCup 数学应用挑战赛——大数据竞赛-赛道 A:台风的分类与预测

2024年MathorCup大数据挑战赛-赛道A初赛--思路https://download.csdn.net/download/qq_52590045/89922904↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓…...

kotlin实现viewpager

说明:kotlin tablayout viewpager adapter实现滑动界面 效果图 step1: package com.example.flushfragmentdemoimport androidx.appcompat.app.AppCompatActivity import android.os.Bundle import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.…...

RabbitMQ最新版本4.0.2在Windows下的安装及使用

RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;提供可靠的消息传递和队列服务。它支持多种消息协议&#xff0c;包括 AMQP、STOMP、MQTT 等。本文将详细介绍如何在 Windows 系统上安装和使用最新版本的 RabbitMQ 4.0.2。 前言 RabbitMQ 是用 Erlang 语言开发的 AMQP&…...

东方博宜1180 - 数字出现次数

问题描述 有 50 个数&#xff08; 0∼19&#xff09;&#xff0c;求这 50个数中相同数字出现的最多次数为几次&#xff1f; 输入 50 个数字。 输出 1 个数字&#xff08;即相同数字出现的最多次数&#xff09;。 样例 输入 1 10 2 0 15 8 12 7 0 3 15 0 15 18 16 7 17 16 9 …...

LeetCode: 3274. 检查棋盘方格颜色是否相同

一、题目 给你两个字符串 coordinate1 和 coordinate2&#xff0c;代表 8 x 8 国际象棋棋盘上的两个方格的坐标。   以下是棋盘的参考图。   如果这两个方格颜色相同&#xff0c;返回 true&#xff0c;否则返回 false。   坐标总是表示有效的棋盘方格。坐标的格式总是先…...

datax编译并测试

mvn -U clean package assembly:assembly -Dmaven.test.skiptrue 参看&#xff1a;DataX导数的坑_datax插件初始化错误, 该问题通常是由于datax安装错误引起,请联系您的运维解决-CSDN博客 两边表结构先创建好&#xff1a; (base) [rootlnpg bin]# pwd /db/DataX-datax_v20230…...

2-133 基于matlab的粒子群算法PSO优化BP神经网络

基于matlab的粒子群算法PSO优化BP神经网络&#xff0c;BP神经网络算法采用梯度下降算法&#xff0c;以输出误差平方最小为目标&#xff0c;采用误差反向传播&#xff0c;训练网络节点权值和偏置值&#xff0c;得到训练模型。BP神经网络的结构(层数、每层节点个数)较复杂时&…...

ESP32专用VEML6040四通道环境光传感器驱动详解

1. 项目概述esp_veml6040是专为 ESP32 系列微控制器&#xff08;兼容 ESP-IDF v4.4&#xff09;设计的高性能 IC 外设驱动组件&#xff0c;面向 Vishay 公司推出的 VEML6040 四通道环境光与色彩传感器。该组件并非简单封装&#xff0c;而是深度适配 ESP-IDF 架构的工程化实现&a…...

RK3566 SPI设备节点实战:从内核配置到用户空间spidev3.0测试

1. RK3566 SPI开发基础与实战意义 SPI总线作为嵌入式系统中最常用的通信协议之一&#xff0c;在RK3566这类高性能处理器上的应用尤为广泛。我最近在立创泰山派开发板上折腾SPI设备时&#xff0c;发现很多新手都会卡在内核配置和用户空间测试的衔接环节。这篇文章就来手把手带你…...

MMA8452Q加速度传感器原理与嵌入式低功耗集成实践

1. MMA8452Q加速度传感器技术深度解析与嵌入式系统集成实践MMA8452Q是NXP&#xff08;现为恩智浦半导体&#xff09;推出的一款超低功耗、高精度、三轴数字加速度传感器&#xff0c;采用331 mm QFN-16封装&#xff0c;专为便携式消费电子、工业状态监测、可穿戴设备及物联网终端…...

UbidotsXLR8库:面向XLR8硬件的轻量级物联网云通信方案

1. UbidotsXLR8 库概述UbidotsXLR8 是专为 Alorium Technology XLR8 微控制器开发板设计的轻量级物联网通信库&#xff0c;核心目标是简化 XLR8 板与 Ubidots 云平台之间的双向数据交互。该库并非通用型 HTTP 客户端封装&#xff0c;而是针对 XLR8 硬件架构与 WINC1500 Wi-Fi 模…...

NewStar CTF 2025 Week3-mirror_gate题解文件解析+上传漏

0x01 题目&#xff1a;文件上传解析漏洞0x02 思路&#xff1a;若是文件上传就要注意就算文件后缀过了&#xff0c;但是文件内容的恶意代码也会被识破<?php eval($_POST[cmd]); ?>这种木马肯定不行&#xff0c;用RIFFWEBPVP8<?cat /f*; ?>但是一开始我的思路并不…...

一键唤醒黑白记忆:DeOldify图像上色服务快速搭建与使用指南

一键唤醒黑白记忆&#xff1a;DeOldify图像上色服务快速搭建与使用指南 1. 引言&#xff1a;让历史照片重获新生 你是否曾翻出家中泛黄的老照片&#xff0c;感叹那些珍贵的黑白影像无法完全展现当年的色彩&#xff1f;或者作为设计师&#xff0c;需要为历史资料添加合理的色彩…...

OFA模型在社交媒体分析中的应用:图像内容理解与问答

OFA模型在社交媒体分析中的应用&#xff1a;图像内容理解与问答 1. 引言 每天&#xff0c;社交媒体平台上有数十亿张图片被上传和分享。从美食照片到旅行风景&#xff0c;从产品展示到活动记录&#xff0c;这些图像承载着丰富的信息和价值。但对于平台运营方和内容创作者来说…...

告别事件查看器!FullEventLogView实战:3步搞定Windows服务器日志分析

FullEventLogView进阶指南&#xff1a;企业级Windows日志分析实战 Windows服务器日志分析一直是系统管理员日常运维中的痛点。传统的事件查看器操作繁琐、筛选效率低下&#xff0c;面对海量日志时往往让人束手无策。FullEventLogView作为一款轻量级但功能强大的替代工具&#x…...

【PCIE】Windows系统下FPGA的PCIE驱动安装与DMA读写性能实战解析

1. Windows系统下FPGA的PCIE驱动安装全攻略 第一次接触FPGA的PCIE开发时&#xff0c;我被Windows下的驱动安装折腾得够呛。记得当时为了给紫光同创PG2L100H开发板装驱动&#xff0c;整整花了两天时间反复尝试。现在回想起来&#xff0c;其实只要掌握几个关键步骤&#xff0c;整…...

SWF文件压缩比优化:JPEXS Free Flash Decompiler高级设置指南

SWF文件压缩比优化&#xff1a;JPEXS Free Flash Decompiler高级设置指南 【免费下载链接】jpexs-decompiler JPEXS Free Flash Decompiler 项目地址: https://gitcode.com/gh_mirrors/jp/jpexs-decompiler 想要最大化SWF文件的压缩效率&#xff1f;JPEXS Free Flash De…...