资源简介

VS2012 x64+opencv做的图像拼接,参照了别人的代码改编。 做的是左右拼接,上下的行不行没试过。 主要函数就是图像的储存位置,需要在代码里改下 测试了下还是比较稳健的,拼接效果尚可,不过重叠部分可能产生鬼影,另外接缝处有小裂缝,如果不满意,可再设计方法优化 所有代码均含注释,浅显易懂,含测试图片 运行时请自行配置好头文件和lib文件目录

资源截图

代码片段和文件信息

#include 
#include 
#include   
#include   
#include 
#include 
#include   
#include   

using namespace cv; 
using namespace std; 

int main()
{
initModule_nonfree();//初始化模块,使用SIFT或SURF时用到 
Ptr detector = FeatureDetector::create( “SURF“ );//创建SIFT特征检测器,可改成SURF/ORB
PtrriptorExtractor> descriptor_extractor = DescriptorExtractor::create( “SURF“ );//创建特征向量生成器,可改成SURF/ORB
PtrriptorMatcher> descriptor_matcher = DescriptorMatcher::create( “BruteForce“ );//创建特征匹配器  
if( detector.empty() || descriptor_extractor.empty() )  
cout<<“fail to create detector!“;  

//读入图像  
Mat img1 = imread(“E://1.jpg“);  
Mat img2 = imread(“E://2.jpg“);  

//特征点检测  
double t = getTickCount();//当前滴答数  
vector m_LeftKeym_RightKey;  
detector->detect( img1 m_LeftKey );//检测img1中的SIFT特征点,存储到m_LeftKey中  
detector->detect( img2 m_RightKey );  
cout<<“图像1特征点个数:“< cout<<“图像2特征点个数:“<
//根据特征点计算特征描述子矩阵,即特征向量矩阵  
Mat descriptors1descriptors2;  
descriptor_extractor->compute( img1 m_LeftKey descriptors1 );  
descriptor_extractor->compute( img2 m_RightKey descriptors2 );  
t = ((double)getTickCount() - t)/getTickFrequency();  
cout<<“SIFT算法用时:“<
cout<<“图像1特征描述矩阵大小:“<riptors1.size()  
<<“,特征向量个数:“<riptors1.rows<<“,维数:“<riptors1.cols< cout<<“图像2特征描述矩阵大小:“<riptors2.size()  
<<“,特征向量个数:“<riptors2.rows<<“,维数:“<riptors2.cols<
//画出特征点  
Mat img_m_LeftKeyimg_m_RightKey;  
drawKeypoints(img1m_LeftKeyimg_m_LeftKeyScalar::all(-1)0);  
drawKeypoints(img2m_RightKeyimg_m_RightKeyScalar::all(-1)0);  
//imshow(“Src1“img_m_LeftKey);  
//imshow(“Src2“img_m_RightKey);  

//特征匹配  
vector matches;//匹配结果  
descriptor_matcher->match( descriptors1 descriptors2 matches );//匹配两个图像的特征矩阵  
cout<<“Match个数:“<
//计算匹配结果中距离的最大和最小值  
//距离是指两个特征向量间的欧式距离,表明两个特征的差异,值越小表明两个特征点越接近  
double max_dist = 0;  
double min_dist = 100;  
for(int i=0; i {  
double dist = matches[i].distance;  
if(dist < min_dist) min_dist = dist;  
if(dist > max_dist) max_dist = dist;  
}  
cout<<“最大距离:“< cout<<“最小距离:“<
//筛选出较好的匹配点  
vector goodMatches;  
for(int i=0; i {  
if(matches[i].distance < 0.2 * max_dist)  
{  
goodMatches.push_back(matches[i]);  
}  
}  
cout<<“goodMatch个数:“<
//画出匹配结果  
Mat img_matches;  
//红色连接的是匹配的特征点对,绿色是未匹配的特征点  
drawMatches(img1m_LeftKeyimg2m_RightKeygoodMatchesimg_matches  
Scalar::all(-1)/*CV_RGB(25500)*/CV_RGB(02550)Mat()2);  

imshow(“MatchSIFT“img_matches);  
IplImage result=

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2014-04-09 21:15  SIFT_RANSAC\
     目录           0  2014-04-09 13:52  SIFT_RANSAC\Debug\
     文件     2591744  2014-04-09 13:51  SIFT_RANSAC\Debug\SIFT_RANSAC.pdb
     目录           0  2014-04-09 12:47  SIFT_RANSAC\Release\
     文件       38400  2014-04-09 12:47  SIFT_RANSAC\Release\SIFT_RANSAC.exe
     文件     1428480  2014-04-09 12:47  SIFT_RANSAC\Release\SIFT_RANSAC.pdb
     目录           0  2014-04-09 13:56  SIFT_RANSAC\SIFT_RANSAC\
     文件    15925248  2014-04-09 21:15  SIFT_RANSAC\SIFT_RANSAC.sdf
     文件        1254  2014-04-01 20:39  SIFT_RANSAC\SIFT_RANSAC.sln
     文件       23552  2014-04-09 21:15  SIFT_RANSAC\SIFT_RANSAC.v11.suo
     目录           0  2014-04-09 13:52  SIFT_RANSAC\SIFT_RANSAC\Debug\
     文件         632  2014-04-09 13:33  SIFT_RANSAC\SIFT_RANSAC\Debug\cl.command.1.tlog
     文件       24170  2014-04-09 13:33  SIFT_RANSAC\SIFT_RANSAC\Debug\CL.read.1.tlog
     文件         360  2014-04-09 13:33  SIFT_RANSAC\SIFT_RANSAC\Debug\CL.write.1.tlog
     文件           2  2014-04-09 13:52  SIFT_RANSAC\SIFT_RANSAC\Debug\link-cvtres.read.1.tlog
     文件           2  2014-04-09 13:52  SIFT_RANSAC\SIFT_RANSAC\Debug\link-cvtres.write.1.tlog
     文件           2  2014-04-09 13:52  SIFT_RANSAC\SIFT_RANSAC\Debug\link-rc.read.1.tlog
     文件           2  2014-04-09 13:52  SIFT_RANSAC\SIFT_RANSAC\Debug\link-rc.write.1.tlog
     文件           2  2014-04-09 13:52  SIFT_RANSAC\SIFT_RANSAC\Debug\link.command.1.tlog
     文件           2  2014-04-09 13:52  SIFT_RANSAC\SIFT_RANSAC\Debug\link.read.1.tlog
     文件           2  2014-04-09 13:52  SIFT_RANSAC\SIFT_RANSAC\Debug\link.write.1.tlog
     文件          68  2014-04-09 13:52  SIFT_RANSAC\SIFT_RANSAC\Debug\SIFT_RANSAC.lastbuildstate
     文件        1381  2014-04-09 13:52  SIFT_RANSAC\SIFT_RANSAC\Debug\SIFT_RANSAC.log
     文件           0  2014-04-09 13:52  SIFT_RANSAC\SIFT_RANSAC\Debug\SIFT_RANSAC.unsuccessfulbuild
     文件      789504  2014-04-09 13:33  SIFT_RANSAC\SIFT_RANSAC\Debug\vc110.idb
     文件     1699840  2014-04-09 13:33  SIFT_RANSAC\SIFT_RANSAC\Debug\vc110.pdb
     文件      756038  2014-04-09 13:33  SIFT_RANSAC\SIFT_RANSAC\Debug\源.obj
     目录           0  2014-04-09 12:47  SIFT_RANSAC\SIFT_RANSAC\Release\
     文件         652  2014-04-09 11:48  SIFT_RANSAC\SIFT_RANSAC\Release\cl.command.1.tlog
     文件       24014  2014-04-09 11:48  SIFT_RANSAC\SIFT_RANSAC\Release\CL.read.1.tlog
     文件         368  2014-04-09 11:48  SIFT_RANSAC\SIFT_RANSAC\Release\CL.write.1.tlog
............此处省略210个文件信息

评论

共有 条评论