OpenCV用于计算光流的一个类cv::optflow::DualTVL1OpticalFlow

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

算法描述

cv::optflow::DualTVL1OpticalFlow 是 OpenCV 中用于计算光流的一个类,特别地,它实现了基于双帧 TV-L1(Total Variation - L1)模型的光流算法。这种算法以其在处理速度和准确性之间的良好平衡而著称,并且对光照变化具有一定的鲁棒性。

以下是关于 cv::optflow::DualTVL1OpticalFlow 类的一些基本信息:
主要特点

  • 高效性与准确性:该算法在保持较高精度的同时提供了相对快速的计算速度。
  • 鲁棒性:对于光照变化、噪声等具有一定抵抗能力。
  • 参数调节:支持多种参数调整,以便针对不同的应用场景进行优化。

成员函数介绍

✅ 静态创建函数

static Ptr<DualTVL1OpticalFlow> create();
创建一个默认参数配置的 DualTVL1OpticalFlow 实例。

✅ 核心计算函数

void calc(
    InputArray I0,           // 第一帧图像(灰度图)
    InputArray I1,           // 第二帧图像(灰度图)
    InputOutputArray flow    // 输出光流(2通道图像,每个像素为 (u, v))
);
用于计算两帧图像之间的光流。

✅ 参数设置函数

函数名描述
setTau(double val)设置时间步长(迭代优化的步长)
setLambda(double val)设置平滑项权重(越大越平滑)
setTheta(double val)设置对偶变量的松弛因子
setGamma(double val)设置数据项的正则化参数
setScalesNumber(int val)设置图像金字塔层数
setWarpingsNumber(int val)设置 warp 迭代次数
setEpsilon(double val)设置收敛精度
setMaxIters(int val)设置最大迭代次数

代码示例

#include <opencv2/opencv.hpp>
#include <opencv2/optflow.hpp>

using namespace cv;
using namespace std;

// 可视化光流向量为 HSV 图像
Mat visualizeFlow( const Mat& flow )
{
    vector< Mat > planes;
    split( flow, planes );

    Mat mag, angle;
    cartToPolar( planes[ 0 ], planes[ 1 ], mag, angle, true );
    normalize( mag, mag, 0, 1, NORM_MINMAX );

    Mat hsv[ 3 ];
    hsv[ 0 ] = angle;
    hsv[ 1 ] = Mat::ones( angle.size(), CV_32F );
    hsv[ 2 ] = mag;

    Mat hsvFull;
    merge( hsv, 3, hsvFull );
    hsvFull.convertTo( hsvFull, CV_8U, 255.0 );
    Mat rgbOut;
    cvtColor( hsvFull, rgbOut, COLOR_HSV2BGR );

    return rgbOut;
}

int main()
{
    // 加载两帧灰度图像
    Mat frame1 = imread( "/media/dingxin/data/study/OpenCV/sources/images/left01.jpg", IMREAD_GRAYSCALE );
    Mat frame2 = imread( "/media/dingxin/data/study/OpenCV/sources/images/right01.jpg", IMREAD_GRAYSCALE );

    if ( frame1.empty() || frame2.empty() )
    {
        cerr << "无法加载图像!" << endl;
        return -1;
    }

    // 创建 DualTVL1 实例
    Ptr< optflow::DualTVL1OpticalFlow > tvl1 = optflow::DualTVL1OpticalFlow::create();

    // 计算稠密光流
    Mat flow;
    tvl1->calc( frame1, frame2, flow );

    // 可视化并显示
    Mat flowImage = visualizeFlow( flow );
    imshow( "Frame 1", frame1 );
    imshow( "Frame 2", frame2 );
    imshow( "Dual TV-L1 Optical Flow", flowImage );
    waitKey( 0 );

    return 0;
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村北头的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值