- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
cv::Stitcher 类是OpenCV中用于实现图像拼接功能的一个高级接口。它简化了从一组部分重叠的图像创建全景图的过程,隐藏了许多底层细节,如特征检测、匹配、变换估计等,使得用户可以更容易地进行图像拼接操作。
主要成员函数
-
create
创建一个 cv::Stitcher 实例。
参数:- Mode mode: 可选参数,默认为 Mode::PANORAMA。用于指定拼接模式,另一个选项是 Mode::SCANS。
-
estimateTransform
计算输入图像之间的变换关系,但不执行实际的拼接操作。
参数:- InputArrayOfArrays images: 输入图像数组,通常是一个包含多个 cv::Mat 对象的 std::vectorcv::Mat。
返回值: 返回状态码(如 Stitcher::OK 或错误代码),指示是否成功估计了变换矩阵。
-
composePanorama
根据之前通过 estimateTransform 方法计算出的变换关系,将输入图像组合成全景图。
参数:- OutputArray pano: 输出的全景图,类型为 cv::Mat。
返回值: 返回状态码,指示是否成功生成全景图。
-
stitch
直接从输入图像生成全景图,相当于先调用 estimateTransform 再调用 composePanorama。
参数:- InputArrayOfArrays images: 输入图像数组,通常是一个包含多个 cv::Mat 对象的 std::vectorcv::Mat。
- OutputArray pano: 输出的全景图,类型为 cv::Mat。
返回值: 返回状态码,指示整个拼接过程是否成功完成。
-
setRegistrationResol 和 getRegistrationResol
设置和获取特征匹配阶段的工作分辨率(以百万像素为单位)。
参数 (setRegistrationResol):- float resol: 特征匹配阶段的目标工作分辨率,单位为百万像素。
-
setSeamEstimationResol 和 getSeamEstimationResol
设置和获取缝合线估计阶段的工作分辨率(以百万像素为单位)。
参数 (setSeamEstimationResol):- float resol: 缝合线估计阶段的目标工作分辨率,单位为百万像素。
-
setCompositingResol 和 getCompositingResol
设置和获取合成阶段的工作分辨率(以百万像素为单位)。
参数 (setCompositingResol):
float resol: 合成阶段的目标工作分辨率,单位为百万像素。 -
setPanoConfidenceThresh 和 getPanoConfidenceThresh
设置和获取全景图置信度阈值,用于过滤不良图像。
参数 (setPanoConfidenceThresh):- float conf_thresh: 置信度阈值,范围一般在0到1之间。
-
setWaveCorrection 和 getWaveCorrection
设置和获取是否启用波浪校正(wave correction),用于校正曝光差异。
参数 (setWaveCorrection):- bool flag: 是否启用波浪校正。
-
setWaveCorrectKind 和 getWaveCorrectKind
设置和获取波浪校正类型,可以是水平、垂直或两者。
参数 (setWaveCorrectKind):- WaveCorrectKind kind: 波浪校正类型,可选值包括 WAVE_CORRECT_HORIZ, WAVE_CORRECT_VERT, 或 WAVE_CORRECT_AUTO。
代码示例
#include <opencv2/opencv.hpp>
#include <opencv2/stitching.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
// 加载待拼接的图像
vector< Mat > images;
images.push_back( imread( "/media/dingxin/data/study/OpenCV/sources/images/stich1.png" ) );
images.push_back( imread( "/media/dingxin/data/study/OpenCV/sources/images/stich2.png" ) );
// 创建Stitcher实例
Ptr< Stitcher > stitcher = Stitcher::create();
// 定义输出全景图
Mat pano;
// 执行拼接
Stitcher::Status status = stitcher->stitch( images, pano );
if ( status != Stitcher::OK )
{
cout << "图像拼接失败." << endl;
return -1;
}
// 显示结果
imshow( "拼接1", images[0] );
imshow( "拼接2", images[1] );
imshow( "全景图", pano );
waitKey( 0 );
return 0;
}
运行结果
、、、、、
拼接效果美美哒