c++ opencv mat_实战 | OpenCV 实现多张图像拼接

点击上方“计算机视觉life”,选择“星标”

快速获得最新干货

本文转载自OpenCV学堂,主要介绍图像拼接Stitch模块算法流程与代码使用介绍

拼接算法

OpenCV中从2.4.x版本之后多出来一个新的模型 图像拼接,该模块通过简单的高级API设置,可以获得比较好的图像拼接效果,OpenCV官方提供了一个高度集成的API函数 Stitcher,只要两行代码就可以得到一个很好的拼接图像。

Ptr stitcher = Stitcher::create(mode);
Stitcher::Status status = stitcher->stitch(imgs, pano);

其中第一行代码是创建拼接Stitcher的指针,第二行代码是调用拼接算法,

  • imgs表示的输入参数,是一系列Mat对象的vector。

  • pano表示的输出结果,是拼接之后的Mat对象

官方的例子得到效果是非常的好,输入的images如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
压缩包中包含的具体内容: 对给定数据中的6个不同场景图像,进行全景图拼接操作,具体要求如下: (1) 寻找关键点,获取关键点的位置和尺度信息(DoG检测子已由KeypointDetect文件夹中的detect_features_DoG.m文件实现;请参照该算子,自行编写程序实现Harris-Laplacian检测子)。 (2) 在每一幅图像中,对每个关键点提取待拼接图像的SIFT描述子(编辑SIFTDescriptor.m文件实现该操作,运行EvaluateSIFTDescriptor.m文件检查实现结果)。 (3) 比较来自两幅不同图像的SIFT描述子,寻找匹配关键点(编辑SIFTSimpleMatcher.m文件计算两幅图像SIFT描述子间的Euclidean距离,实现该操作,运行EvaluateSIFTMatcher.m文件检查实现结果)。 (4) 基于图像中的匹配关键点,对两幅图像进行配准。请分别采用最小二乘方法(编辑ComputeAffineMatrix.m文件实现该操作,运行EvaluateAffineMatrix.m文件检查实现结果)和RANSAC方法估计两幅图像间的变换矩阵(编辑RANSACFit.m 文件中的ComputeError()函数实现该操作,运行TransformationTester.m文件检查实现结果)。 (5) 基于变换矩阵,对其中一幅图像进行变换处理,将其与另一幅图像进行拼接。 (6) 对同一场景的多幅图像进行上述操作,实现场景的全景图拼接(编辑MultipleStitch.m文件中的makeTransformToReferenceFrame函数实现该操作)。可以运行StitchTester.m查看拼接结果。 (7) 请比较DoG检测子和Harris-Laplacian检测子的实验结果。图像拼接的效果对实验数据中的几个场景效果不同,请分析原因。 已经实现这些功能,并且编译运行均不报错!
### 回答1: 可以使用OpenCV中的`hconcat`或`vconcat`函数来实现两个Mat拼接,具体操作如下: ```cpp Mat mat1, mat2; // 假设有两个Mat对象 Mat concatMat; // 用于存放拼接后的Mat // 水平拼接 hconcat(mat1, mat2, concatMat); // 垂直拼接 vconcat(mat1, mat2, concatMat); ``` 其中,`hconcat`函数用于水平拼接,`vconcat`函数用于垂直拼接。需要注意的是,两个Mat对象在进行拼接时,其通道数和深度必须相同。如果两个Mat对象的大小不一样,可以使用`resize`函数将其大小调整到一致。 ### 回答2: 在OpenCV中,可以使用函数`cv::hconcat()`和`cv::vconcat()`来实现两个`cv::Mat`的拼接。 `cv::hconcat()`函数用于将两个Mat水平拼接在一起,即将第二个Mat的列连接到第一个Mat的右侧。示例代码如下: ``` cv::Mat result; cv::hconcat(mat1, mat2, result); ``` 其中,`mat1`和`mat2`是要拼接的两个Mat,`result`是拼接后的结果Mat。 `cv::vconcat()`函数用于将两个Mat垂直拼接在一起,即将第二个Mat的行连接到第一个Mat的下方。示例代码如下: ``` cv::Mat result; cv::vconcat(mat1, mat2, result); ``` 同样,`mat1`和`mat2`是要拼接的两个Mat,`result`是拼接后的结果Mat。 需要注意的是,两个Mat的类型和通道数必须相同。如果需要拼接Mat的大小不一致,可以使用`cv::resize()`函数对其中一个Mat进行缩放,使其与另一个Mat的大小一致后再进行拼接。 以上就是使用OpenCV中的函数实现两个Mat拼接的方法。 ### 回答3: 在OpenCV中,我们可以使用cv::hconcat()函数将两个Mat对象水平拼接在一起。具体操作如下: 1. 首先,我们需要确保两个Mat对象的列数相同。如果它们的列数不同,我们可以使用cv::resize()函数来使它们的列数一致。 2. 然后,我们可以使用cv::hconcat()函数将两个拼接在一起。该函数的参数是一个存储拼接结果的输出Mat对象和两个待拼接的输入Mat对象。 下面是一个示例代码: ```cpp #include <opencv2/opencv.hpp> int main() { cv::Mat src1 = cv::imread("image1.jpg"); cv::Mat src2 = cv::imread("image2.jpg"); cv::resize(src1, src1, cv::Size(src2.cols, src2.rows)); cv::Mat result; cv::hconcat(src1, src2, result); cv::imwrite("result.jpg", result); return 0; } ``` 在这个示例中,我们首先读取了两张图片并将它们存储在两个Mat对象(src1和src2)中。然后,我们使用cv::resize()函数将src1的尺寸调整为与src2相同。最后,使用cv::hconcat()函数将src1和src2水平拼接在一起,结果存储在result中。通过使用cv::imwrite()函数,我们将结果保存为一张新的图片。 希望这个回答对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值