//特征就是角点
//ORB特征具有速度快的优点,可以用于实时提取。
//ORB:FAST关键点+BRIEF 描述子
//FAST是一种角点,主要是检测局部像素灰度变化明显的地方,苏地块。FAST思想:如果一个像素与它邻域的像素差别较大,那他可能是角点。
//FAST提取步骤:
//BRIEF 描述子:描述关键点周围像素的信息,(外观相似的特征应该有相似的描述子),采用二进制编码,取周围128个像素,当像素灰度值大于临近像素则为1,反之为0.由于FAST的改进,秒速自有有scale,rorate不变性.
//两种匹配模式:暴力匹配,快速最近邻匹配。
1.暴力匹配:测量描述子之间的距离(通常采用汉明距离和欧氏距离),汉明距离是采用BRIEF二进制描述子进行匹配,浮点型描述子用欧式距离匹配。
2.暴力匹配产生的特征点较多,采用FLANN方法可以提高质量,降低计算量。
//读取图像,加载ORB模块
//读取图像
Mat img_1 = imread("C:\\Users\\Administrator\\Pictures\\1.png");
Mat img_2 = imread("C:\\Users\\Administrator\\Pictures\\2.png");
std::vector<KeyPoint> keypoints_1, keypoints_2;
Mat descriptors_1, descriptors_2;
//加载ORD模块
Ptr<ORB> orb = ORB::create();
//FAST关键点
//1.检测Oriented Fast焦点位置
orb->detect(img_1, keypoints_1);
orb->detect(img_2, keypoints_2);
//BRIEF描述子
//2.根据焦点位置计算BRIEF描述子
orb->compute(img_1, keypoints_1, descriptors_1);
orb->compute(img_2, keypoints_2, descriptors_2);
//绘制角点
Mat outimg1;
//绘制FAST关键点
drawKeypoints(img_1, keypoints_1, outimg1, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
imshow("ORB特征点", outimg1);
//3.对两幅图像中的BRIEF描述子进行匹配,使用Hamming距离
vector<DMatch> matches;
//加载汉明距离
BFMatcher matcher(NORM_HAMMING);
//两幅图BRIEF匹配
matcher.match(descriptors_1, descriptors_2, matches);
///由于暴力匹配产生的匹配点较多,所以建立筛选条件
//3.对两幅图像中的BRIEF描述子进行匹配,使用Hamming距离
vector<DMatch> matches;
//加载汉明距离
BFMatcher matcher(NORM_HAMMING);
//两幅图BRIEF匹配
matcher.match(descriptors_1, descriptors_2, matches);
//对比两次筛选
//5.绘制匹配结果
Mat img_match;
Mat img_goodmatch;
drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_match);
drawMatches(img_1, keypoints_1, img_2, keypoints_2, good_matches, img_goodmatch);
imshow("所有匹配点对", img_match);
imshow("优化后匹配点对",img_goodmatch);
waitKey(0);
return 1;