- 操作系統: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;
}