理论部分戳这个ORB特征提取与匹配
C++代码如下:
#include<opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include<opencv2/features2d.hpp>
using namespace cv;
using namespace std;
/////////////////////ORB特征匹配变量声明///////////////////////
vector<KeyPoint> keypoints1, keypoints2;
Mat descriptors1, descriptors2;
Ptr<FeatureDetector> detector = ORB::create(500);
Ptr<DescriptorExtractor> descriptor = ORB::create(500);
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");
////////////////////////////end/////////////////////////////////
int main()
{
Mat img1 = imread("11.jpg");
Mat img2 = imread("car.jpg");
Mat orbimg;
imshow("1", img1);
imshow("2", img2);
detector->detect(img1, keypoints1);
descriptor->compute(img1, keypoints1, descriptors1);
detector->detect(img2, keypoints2);
descriptor->compute(img2, keypoints2, descriptors2);
vector<DMatch>matches;
matcher->match(descriptors1, descriptors2, matches);
double min_dist = 10000, max_dist = 0;
for (int i = 0; i < descriptors1.rows; i++)
{
double dist = matches[i].distance;
if (dist < min_dist) min_dist = dist;
if (dist > max_dist) max_dist = dist;
}
min_dist = min_element(matches.begin(), matches.end(), [](const DMatch& m1, const DMatch& m2) {return m1.distance < m2.distance; })->distance;
max_dist = max_element(matches.begin(), matches.end(), [](const DMatch& m1, const DMatch& m2) {return m1.distance < m2.distance; })->distance;
cout << min_dist << endl;
cout << max_dist << endl;
std::vector< DMatch > good_matches;
for (int i = 0; i < descriptors1.rows; i++)
{
if (matches[i].distance <= max(2 * min_dist, 30.0))
{
good_matches.push_back(matches[i]);
}
}
for (int i = 0; i < 10; i++)
{
cout << good_matches[i].distance << endl;
}
drawMatches(img1, keypoints1, img2, keypoints2, good_matches, orbimg, Scalar::all(-1),
Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
imwrite("orbing.jpg", orbimg);
imshow("orbimg", orbimg);
waitKey(0);
return 0;
}
匹配结果: