偶然看到一篇博客讲如何使用opencv实现图片全景拼接,自己也照着他的代码实现了下,由于不太适应原作者代码形式,本人对代码进行了小小的改动。如下是本人的代码。
#include <iostream>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\stitching\stitcher.hpp>
using namespace std;
using namespace cv;
void main()
{
vector<Mat> imgs;
char iname[256] = { '0' };
int i = 1;
while (true)
{
sprintf_s(iname, "p%d.jpg", i);
Mat img = imread(iname);
if (img.empty())
{
cout << "cannot read image" << endl;
break;
}
else
{
sprintf_s(iname, "pimg%d", i);
imshow(iname, img);
imgs.push_back(img);
}
i++;
}
Mat pano;
Stitcher stic = Stitcher::createDefault();
//最简单的拼接
//Stitcher::Status status = stic.stitch(imgs, pano);
//if (status != Stitcher::OK)
//{
//cout << "cannot stitch images!" << endl;
//}
//else
//{
// imshow("pinjie", pano);
// imwrite("pinjie.jpg", pano);
//}
//比较复杂的拼接(设置拼接风格及特征点寻找方式)
//拼接风格
//PlaneWarper* cw = new PlaneWarper();
//SphericalWarper* cw = new SphericalWarper();
StereographicWarper* cw = new StereographicWarper();
stic.setWarper(cw);
//寻找特征点的方式
detail::SurfFeaturesFinder* featureFinder = new detail::SurfFeaturesFinder();
stic.setFeaturesFinder(featureFinder);
//匹配图像及估计相机旋转
Stitcher::Status status = stic.estimateTransform(imgs);
if (status != Stitcher::OK)
{
cout << "cannot stitch images!" << endl;
}
//拼接图像
status = stic.composePanorama(pano);
if (status != Stitcher::OK)
{
cout << "cannot stitch images!" << endl;
}
else
{
imshow("pinjie", pano);
imwrite("pinjie.jpg", pano);
}
waitKey(0);
}
输入的三幅图分别如下:
最简单的拼接指的是对拼接风格,特征点提取方式都不进行设置直接调用stic.stitch(imgs, pano)进行拼接。它的结果如下:
平面风格的拼接结果如下:
柱面风格如下:
立体风格:
可以看出,不进行任何设置直接拼接也就是拼接的默认方式是柱面拼接风格。立体拼接时得到的图是竖着的,这里为了便于观看将图像旋转为水平的。
参考的博客链接如下: