特征匹配算法之误匹配的剔除

特征匹配


特征匹配是计算机视觉中经常要用到的一步。通过对图像与图像或者图像与地图之间的描述子进行准确匹配,我们可以为后续的姿态估计,优化等操作减轻大量负担。然而,由于图像特征的局部特性,误匹配的情况广泛存在。在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;
}

执行程序得到,匹配结果

暴力匹配

 

猜你喜欢

转载自www.cnblogs.com/feifanrensheng/p/9168627.html