OpenCv-C++-特征描述子(BruteForce(暴力匹配))
本片文主要是通过BFMatcher()来进行特征匹配,暴力匹配就是在一个数组或链表里面进行一一查找,循环匹配。如下图:
通过SURF算子分别找到两张图像的特征点,再使用BFMatcher函数对两张图像上的特征点进行一一检测和计算,最后通过drawMatches函数绘制两张图像之间的相似连接线。
下面附上源码:
#include<opencv2/opencv.hpp>
#include<iostream>
#include<opencv2/xfeatures2d.hpp>
#include<math.h>
using namespace cv;
using namespace std;
using namespace xfeatures2d;
Mat img1,img2;
int main(int argc, char** argv)
{
img1 = imread("D:/test/machesBook.png", 0);
img2 = imread("D:/test/Book.png", 0);
if (!img1.data||!img2.data)
{
cout << "图片未找到" << endl;
return -1;
}
imshow("Book", img1);
imshow("machesBook", img2);
//使用surf算子求特征点
int minHession = 400;
Ptr<SURF> detector = SURF::create(minHession);
vector<KeyPoint> keypoints_1;//img1的特征点存储
vector<KeyPoint> keypoints_2;//imh2的特征点存储
Mat descriptor_1, descriptor_2;
detector->detectAndCompute(img1,Mat(),keypoints_1,descriptor_1);//检测特征点并计算描述子
detector->detectAndCompute(img2, Mat(),keypoints_2, descriptor_2);
////使用BruteForce(暴力匹配)进行匹配
BFMatcher bfmatcher;
vector<DMatch> matchs; //存储里面的一些点的信息
bfmatcher.match(descriptor_1, descriptor_2, matchs, Mat());
Mat resultImg;
drawMatches(img1, keypoints_1, img2, keypoints_2, matchs, resultImg);
imshow("BruteForce demo", resultImg);
waitKey(0);
return 0;
}
运行结果:
1、匹配的图:
2、被匹配的图:
3、匹配结果:
可以看到,虽然能够匹配成功,但是特征的匹配并不是很精准。这是暴力匹配的弊端。