//参考网站
// http://blog.youkuaiyun.com/xukaiwen_2016/article/details/53149794
// http://blog.youkuaiyun.com/dcrmg/article/details/52629856
//http://blog.youkuaiyun.com/czl389/article/details/60325970 (*)
方法1
VS2010 +OpenCV2.4.9
#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);
static void ShowHelpText();
int main(int argc,char *argv[])
{
system("color 5F");
ShowHelpText();
//Mat image01=imread(argv[1]);
//Mat image02=imread(argv[2]);
Mat image01,image02;
if (argc < 2)
{
image01 = imread("left.jpg");
image02 = imread("right.jpg");
}
else
{
image01 = imread(argv[1]);
image02 = imread(argv[2]);
}
if (image01.empty() || image02.empty())
{
return 0;//图像没有全部读取成功
}
//
imshow("拼接图像1",image01);
imshow("拼接图像2",image02);
//灰度图转换
Mat image1,image2;
cvtColor(image01,image1,CV_RGB2GRAY);
cvtColor(image02,image2,CV_RGB2GRAY);
//提取特征点
SiftFeatureDetector siftDetector(800); // 海塞矩阵阈值
vector<KeyPoint> keyPoint1,keyPoint2;
siftDetector.detect(image1,keyPoint1);
siftDetector.detect(image2,keyPoint2);
//特征点描述,为下边的特征点匹配做准备
SiftDescriptorExtractor siftDescriptor;
Mat imageDesc1,imageDesc2;
siftDescriptor.compute(image1,keyPoint1,imageDesc1);
siftDescriptor.compu