openCV 图像拼接-全景图像
程序员文章站
2022-07-15 07:54:32
...
图像拼接,就是将多张图片拼接成一个大图,类似手机里的全景照片。按照某大神的思路,可以自己按照如下步骤实现:
- 对每幅图进行特征点提取
- 对对特征点进行匹配
- 进行图像配准
- 把图像拷贝到另一幅图像的特定位置
- 对重叠边界进行特殊处理
不过openCV已经提供了现成的函数(stitch)类实现此功能,此函数的特点就是慢,有多慢呢,我用手机拍了四张图片,中午睡一觉后,还没有拼接完成。于是换成了两张较小的图片,效果还是可以的。
#include "stdafx.h"
#include <iostream>
#include <io.h>
#include <string>
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include < opencv2\stitching.hpp >
using namespace std;
using namespace cv;
bool try_use_gpu = true;
int main(int argc, char * argv[])
{
vector<Mat> srcImgs;
Mat dstImage;
srcImgs.push_back(cv::imread("images/1.png"));
srcImgs.push_back(cv::imread("images/2.png"));
//srcImgs.push_back(cv::imread("images/3.jpg"));
//srcImgs.push_back(cv::imread("images/4.jpg"));
Stitcher stitcher = Stitcher::createDefault(try_use_gpu);
// 使用stitch函数进行拼接
Stitcher::Status status = stitcher.stitch(srcImgs, dstImage);
if (status != Stitcher::OK)
{
cout << "Can't stitch images, error code = " << int(status) << endl;
return -1;
}
imwrite("my.jpg", dstImage);
imshow("全景图像", dstImage);
if (waitKey() == 27)
return 0;
}
原图:
效果图: