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的介绍
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 这个类实现了 Dense Inverse Search (DIS) 光流算法。更多关于该算法的细节可以在文献 146中找到。该实现包含了三个预设参数集,以提…...
Lucas带你手撕机器学习——套索回归
好的,下面我将详细介绍套索回归的背景、理论基础、实现细节以及在实践中的应用,同时还会讨论其优缺点和一些常见问题。 套索回归(Lasso Regression) 1. 背景与动机 在机器学习和统计学中,模型的复杂性通常会影响其在…...
面试中的一个基本问题:如何在数据库中存储密码?
面试中的一个基本问题:如何在数据库中存储密码? 在安全面试中,“如何在数据库中存储密码?”是一个基础问题,但反映了应聘者对安全最佳实践的理解。以下是安全存储密码的最佳实践概述。 了解风险 存储密码必须安全&am…...
XML HTTP Request
XML HTTP Request 简介 XMLHttpRequest(XHR)是一个JavaScript对象,它最初由微软设计,并在IE5中引入,用于在后台与服务器交换数据。它允许网页在不重新加载整个页面的情况下更新部分内容,这使得网页能够实现动态更新,大大提高了用户体验。虽然名字中包含“XML”,但XML…...
TLS协议基本原理与Wireshark分析
01背 景 随着车联网的迅猛发展,汽车已经不再是传统的机械交通工具,而是智能化、互联化的移动终端。然而,随之而来的是对车辆通信安全的日益严峻的威胁。在车联网生态系统中,车辆通过无线网络与其他车辆、基础设施以及云端服务进行…...
当遇到 502 错误(Bad Gateway)怎么办
很多安装雷池社区版的时候,配置完成,访问的时候可能会遇到当前问题,如何解决呢? 客户端,浏览器排查 1.刷新页面和清除缓存 首先尝试刷新页面,因为有时候 502 错误可能是由于网络临时波动导致服务器无法连…...
学习记录:js算法(七十五): 加油站
文章目录 加油站思路一思路二思路三思路四思路五 加油站 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发…...
强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断
强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断 目录 强心剂!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 再通过版本号的检查来确定,yarn是否安装成功 yarn -v二、遇到的问题 1、问题描述…...
大数据行业预测
大数据行业预测 编译 李升伟 和所有预测一样,我们必须谨慎对待这些预测,因为其中一些预测可能成不了事实。当然,真正改变游戏规则的创新往往出乎意料,甚至让最警惕的预言家也措手不及。所以,如果在来年发生了一些惊天…...
可能是NextJs(使用ssr、api route)打包成桌面端(nextron、electron、tauri)的最佳解决方式
可能是NextJs(使用ssr、api route)打包成桌面端(nextron、electron、tauri)的最佳解决方式 前言 在我使用nextron(nextelectron)写了一个项目后打包发现nextron等一系列桌面端框架在生产环境是不支持next的ssr也就是api route功能的这就导致我非常难受&…...
二百七十、Kettle——ClickHouse中增量导入清洗数据错误表
一、目的 比如原始数据100条,清洗后,90条正确数据在DWD层清洗表,10条错误数据在DWD层清洗数据错误表,所以清洗数据错误表任务一定要放在清洗表任务之后。 更关键的是,Hive中原本的SQL语句,放在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 是一个开源的消息代理和队列服务器,提供可靠的消息传递和队列服务。它支持多种消息协议,包括 AMQP、STOMP、MQTT 等。本文将详细介绍如何在 Windows 系统上安装和使用最新版本的 RabbitMQ 4.0.2。 前言 RabbitMQ 是用 Erlang 语言开发的 AMQP&…...
东方博宜1180 - 数字出现次数
问题描述 有 50 个数( 0∼19),求这 50个数中相同数字出现的最多次数为几次? 输入 50 个数字。 输出 1 个数字(即相同数字出现的最多次数)。 样例 输入 1 10 2 0 15 8 12 7 0 3 15 0 15 18 16 7 17 16 9 …...
LeetCode: 3274. 检查棋盘方格颜色是否相同
一、题目 给你两个字符串 coordinate1 和 coordinate2,代表 8 x 8 国际象棋棋盘上的两个方格的坐标。 以下是棋盘的参考图。 如果这两个方格颜色相同,返回 true,否则返回 false。 坐标总是表示有效的棋盘方格。坐标的格式总是先…...
datax编译并测试
mvn -U clean package assembly:assembly -Dmaven.test.skiptrue 参看:DataX导数的坑_datax插件初始化错误, 该问题通常是由于datax安装错误引起,请联系您的运维解决-CSDN博客 两边表结构先创建好: (base) [rootlnpg bin]# pwd /db/DataX-datax_v20230…...
2-133 基于matlab的粒子群算法PSO优化BP神经网络
基于matlab的粒子群算法PSO优化BP神经网络,BP神经网络算法采用梯度下降算法,以输出误差平方最小为目标,采用误差反向传播,训练网络节点权值和偏置值,得到训练模型。BP神经网络的结构(层数、每层节点个数)较复杂时&…...
复盘秋招22场面试(四)形势重新评估与后续措施
连续好多天睡不着觉,经常晚上起来好几次,到现在还是没offer。之前有个校友在抖音留言说我能收到这么多面试说明简历没问题,这么多一面挂,说明我技术面有问题。确实有一些是kpi面,但是我复盘之后我发现也没有那么多kpi面…...
揭开C++ STL的神秘面纱之string:提升编程效率的秘密武器
目录 🚀0.前言 🚈1.string 构造函数 🚝1.1string构造函数 🚝1.2string拷贝构造函数 🚈2.string类的使用 🚝2.1.查询元素个数或空间 返回字符串中有效字符的个数:size lenth 返回字符串目…...
用人工智能,应该怎么掏钱?
人工智能(AI)服务的发展正快速改变企业和开发者的工作方式,不仅提供了强大的数据分析和预测能力,还涵盖了从自然语言处理到图像识别的广泛功能。然而,理解AI服务的支付模式对成本控制和合理资源分配至关重要࿰…...
【Axure高保真原型】移动案例
今天和大家分享多个常用的移动案例的原型模板,包括轮盘滑动控制元件移动、页面按钮控制元件移动、鼠标单击控制元件移动、元件跟随鼠标移动、鼠标拖动控制元件移动、键盘方向键控制元件移动,具体效果可以点击下方视频观看或打开下方预览地址查看哦 【原…...
Bytebase 3.0.0 - AI 助手全面升级
🚀 新功能 SQL 编辑器里的 AI 助手:支持将自然语言转换成 SQL 语句,解释 SQL 代码,还能帮助发现潜在问题。 支持 SQL Server DML 语句一键回滚。支持 MariaDB 的在线大表变更。新的 SQL 审核规则: 要求为 MySQL 设置 …...
php基础:数据类型、常量、字符串
语法补充: 每句必须以;结尾 echo:能输出一个以上的字符串,英文逗号隔开 print:只能输出一个字符串并返回1 1.数据类型 php可以自动识别数据类型。 php有5种数据类型:String(字符串…...
Discuz发布原创AI帖子内容生成:起尔 | AI原创帖子内容生成插件开发定制
Discuz发布原创AI帖子内容生成:起尔 | AI原创帖子内容生成插件开发定制 在当今互联网快速发展的时代,内容创作成为了网站运营、社交媒体管理和个人博客维护不可或缺的一部分。然而,高质量内容的创作往往耗时耗力,特别是对于需要频…...
el-table在某些条件下禁止选中
el-table在某些条件下禁止选中 废话不多说直接上代码 HTML部分 <el-table v-loading"loading" :data"wmsShipmentOrderList" ref"multipleTable" select"handleSelect" selection-change"handleSelectionChange">&…...
深入探讨 HTTP 请求方法:GET、POST、PUT、DELETE 的实用指南
文章目录 引言GET 方法POST 方法PUT 方法DELETE 方法小结适用场景与特点总结最佳实践 在 API 设计中的重要性 引言 HTTP 协议的背景:介绍 HTTP(超文本传输协议)作为互联网的基础协议,自 1991 年发布以来,成为客户端和…...
深度学习:元学习(Meta-Learning)详解
元学习(Meta-Learning)详解 元学习,也称为“学会学习”,是机器学习中的一个重要子领域,旨在开发能够快速适应新任务或环境的模型,即使这些任务的可用数据非常有限。元学习的核心思想是通过经验学习如何学习…...
临沂建设企业网站/社群营销的十大步骤
Series 一种类似于一维数组的对象 Series 有values 和 index 属性 Series可以看成定长的有序字典 Series对象本身及其索引都有以一个name属性 DataFrame 表格型数据结构 最常用的构建方法:直接传入一个由等长列表或Numpy 数组组成的字典...
大连做网站价格/网址提交
javascript中的继承实现转载于:https://www.cnblogs.com/daishuguang/p/4190761.html...
沈阳企业模板建站/seo标题关键词怎么写
数据库性能优化:http://blog.csdn.net/yzsind/archive/2010/12/06/6059209.aspx javascript 触发事件列表http://www.blogjava.net/zeroline/archive/2010/12/19/341087.html 转载于:https://blog.51cto.com/yqsshr/454873...
安全员B本延期在那个网站做申请/网店seo排名优化
作者:瀚高PG实验室 (Highgo PG Lab)- 波罗 概要 pgbench是一种在PostgreSQL上运行基准测试的简单程序。 它可能在并发的数据库会话中一遍一遍地运行相同序列的 SQL 命令,并且计算平均事务率(每秒的事务数࿰…...
心连网网站/推广神器
在“新基建”全面推进,5G与AI技术掀起新一轮技术革命浪潮的今天,爆发的数据、算法、算力加速了许多产业的数智转型,对于各行业来说蕴含的时代机遇巨大。在技术与产业升级的背景下,需要应对众多集成与融合的技术创新需求࿰…...
泉州网站建设-泉州网站建设公司/百度app免费下载安装最新版
不久前,2019年国际篮联篮球世界杯让这个夏天的尾巴再度燃了起来!男篮在球场上身姿飞腾,让观众不禁拿起手机,疯狂按下快门记录着肆意飞扬的热血现场。输赢不论,那些个定格在镜头中的努力身影,都是一幅幅真实…...