特征匹配
特征匹配是计算机视觉中经常要用到的一步。通过对图像与图像或者图像与地图之间的描述子进行准确匹配,我们可以为后续的姿态估计,优化等操作减轻大量负担。然而,由于图像特征的局部特性,误匹配的情况广泛存在。在opencv的匹配算法中
实际上集成了一些对误匹配的处理。我们首先介绍一下暴力匹配算法。
暴力匹配
cv::BFMatcher
暴力匹配是指依次查找(穷举搜索)第一组中每个描述符与第二组中哪个描述符最接近。当然初始的暴力匹配得到的误匹配很多。我们可以通过交叉匹配过滤的方法对误匹配进行一定程度的剔除。
这种技术的思想是用查询集来匹配训练描述符,反之亦然。只返回在这两个匹配中同时出现的匹配。当有足够多的匹配时,这种技术在离群值数目极少的情况下通常会产生最佳效果。
在cv::BFMatcher类中可进行交叉匹配。为了能进行交叉检测实验,要创建cv::BFMatcher类的实例,需将构造函数的第二个参数设置为true:
cv::BFMatcher matcher2( NORM_HAMMING, true);
如果不设置第二个参数,则是正常的暴力匹配算法
我们可以对这两种匹配的结果,进行对比
环境:ubuntu16.04 , opencv-3.1.0
使用ORB特征
代码如下
#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/highgui/highgui.hpp> using namespace std; using namespace cv; int main( int argc, char** argv) { if ( argc != 3 ) { cout<<"usage: feature_extraction img1 img2"<<endl; return 1; } Mat img1 = imread( argv[1], CV_LOAD_IMAGE_COLOR ); Mat img2 = imread( argv[2], CV_LOAD_IMAGE_COLOR ); // std::vector<KeyPoint> keypoints_1, keypoints_2; Mat descriptors_1, descriptors_2; Ptr<ORB> orb = ORB::create( 500, 1.2f, 8, 31, 0, 2, ORB::HARRIS_SCORE,31,20 ); // orb->detect(img1, keypoints_1); orb->detect(img2, keypoints_2); // orb->compute(img1, keypoints_1, descriptors_1); orb->compute(img2, keypoints_2, descriptors_2); // BFMatcher matcher1( NORM_HAMMING ); vector<DMatch> matches1; matcher1.match(descriptors_1, descriptors_2, matches1); //cv::Ptr<cv::DescriptorMatcher> matcher(new cv::BFMatcher(cv::NORM HAMMING, true)); //use in opencv2.x BFMatcher matcher2( NORM_HAMMING, true); vector<DMatch> matches2; matcher2.match(descriptors_1, descriptors_2, matches2); Mat img_match1; Mat img_match2; drawMatches(img1, keypoints_1, img2, keypoints_2, matches1, img_match1 ); drawMatches(img1, keypoints_1, img2, keypoints_2, matches2, img_match2 ); imshow("BFMatcher", img_match1); imshow("jiao cha match", img_match2); waitKey(0); return 0; }
执行程序得到,匹配结果
暴力匹配
原文地址:https://www.cnblogs.com/feifanrensheng/p/9168627.html
时间: 2024-10-16 20:41:04