偶然看到一篇博客讲如何使用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)进行拼接。它的结果如下:
平面风格的拼接结果如下:
柱面风格如下:
立体风格:
可以看出,不进行任何设置直接拼接也就是拼接的默认方式是柱面拼接风格。立体拼接时得到的图是竖着的,这里为了便于观看将图像旋转为水平的。
参考的博客链接如下:
opencv实现图像的拼接功能
opencv图片全景拼接详解
新闻热点
疑难解答