首页 > 学院 > 开发设计 > 正文

opencv全景拼接

2019-11-06 08:05:13
字体:
来源:转载
供稿:网友

偶然看到一篇博客讲如何使用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图片全景拼接详解


上一篇:13(多线程)

下一篇:对Map的排序

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表