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

特征匹配



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

特征匹配算法之误匹配的剔除的相关文章

视觉SLAM之RANSAC算法用于消除图像误匹配的原理

在基于特征点的视觉SLAM中,通常情况下,在特征匹配过程中往往会存在误匹配信息,使得计算获取的位姿精度低,易产生位姿估计失败的问题,因此,剔除这些错配点有很大的必要性.常会用到RANSAC算法进行消除两两匹配图像的误匹配点,如果只停留在应用的层面上很简单,直接调用opencv函数就行,看到效果时,感觉好神奇,到底怎么实现的啊,以前一直也没弄太明白,与图像结合的博客也比较少,在查阅了一些资料后,笔者似乎明白了一点,希望笔者的总结会对您的理解有帮助. 首先先介绍一下RANSAC算法(RANdom S

SIFT特征匹配算法介绍

原文路径:https://www.learnopencv.com/histogram-of-oriented-gradients/ 按语:偶得SIFT特征匹配算法原理介绍,此文章确通俗易懂,分享之! 1.图像尺度空间 在了解图像特征匹配前,需要清楚,两张照片之所以能匹配得上,是因为其特征点的相似度较高. 而寻找图像特征点,我们要先知道一个概念,就是“图像尺度空间”. 平时生活中,用人眼去看一张照片时,随着观测距离的增加,图像会逐渐变得模糊.那么计算机在“看”一张照片时,会从不同的“尺度”去观测照

OpenCV中特征点提取和匹配的通用方法

OpenCV在新版本中把很多C语言的代码都重新整理成了C++代码,让我们在使用的时候更加方便灵活.其中对于特征点的提取和匹配,充分体现了C++的强大.下面直接用例子来说明.假设我们有两幅图:1.bmp和2.bmp,要从中提取体征点并匹配,代码如下: // Load image from file IplImage *pLeftImage = cvLoadImage("1.bmp", CV_LOAD_IMAGE_GRAYSCALE);IplImage *pRightImage = cvL

使用Opencv2.4.9进行SIFT特征点提取和匹配

主要使用的类:FeatureDetector FeatureExtractor FeatureMatcher#include <opencv2/core/core.hpp> ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 <em id="__mceDel">

Opencv 各种特征点提取和匹配

opencv 特征点的提取和匹配 1. 当中的数据结构 KeyPoint这数据结构中有如下数据结构: class KeyPoint { Point2f pt; //坐标 float size; //特征点邻域直径 float angle; //特征点的方向,值为[零,三百六十),负值表示不使用 float response; int octave; //特征点所在的图像金字塔的组 int class_id; //用于聚类的id angle:角度,表示关键点的方向,SIFT算法通过对关键点周围邻域

捧腹网短笑话正则匹配-如何剔除网页源码的制表符

以捧腹网的短笑话为例,我们可以通过requests方法提取出网页的源代码,然后通过正则匹配来得到相关的短笑话 第一步,得到网页源码,使用requests的get方法,需要注意的是,网页默认编码是utf-8,我们需要指定编码格式为utf-8,才能正确显示出网页的文本信息 #-*- coding:utf-8 -*-import requestsimport re respon=requests.get('https://www.pengfu.com/xiaohua_1.html?qq-pf-to=p

[翻译]鲁棒的尺度不变特征匹配在遥感图像配准中应用(Robust Scale-Invariant Feature Matching for Remote Sensing Image Registration)

李乔亮,汪国有,刘建国,会员,IEEE,和陈少波 2008年8月7日接收;2008年10月22日和2008年11月27日修改.2009年2月2日首版:当前版本出版于2009年4月17日.本项工作由中国国家基础研究项目60672060资助. 中国湖北省武汉市华中科技大学模式识别与人工智能国家重点实验室,邮编430074(邮箱:[email protected];   [email protected];  [email protected];  [email protected]) 数字对象识别编

【特征匹配】RANSAC算法原理与源码解析

转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/50217655 随机抽样一致性(RANSAC)算法,可以在一组包含"外点"的数据集中,采用不断迭代的方法,寻找最优参数模型,不符合最优模型的点,被定义为"外点".在图像配准以及拼接上得到广泛的应用,本文将对RANSAC算法在OpenCV中角点误匹配对的检测中进行解析. 1.RANSAC原理 OpenCV中滤除误匹配对采用RANSAC算法寻找一个最佳

利用RANSAC算法筛选SIFT特征匹配

关于RANSAC算法的基本思想,可从网上搜索找到,这里只是RANSAC用于SIFT特征匹配筛选时的一些说明. RANSAC算法在SIFT特征筛选中的主要流程是: (1) 从样本集中随机抽选一个RANSAC样本,即4个匹配点对 (2) 根据这4个匹配点对计算变换矩阵M (3) 根据样本集,变换矩阵M,和误差度量函数计算满足当前变换矩阵的一致集consensus,并返回一致集中元素个数 (4) 根据当前一致集中元素个数判断是否最优(最大)一致集,若是则更新当前最优一致集 (5) 更新当前错误概率p,