1 // OpenCV_Align.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
2
3 #include <iostream>
4
5 #include <opencv2/opencv.hpp>
6 #include <opencv2/xfeatures2d.hpp>
7 #include <opencv2/features2d.hpp>
8 using namespace std;
9 using namespace cv;
10 using namespace cv::xfeatures2d;
11
12
13 /**
14 *
15 * @param im1 对齐图像
16 * @param im2 模板图像
17 * @finalMatches 匹配图像
18 * @param im1Reg 输出图像
19 * @param h
20 */
21 void alignImages(Mat &im1, Mat &im2, Mat &finalMatches,Mat &im1Reg, Mat &h)
22 {
23 // Convert images to grayscale
24 Mat im1Gray, im2Gray;
25 cvtColor(im1, im1Gray, COLOR_BGR2GRAY);
26 cvtColor(im2, im2Gray, COLOR_BGR2GRAY);
27
28 // Variables to store keypoints and descriptors
29 vector<KeyPoint> keypoints1, keypoints2;
30 Mat descriptors1, descriptors2;
31
32
33 Ptr<ORB> orb = ORB::create(1000); //最大数目感觉是对特征点计算Harris得分排序,这个数最好大一点,1000-5000
34 orb->setFastThreshold(20);//Fast角点检测中用来确定候选点和角点的比较数目阈值,这个数最好小一点,5-10左右。太大有可能提取不到几个点,再经过细筛就没了
35
36 orb->detectAndCompute(im1Gray, Mat(), keypoints1, descriptors1);
37 orb->detectAndCompute(im2Gray, Mat(), keypoints2, descriptors2);
38
39 // Match features.
40 vector<DMatch> matches, matchesGMS;
41
42 //FALNN匹配的计算速度会比暴力匹配快些,但是点相对稳定性差些
43
44 Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");
45 matcher->match(descriptors1, descriptors2, matches, Mat());
46
47 cout << "matches: " << matches.size() << endl;
48
49 matchGMS(im1.size(), im2.size(), keypoints1, keypoints2, matches, matchesGMS);
50 cout << "matchesGMS: " << matchesGMS.size() << endl;
51
52
53
54 drawMatches(im1, keypoints1, im2, keypoints2, matchesGMS, finalMatches);
55
56
57 vector<Point2f> points1, points2;
58 for (size_t i = 0; i < matchesGMS.size(); i++)
59 {
60 //queryIdx是对齐图像的描述子和特征点的下标。
61 points1.push_back(keypoints1[matchesGMS[i].queryIdx].pt);
62 //queryIdx是是样本图像的描述子和特征点的下标。
63 points2.push_back(keypoints2[matchesGMS[i].trainIdx].pt);
64 }
65
66
67 // Find homography
68 h = findHomography(points1, points2, RANSAC);
69
70 // Use homography to warp image
71 warpPerspective(im1, im1Reg, h, im2.size());
72 }
73
74
75 int main()
76 {
77 // Read image to be aligned
78 string imFilename("D:/222.jpg");
79 cout << "Reading image to align : " << imFilename << endl;
80 Mat im = imread(imFilename);
81
82 // Read reference image
83 string refFilename("D:/refer.jpg");
84 cout << "Reading reference image : " << refFilename << endl;
85 Mat imReference = imread(refFilename);
86
87 // Registered image will be resotred in imReg.
88 // The estimated homography will be stored in h.
89 Mat im_Aligned, h, final_Match;
90
91 double detecttime = (double)getTickCount();
92 // Align images
93 cout << "Aligning images ..." << endl;
94 alignImages(im, imReference, final_Match,im_Aligned, h);
95
96
97
98 //计算检测时间
99 detecttime = ((double)getTickCount() - detecttime) / getTickFrequency();
100 printf("-----cost time-------:%7.3fs\n", detecttime);
101
102
103 // Write aligned image to disk.
104 string outFilename("aligned.jpg");
105 cout << "Saving aligned image : " << outFilename << endl;
106 imwrite(outFilename, im_Aligned);
107 imwrite("matches.jpg", final_Match);
108
109 // Print estimated homography
110 cout << "Estimated homography : \n" << h << endl;
111 system("pause");
112 return 0;
113 }