akaze特征匹配怎么去掉不合适的点_OpenCV其他特征点检测

0d64cc36285ec91f3dd5c14d1a6d499c.png

特征点检测和描述算法的应用比较广泛。在OpenCV中,除了SIFT和SURF之外,还有一些特征点检测算法和特征点描述算子。如ORB、BRISK、FREAK、BRIEF、MSER、FAST、KAZE、AKAZE等。这些算法在opencv里的调用方式基本上都是一样的。

在这些算法中,BRIEF、FREAK属于特征点描述算子,其他的一般都是检测特征点和描述特征点一起的。SIFT和SURF的特征点描述方法比较复杂,虽然其描述算子比较稳定,但是也让时间复杂度比较高。BRIEF提出了一种二进制串的描述方法。BRIEF算法在特征点的邻域内根据高斯分布选择了一些点对,比如256对点,然后两两比较这些点对之间的大小,大的记为1,小的记为0,由此得到一个256位的二进制串,用这个二进制串来描述特征点。在进行特征点匹配的时候,通过计算特征点与特征点的256位二进制串的汉明距离来确定是否是匹配的点。汉明距离的概念其实很简单,就是计算两个字符串中对应位置号不同字符的个数。采用二进制串来描述特征点,则汉明距离就更加简单了,可以通过二进制串的位操作实现,速度非常快。

BRIEF算法的描述方式不具有旋转不变性,但是对于没有旋转的时候,匹配效果还是非常好的,关键是该方法的速度极快。所以,之后出现的特征点描述方法一般都采用二进制串来描述。ORB算法是在BRIEF算法上的改进。ORB算法改进的地方主要是让其具有旋转不变性,也就是在图像有旋转的情况下也可以匹配。

其他的特征点检测很描述算子在这里就不一一介绍原理了。有兴趣的可以查阅相关的文献。如果对这方面的研究比较感兴趣,相信写几篇论文还是没有问题的。对于应用而言,只要能用起来,也就可以了。注意一下,对于特征点描述算子,如BRIEF,需要先使用其他的特征点检测算法找出特征点,然后再进行描述算子的计算和匹配。总结一下这些特征点检测算子的使用方法。首先创建一个检测方法;然后进行特征点检测,这时候如果要在图像上看检测出来的点,可以进行特征点绘制;再次,进行特征点描述算子的计算,得到描述算子;最后,根据描述算子计算两幅图像的匹配点。如果所有点都进行匹配,会有一些错误的匹配点,而且,匹配的时间比较久。因此,一般选择匹配比较好的前面50或100个点进行匹配。具体选择多少点进行匹配与图像有关,这就要根据实际图像来确定了。下面看一下具体实现代码。这里的代码只是示意怎么使用这些特征点检测和描述算法,没有全部完成,有兴趣的可以自己去试一下每一个特征点检测和描述算子的使用效果。

#include <iostream>
#include <stdio.h>
#include "opencv2/core.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/features2d.hpp"
#include <features2d/features2d.hpp>
#include "opencv2/imgproc.hpp"
#include"opencv2/flann.hpp"
#include"opencv2/xfeatures2d.hpp"
 
using namespace cv;
using namespace std;
using namespace cv::xfeatures2d;
 
int main(int argc, char** argv)
{
 Mat src1, src2;
 src1 = imread("E: img1.ppm", 1);
 src2 = imread("E: img2.ppm", 1);
 vector<KeyPoint> keyPoint1, keyPoint2;
 //特征点检测算子
 Ptr<Feature2D> orb = ORB::create();
 orb->detect(src1, keyPoint1);
 orb->detect(src2, keyPoint2);
<Feature2D> fast = FastFeatureDetector::create(600);
 fast->detect(src1, keyPoint1);
 fast->detect(src2, keyPoint2);
Ptr<Feature2D> brisk = BRISK::create(100);
 brisk->detect(src1, keyPoint1);
 brisk->detect(src2, keyPoint2);
Ptr<Feature2D> mser = MSER::create();
 mser->detect(src1, keyPoint1);
 mser->detect(src2, keyPoint2);
Ptr<Feature2D> msd = MSDDetector::create();
 msd->detect(src1, keyPoint1);
 msd->detect(src2, keyPoint2);
Ptr<Feature2D> kaze = KAZE::create();
 kaze->detect(src1, keyPoint1);
 kaze->detect(src2, keyPoint2);
Ptr<Feature2D> akaze = AKAZE::create();
 akaze->detect(src1, keyPoint1);
 akaze->detect(src2, keyPoint2);
Ptr<Feature2D> agast = AgastFeatureDetector::create();
 agast->detect(src1, keyPoint1);
 agast->detect(src2, keyPoint2);
Ptr<Feature2D> gftt = GFTTDetector::create();
 gftt->detect(src1, keyPoint1);
 gftt->detect(src2, keyPoint2);
 
 //特征点描述算子
 Ptr<Feature2D> freak = FREAK::create();
 Ptr<Feature2D> brief = BriefDescriptorExtractor::create();
 //绘制特征点
 Mat result1, result2;
 drawKeypoints(src1, keyPoint1, result1, Scalar(0, 0, 255), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);//画出特征点
 namedWindow("src1特征点", 0);
 imshow("src1特征点", result1);
 drawKeypoints(src2, keyPoint2, result2, Scalar(0, 0, 255), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);//画出特征点
 namedWindow("src2特征点", 0);
 imshow("src2特征点", result2);
 //计算描述算子,可以试一下其他的描述算子
 Mat descriptors_1, descriptors_2;
 orb->compute(src1, keyPoint1, descriptors_1);
 orb->compute(src2, keyPoint2, descriptors_2);
 //计算匹配
 BFMatcher matcher;
 vector<DMatch> matches;
 matcher.match(descriptors_1, descriptors_2, matches);
 //绘制匹配结果
 Mat img_matches;
 drawMatches(src1, keyPoint1, src2, keyPoint2, matches, img_matches, Scalar(0, 0, 255), Scalar(0, 0, 255));
 namedWindow("match1", 0);
 imshow("match1", img_matches);
 
 //提取出前最佳匹配结果
 nth_element(matches.begin(), matches.begin() + 50, matches.end());
 //剔除掉其余的匹配结果
 matches.erase(matches.begin() + 50, matches.end());
 Mat img_matches2;
 drawMatches(src1, keyPoint1, src2, keyPoint2, matches, img_matches2, Scalar(0, 0, 255), Scalar(0, 0, 255));
 namedWindow("match2", 0);
 imshow("match2", img_matches2);
 
 waitKey(0);
 return 0;
}

下面的图示部分特征点检测算法匹配结果。

f189800f3e8e576adfa06ad695d89693.png
图1 orb匹配结果

992b2a408eb50391915591ecc93faf65.png
图2 BRISK匹配结果

e02857988c5320ad2a600485644d2c4c.png
图3 FAST检测特征点FREAK匹配

072595838a2175451a68c1d680856ac0.png
图4 FAST检测特征点,BRIEF匹配

617b198710512585ef2d37d4dd38b6d8.png
图5 MSER检测特征点,BRIEF匹配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值