C++运用opencv进行二维多张全景图拼接


此为一项目工程文件,实现运用opencv进行二维多张全景图拼接,其中包括运用opencv自带Stitcher类的例子代码实现的.cpp文件,还包括两个运用sift 特征匹配拼接的.cpp文件,其中一个是设置匹配重叠权重,还包括测试几张图片,配置环境opencv2.4.10+VS2010或VS2013。
资源截图
代码片段和文件信息
#include “highgui/highgui.hpp“    
#include “opencv2/nonfree/nonfree.hpp“    
#include “opencv2/legacy/legacy.hpp“   

using namespace cv;

//计算原始图像点位在经过矩阵变换后在目标图像上对应位置  
Point2f getTransformPoint(const Point2f originalPoint const Mat &transformMaxtri);

int main(int argc char *argv[])
{
Mat image01 = imread(“img1.jpg“);
Mat image02 = imread(“img2.jpg“);
imshow(“拼接图像1“ image01);
imshow(“拼接图像2“ image02);

//灰度图转换  
Mat image1 image2;
cvtColor(image01 image1 CV_RGB2GRAY);
cvtColor(image02 image2 CV_RGB2GRAY);

//提取特征点    
SiftFeatureDetector siftDetector(800);  // 海塞矩阵阈值  
vector keyPoint1 keyPoint2;
siftDetector.detect(image1 keyPoint1);
siftDetector.detect(image2 keyPoint2);

//特征点描述,为下边的特征点匹配做准备    
SiftDescriptorExtractor siftDescriptor;
Mat imageDesc1 imageDesc2;
siftDescriptor.compute(image1 keyPoint1 imageDesc1);
siftDescriptor.compute(image2 keyPoint2 imageDesc2);

//获得匹配特征点,并提取最优配对     
FlannbasedMatcher matcher;
vector matchePoints;
matcher.match(imageDesc1 imageDesc2 matchePoints Mat());
sort(matchePoints.begin() matchePoints.end()); //特征点排序    
//获取排在前N个的最优匹配特征点  
vector imagePoints1 imagePoints2;
for (int i = 0; i < 10; i++)
{
imagePoints1.push_back(keyPoint1[matchePoints[i].queryIdx].pt);
imagePoints2.push_back(keyPoint2[matchePoints[i].trainIdx].pt);
}

//获取图像1到图像2的投影映射矩阵,尺寸为3*3  
Mat homo = findHomography(imagePoints1 imagePoints2 CV_RANSAC);
Mat adjustMat = (Mat_(3 3) << 1.0 0 image01.cols 0 1.0 0 0 0 1.0);
Mat adjustHomo = adjustMat*homo;

//获取最强配对点在原始图像和矩阵变换后图像上的对应位置,用于图像拼接点的定位  
Point2f originallinkPoint targetlinkPoint basedImagePoint;
originallinkPoint = keyPoint1[matchePoints[0].queryIdx].pt;
targetlinkPoint = getTransformPoint(originallinkPoint adjustHomo);
basedImagePoint = keyPoint2[matchePoints[0].trainIdx].pt;

//图像配准  
Mat imageTransform1;
warpPerspective(image01 imageTransform1 adjustMat*homo Size(image02.cols + image01.cols + 10 image02.rows));

//在最强匹配点的位置处衔接,最强匹配点左侧是图1,右侧是图2,这样直接替换图像衔接不好,光线有突变  
Mat ROIMat = image02(Rect(Point(basedImagePoint.x 0) Point(image02.cols image02.rows)));
ROIMat.copyTo(Mat(imageTransform1 Rect(targetlinkPoint.x 0 image02.cols - basedImagePoint.x + 1 image02.rows)));

namedWindow(“拼接结果“ 0);
imshow(“拼接结果“ imageTransform1);
imwrite(“result1.jpg“ imageTransform1);
waitKey();
return 0;
}

//计算原始图像点位在经过矩阵变换后在目标图像上对应位置  
Point2f getTransformPoint(const Point2f originalPoint const Mat &transformMaxtri)
{
Mat originelP targetP;
originelP = (Mat_(3 1) << originalPoint.x originalPoint.y 1.0);
targetP = transformMaxtri*originelP;
float x = targetP.at(0 0) / targetP.at(2 0);
float y = targetP.at(1 0) / targetP.at(2 0);
return Point2f(x y);
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     113664  2018-01-15 11:28  imageStitchingDebugimageStitching.exe

     文件     759616  2018-01-15 11:28  imageStitchingDebugimageStitching.ilk

     文件    2248704  2018-01-15 11:28  imageStitchingDebugimageStitching.pdb

     文件     507274  2012-05-21 16:54  imageStitchingDebugimg1.jpg

     文件     500875  2012-05-21 16:54  imageStitchingDebugimg2.jpg

     文件     497205  2012-05-21 16:54  imageStitchingDebugimg3.jpg

     文件    2467340  2018-01-15 11:36  imageStitchingDebug
esult.jpg

     文件     317368  2012-04-25 04:25  imageStitchingDebug bb_debug.dll

     文件       4508  2016-10-23 20:58  imageStitchingimageStitchingDebugBuildLog.htm

     文件       1074  2018-01-15 11:12  imageStitchingimageStitchingDebugimageStitching.Build.CppClean.log

     文件         45  2016-11-08 10:58  imageStitchingimageStitchingDebugimageStitching.lastbuildstate

     文件       7554  2018-01-15 11:28  imageStitchingimageStitchingDebugimageStitching.log

     文件       1390  2018-01-15 11:28  imageStitchingimageStitchingDebugimageStitching.tlogcl.command.1.tlog

     文件      38284  2018-01-15 11:28  imageStitchingimageStitchingDebugimageStitching.tlogCL.read.1.tlog

     文件        766  2018-01-15 11:28  imageStitchingimageStitchingDebugimageStitching.tlogCL.write.1.tlog

     文件        161  2018-01-15 11:28  imageStitchingimageStitchingDebugimageStitching.tlogimageStitching.lastbuildstate

     文件      13280  2018-01-15 11:28  imageStitchingimageStitchingDebugimageStitching.tloglink.command.1.tlog

     文件      35242  2018-01-15 11:28  imageStitchingimageStitchingDebugimageStitching.tloglink.read.1.tlog

     文件        408  2018-01-15 11:28  imageStitchingimageStitchingDebugimageStitching.tloglink.write.1.tlog

     文件          0  2016-11-08 10:58  imageStitchingimageStitchingDebugimageStitching.unsuccessfulbuild

     文件         67  2012-05-21 16:58  imageStitchingimageStitchingDebugmt.dep

     文件    2457971  2012-05-21 17:10  imageStitchingimageStitchingDebug
esult.jpg

     文件     445806  2018-01-15 11:28  imageStitchingimageStitchingDebugstitching.obj

     文件     560128  2018-01-15 11:28  imageStitchingimageStitchingDebugvc120.idb

     文件    1265664  2018-01-15 11:28  imageStitchingimageStitchingDebugvc120.pdb

     文件       3757  2012-05-21 16:58  imageStitchingimageStitchingimageStitching.vcproj

     文件       1421  2016-10-23 20:58  imageStitchingimageStitchingimageStitching.vcproj.GuoDafeng-PC.Guo Dafeng.user

     文件       1441  2012-05-22 16:58  imageStitchingimageStitchingimageStitching.vcproj.HP98402794308.Administrator.user

     文件       4962  2018-01-15 11:16  imageStitchingimageStitchingimageStitching.vcxproj

     文件        934  2018-01-15 11:16  imageStitchingimageStitchingimageStitching.vcxproj.filters

............此处省略53个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)