Sift和Surf算法应验两幅28365365的处理是相似的的,次要分为4个宗派。:

  • 3. 经过婚配点,出示折合矩阵,图像1用于折合矩阵以出示映照图像。

处理1、2、3,没什么可说的。,铰链是在试图贿赂4中布告拼接宗派。。在这边,we的所有格形式率先应用一种更复杂的办法来拼接。:

  • 2. 应用映照矩阵折合,图像1的最强婚配点尾随到得第二名整合。
  • 3. 新图像上最强婚配点的映照整合。,衔接两幅图像,反面的图像完整是图像1。,右翼完整是图像2。

安排前提一直完整静止选择。,前提选择误解的婚配特点点,拼接必要的破产,这是第一最强的婚配点。,作为拼接点。

棘手的用例一原始图1:


棘手的用例一原始图2:


筛缝效应:


冲浪安排引起:


在这种情况下,最强的婚配点坐落于白色车的在附近。,你可以布告折痕相似的的算术。,这是这两幅戏剧性的场面的拼接线。,前提在拼接点处的光前提有互换,前提FI,拼接后,在衔接处会特别的无理的。,像,冲浪影片剪辑。。安排引起SIFT如同比冲浪好非常。。

棘手的用例两个原始图1:


棘手的用例两个原始图2:


筛缝效应:


冲浪安排引起:


上面是OpenCV的应验。:

#include "highgui/"  
#include "opencv2/nonfree/"  
#include "opencv2/legacy/" 

using namespace cv;

计算矩阵后原始图像的对应得第二名
Point2f getTransformPoint(const Point2f originalPoint,const Mat &transformMaxtri);

int 主(int) argc,char *argv[])  
{  
	Mat image01=imread(argv[1]);  
	Mat image02=imread(argv[2]);
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;  
	(image1,keyPoint1);  
	(image2,keyPoint2);	

特点点特性描述,预备上面的特点点婚配。  
	SiftDescriptorExtractor siftDescriptor;  
	Mat imageDesc1,imageDesc2;  
	(image1,keyPoint1,imageDesc1);  
	(image2,keyPoint2,imageDesc2);	

获取婚配特点点,并摘要姣姣者一只。  	
	FlannBasedMatcher matcher;
	vector matchePoints;  
	(imageDesc1,imageDesc2,matchePoints,Mat());
	sort((),()); 特点点排序
获取后面列出的姣姣者婚配特点点
	vector imagePoints1,imagePoints2;
为(int) i=0;i<10;i++)
	{		
		(keyPoint1[matchePoints[i].queryIdx].pt);		
		(keyPoint2[matchePoints[i].trainIdx].pt);		
	}

	//获取图像1到图像2的尾随映照矩阵,尺寸为3*3
	Mat homo=findHomography(imagePoints1,imagePoints2,CV_RANSAC);		
	Mat adjustMat=(Mat_(3,3)<<);
	Mat adjustHomo=adjustMat*homo;

	//获取最强一只点在原始图像和矩阵折合后图像上的对应得第二名,用于28365365点的定位
	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());

	//在最强婚配点的得第二名处衔接,最强婚配点反面是图1,右侧是图2,这样直接替换图像衔接不好,光线有突变
	Mat ROIMat=image02(Rect(Point(),Point()));	
	(Mat(imageTransform1,Rect()));

	namedWindow("拼接结果",0);
	imshow("拼接结果",imageTransform1);	
	waitKey();  
	return 0;  
}

计算矩阵后原始图像的对应得第二名
Point2f getTransformPoint(const Point2f originalPoint,const Mat &transformMaxtri)
{
	Mat originelP,targetP;
	originelP=(Mat_(3,1)<<);
	targetP=transformMaxtri*originelP;
	float x=(0,0)/(2,0);
	float y=(1,0)/(2,0);
	return Point2f(x,y);
}

属于侧身移动在的孔隙,有一清算条件是按必然使变堆叠加图1和图2的堆叠宗派,图2堆叠的比率是1。,朝向图1的轴承。,离横越越远,图1的分量越来越大。,图2的分量越来越低。,应验畜舍过渡战场该思惟优化组合的行为准则列举如下。:

#include "highgui/"  
#include "opencv2/nonfree/"  
#include "opencv2/legacy/" 

using namespace cv;

计算矩阵后原始图像的对应得第二名
Point2f getTransformPoint(const Point2f originalPoint,const Mat &transformMaxtri);

int 主(int) argc,char *argv[])  
{  
	Mat image01=imread(argv[1]);  
	Mat image02=imread(argv[2]);
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;  
	(image1,keyPoint1);  
	(image2,keyPoint2);	

特点点特性描述,预备上面的特点点婚配。  
	SiftDescriptorExtractor siftDescriptor;  
	Mat imageDesc1,imageDesc2;  
	(image1,keyPoint1,imageDesc1);  
	(image2,keyPoint2,imageDesc2);	

获取婚配特点点,并摘要姣姣者一只。  	
	FlannBasedMatcher matcher;
	vector matchePoints;  
	(imageDesc1,imageDesc2,matchePoints,Mat());
	sort((),()); 特点点排序
获取后面列出的姣姣者婚配特点点
	vector imagePoints1,imagePoints2;
为(int) i=0;i<10;i++)
	{		
		(keyPoint1[matchePoints[i].queryIdx].pt);		
		(keyPoint2[matchePoints[i].trainIdx].pt);		
	}

	//获取图像1到图像2的尾随映照矩阵,尺寸为3*3
	Mat homo=findHomography(imagePoints1,imagePoints2,CV_RANSAC);		
	Mat adjustMat=(Mat_(3,3)<<);
	Mat adjustHomo=adjustMat*homo;

	//获取最强一只点在原始图像和矩阵折合后图像上的对应得第二名,用于28365365点的定位
	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());

	//在最强婚配点反面的堆叠区域进行累加,是衔接稳定过渡,消除突变
	Mat image1Overlap,image2Overlap; //图1和图2的堆叠宗派	
	image1Overlap=imageTransform1(Rect(Point(targetLinkPoint.x-),Point()));
	image2Overlap=image02(Rect(0,0,));
	Mat image1ROICopy=();  //复制一份图1的堆叠宗派
为(int) i=0;i<)
	{
	为(int) j=0;j<)
		{
			double weight;
			weight=(double)j/image1Overlap.cols;  //随距离使转动而使转动的叠加系数
			(i,j)[0]=(1-weight)*(i,j)[0]+weight*(i,j)[0];
			(i,j)[1]=(1-weight)*(i,j)[1]+weight*(i,j)[1];
			(i,j)[2]=(1-weight)*(i,j)[2]+weight*(i,j)[2];
		}
	}
	Mat ROIMat=image02(Rect(Point(),Point()));	 //图2中不重合的宗派
	(Mat(imageTransform1,Rect(targetLinkPoint.x,0, ROIMat.cols,image02.rows))); //不重合的宗派直接衔接上去
	namedWindow("拼接结果",0);
	imshow("拼接结果",imageTransform1);	
	imwrite("D:\\拼接结果.jpg",imageTransform1);
	waitKey();  
	return 0;  
}

计算矩阵后原始图像的对应得第二名
Point2f getTransformPoint(const Point2f originalPoint,const Mat &transformMaxtri)
{
	Mat originelP,targetP;
	originelP=(Mat_(3,1)<<);
	targetP=transformMaxtri*originelP;
	float x=(0,0)/(2,0);
	float y=(1,0)/(2,0);
	return Point2f(x,y);
}

筛缝效应:


冲浪安排引起:


结合处的线使液化了。,缺勤不连贯的使转动的光被查看。,根本应验。无缝的拼接

棘手的用例1:


棘手的用例2:


安排引起: