图像特征描述子:即图像中每个像素位置的描述,通过此描述去匹配另一张图像是否含有相同特征。
描述子与匹配:Brute-Force匹配(暴力匹配)
代码
#include "../common/common.hpp"
using namespace cv::xfeatures2d;
void main(int argc, char** argv)
{
Mat img1 = imread(getCVImagesPath("images/box.png"), IMREAD_GRAYSCALE);
Mat img2 = imread(getCVImagesPath("images/box_in_scene.png"), IMREAD_GRAYSCALE);
imshow("image1", img1);
imshow("image2", img2);
int minHessian = 400;
Ptr<SURF> detector = SURF::create(minHessian); // 也可以用 SIFT 特征
vector<KeyPoint> keypoints_1; // 保存特征点
vector<KeyPoint> keypoints_2;
Mat descriptor_1, descriptor_2; // 特征描述子
detector->detectAndCompute(img1, Mat(), keypoints_1, descriptor_1, false); // SURF特征检测,同时计算生成对应描述子
detector->detectAndCompute(img2, Mat(), keypoints_2, descriptor_2, false); // 参数 false 表示不适用提供的keypoints,让自己算
cout << "keypoints_1.size=" << keypoints_1.size() << endl; // keypoints_1.size=786
cout << "keypoints_2.size=" << keypoints_2.size() << endl; // keypoints_2.size = 1040
// descriptor_1 depth=5, type=5, size=[64 x 786] CV_32F单通道 每个关键点用64来描述?
cout << "descriptor_1 depth=" << descriptor_1.depth() << ", type=" << descriptor_1.type() << ", size=" << descriptor_1.size() << endl;
// descriptor_2 depth = 5, type = 5, size = [64 x 1040]
cout << "descriptor_2 depth=" << descriptor_2.depth() << ", type=" << descriptor_2.type() << ", size=" << descriptor_2.size() << endl;
BFMatcher matcher(NORM_L2); // Brute-Force 匹配,参数表示匹配的方式,默认NORM_L2(欧几里得) ,NORM_L1(绝对值的和)
vector<DMatch> matches; // 保存匹配的结果
matcher.match(descriptor_1, descriptor_2, matches); // 暴力匹配
cout << "matches.size=" << matches.size() << endl; // matches.size = 786
Mat matchesImg;
drawMatches(img1, keypoints_1, img2, keypoints_2, matches, matchesImg); // 显示匹配的结果
imshow("Descriptor Match", matchesImg);
waitKey(0);
}