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

OpenCV稠密光流估计的一个类cv::optflow::DenseRLOFOpticalFlow

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

算法描述

cv::optflow::DenseRLOFOpticalFlow 是OpenCV 中用于稠密光流估计的一个类,属于optflow模块。它是RLOF(Regularized Location-Only Flow)算法的一种实现,用于计算视频帧之间的像素级运动矢量。

DenseRLOFOpticalFlow 是一种基于稀疏特征匹配 + 插值的稠密光流算法,其主要特点包括:

  • 基于稀疏特征点(如 FAST、ORB)进行初始匹配;
  • 使用正则化插值方法将稀疏匹配扩展为全图像素级别的光流场(稠密光流);
  • 可以处理大位移运动(相比传统 LK 光流更鲁棒);
  • 支持自定义特征检测器和描述子;
  • 适用于视频稳定、动作分析、视频插值等任务。

常用静态方法

1.创建函数

static Ptr<DenseRLOFOpticalFlow> cv::optflow::DenseRLOFOpticalFlow::create
( 	Ptr< RLOFOpticalFlowParameter >  	rlofParam = Ptr< RLOFOpticalFlowParameter >(),float  	forwardBackwardThreshold = 1.f,Size  	gridStep = Size(6, 6),InterpolationType  	interp_type = InterpolationType::INTERP_EPIC,int  	epicK = 128,float  	epicSigma = 0.05f,float  	epicLambda = 999.0f,int  	ricSPSize = 15,int  	ricSLICType = 100,bool  	use_post_proc = true,float  	fgsLambda = 500.0f,float  	fgsSigma = 1.5f,bool  	use_variational_refinement = false ) 		

参数:

参数名类型默认值说明
rlofParamPtrnullptr可选:自定义参数对象。如果传入,则其他参数将被忽略。
forwardBackwardThresholdfloat1.0f正向/反向一致性检查的阈值。用于剔除不一致的匹配点。值越大越宽松。
gridStepSize(6, 6)稠密插值时使用的网格步长。值越小,插值越密集,计算量越大。
interp_typeInterpolationTypeInterpolationType::INTERP_EPIC插值类型,可选:INTERP_LINEAR, INTERP_EPIC, INTERP_RIC
epicKint128EPIC 插值中使用的邻域大小。控制局部特征的范围。
epicSigmafloat0.05fEPIC 中高斯核的标准差,影响平滑程度。
epicLambdafloat999.0fEPIC 中正则化系数,防止过拟合。值越大越平滑。
ricSPSizeint15RIC 插值中的超像素大小。仅在使用 INTERP_RIC 时有效。
ricSLICTypeint100SLIC 超像素分割类型。仅在使用 INTERP_RIC 时有效。
use_post_procbooltrue是否启用后处理步骤(如去噪、平滑)。
fgsLambdafloat500.0fFGS 后处理中的正则化系数。控制平滑强度。
fgsSigmafloat1.5fFGS 后处理中的高斯核标准差。
use_variational_refinementboolfalse是否使用变分优化进一步提升精度(会显著增加计算时间)。
  1. calc(InputArray I0, InputArray I1, OutputArray flow) 计算从 I0 到 I1 的光流
  2. setFeatureDetector(Ptr detector) 设置自定义特征检测器
  3. setFeaturesToTrack(int numFeatures) 设置每帧中最多使用的特征点数

代码示例


#include <opencv2/opencv.hpp>
#include <opencv2/optflow/rlofflow.hpp>using namespace cv;
using namespace std;
// 将光流向量转换为 HSV 图像以便可视化
Mat visualizeFlow( const Mat& flow )
{vector< Mat > planes;   // ✅ 正确声明 planes 为 vector<Mat>split( flow, planes );  // 自动拆分为两个通道:x-flow 和 y-flowMat mag, angle;cartToPolar( planes[ 0 ], planes[ 1 ], mag, angle, true );  // 计算幅度和角度normalize( mag, mag, 0, 1, NORM_MINMAX );  // 归一化到 [0, 1]// HSV 颜色空间可视化Mat hsv[ 3 ];hsv[ 0 ] = angle;                              // Hue = 方向hsv[ 1 ] = Mat::ones( angle.size(), CV_32F );  // Saturation = 1hsv[ 2 ] = mag;                                // Value = 幅度Mat hsvFull;merge( hsv, 3, hsvFull );                    // 合并三个通道hsvFull.convertTo( hsvFull, CV_8U, 255.0 );  // 转换为 8U 类型用于显示Mat rgbOut;cvtColor( hsvFull, rgbOut, COLOR_HSV2BGR );  // 转换为 BGR 显示图像return rgbOut;
}
int main()
{// 读取两帧图像(灰度图)Mat frame1 = imread( "/media/dingxin/data/study/OpenCV/sources/images/left01.jpg", IMREAD_COLOR );Mat frame2 = imread( "/media/dingxin/data/study/OpenCV/sources/images/right01.jpg", IMREAD_COLOR );if ( frame1.empty() || frame2.empty() ){cerr << "无法加载图像!" << endl;return -1;}// 创建 DenseRLOF 实例并设置高级参数Ptr< optflow::DenseRLOFOpticalFlow > rlof = optflow::DenseRLOFOpticalFlow::create( nullptr,               // 使用默认参数对象1.0f,                  // forwardBackwardThresholdSize( 8, 8 ),          // gridStepoptflow::INTERP_EPIC,  // interp_type128,                   // epicK0.05f,                 // epicSigma1000.0f,               // epicLambda15,                    // ricSPSize100,                   // ricSLICTypetrue,                  // use_post_proc500.0f,                // fgsLambda1.5f,                  // fgsSigmafalse                  // use_variational_refinement);// 计算稠密光流Mat flow;rlof->calc( frame1, frame2, flow );// 可视化结果Mat flowImage = visualizeFlow( flow );imshow( "Frame 1", frame1 );imshow( "Frame 2", frame2 );imshow( "Dense RLOF Optical Flow", flowImage );waitKey( 0 );return 0;
}

运行结果

在这里插入图片描述

http://www.dtcms.com/a/282936.html

相关文章:

  • hashMap原理(一)
  • FAISS深度学习指南:构建高效向量检索系统的完整方法论
  • SSH连接复用技术在海外云服务器环境下的稳定性验证与优化方案
  • [时序数据库-iotdb]时序数据库iotdb的安装部署
  • 【C++】迭代器
  • 第五章 管道工程 5.4 管道安全质量控制
  • 【前端】HTML语义标签的作用与实践
  • 想删除表中重复数据,只留下一条,sql怎么写
  • 1688商品API全链路开发实践
  • Reddit Karma是什么?Post Karma和Comment Karma的提升指南
  • 搭建基于Gitee文档笔记自动发布
  • 达梦数据库配置兼容MySQL
  • Vue + Element UI 实现单选框
  • [特殊字符] 第1篇:什么是SQL?数据库是啥?我能吃吗?
  • LeafletJS 进阶:GeoJSON 与动态数据可视化
  • UI测试平台TestComplete:关键字驱动测试技巧
  • 【ArcGISPro】修改conda虚拟安装包路径
  • Mybatis的SQL编写—XML方式
  • 无人机EIS增稳技术要点分析
  • 牛客:HJ26 字符串排序[华为机考][map]
  • web:js提示框、询问框、输入框的使用
  • React 条件渲染完全指南
  • 题解:P13256 [GCJ 2014 #2] Data Packing
  • 新版本Cursor中配置自定义MCP服务器教程,附MCP工具开发实战源码
  • 棱镜观察|比亚迪“全责兜底”智能泊车!“减配”风潮接踵而至
  • realsense应用--rs-distance(距离测量)
  • 中国旅行社协会在京召开“文旅人工智能应用研讨会”,助力文旅创新发展
  • 分块(chunked) vs 滑动窗口(windowed)
  • 【25-cv-07929】Keith携Lisa Audit向日葵画作发案
  • 性能测试过程中监控linux服务器资源情况