OpenCV2简单的特征匹配

特征的匹配大致可以分为3个步骤:

  1. 特征的提取
  2. 计算特征向量
  3. 特征匹配

对于3个步骤,在OpenCV2中都进行了封装。所有的特征提取方法都实现FeatureDetector接口,DescriptorExtractor接口则封装了对特征向量(特征描述符)的提取,而所有特征向量的匹配都继承了DescriptorMatcher接口。

简单的特征匹配

int main()
{
    const string imgName1 = "x://image//01.jpg";
    const string imgName2 = "x://image//02.jpg";

    Mat img1 = imread(imgName1);
    Mat img2 = imread(imgName2);

    if (!img1.data || !img2.data)
        return -1;

    //step1: Detect the keypoints using SURF Detector
    int minHessian = 400;

    SurfFeatureDetector detector(minHessian);

    vector<KeyPoint> keypoints1, keypoints2;

    detector.detect(img1, keypoints1);
    detector.detect(img2, keypoints2);

    //step2: Calculate descriptors (feature vectors)
    SurfDescriptorExtractor extractor;
    Mat descriptors1, descriptors2;
    extractor.compute(img1, keypoints1, descriptors1);
    extractor.compute(img2, keypoints2, descriptors2);

    //step3:Matching descriptor vectors with a brute force matcher
    BFMatcher matcher(NORM_L2);
    vector<DMatch> matches;
    matcher.match(descriptors1, descriptors2,matches);

    //Draw matches
    Mat imgMatches;
    drawMatches(img1, keypoints1, img2, keypoints2, matches, imgMatches);

    namedWindow("Matches");
    imshow("Matches", imgMatches);

    waitKey();

    return 0;
}

 

  1. 实例化了一个特征提取器SurfFeatureDetector,其构造函数参数(minHessian)用来平衡提取到的特征点的数量和特征提取的稳定性的,对于不同的特征提取器改参数具有不同的含义和取值范围。
  2. 对得到的特征点提取特征向量(特征描述符)
  3. 匹配,上面代码使用了暴力匹配的方法,最后的匹配结果保存在vector<DMatch>中。

DMatch用来保存匹配后的结果

 

struct DMatch
{         //三个构造函数
    DMatch() :
    queryIdx(-1), trainIdx(-1), imgIdx(-1), distance(std::numeric_limits<float>::max()) {}
    DMatch(int  _queryIdx, int  _trainIdx, float  _distance) :
        queryIdx(_queryIdx), trainIdx(_trainIdx), imgIdx(-1), distance(_distance) {}
    DMatch(int  _queryIdx, int  _trainIdx, int  _imgIdx, float  _distance) : queryIdx(_queryIdx), trainIdx(_trainIdx), imgIdx(_imgIdx), distance(_distance) {}
    int queryIdx;  //此匹配对应的查询图像的特征描述子索引
    int trainIdx;   //此匹配对应的训练(模板)图像的特征描述子索引
    int imgIdx;    //训练图像的索引(若有多个)
    float distance;  //两个特征向量之间的欧氏距离,越小表明匹配度越高。
    bool operator < (const DMatch &m) const;
};

 

然后使用drawMatches方法可以匹配后的结构保存为Mat

时间: 2024-08-05 17:09:02

OpenCV2简单的特征匹配的相关文章

OpenCV2:特征匹配及其优化

在OpenCV2简单的特征匹配中对使用OpenCV2进行特征匹配的步骤做了一个简单的介绍,其匹配出的结果是非常粗糙的,在这篇文章中对使用OpenCV2进行匹配的细化做一个简单的总结.主要包括以下几个内容: DescriptorMatcher DMatcher KNN匹配 计算两视图的基础矩阵F,并细化匹配结果 计算两视图的单应矩阵H,并细化匹配结果 DescriptorMatcher 和 DMatcher DescriptorMatcher是匹配特征向量的抽象类,在OpenCV2中的特征匹配方法

Robotics Lab3 ——图像特征匹配、跟踪与相机运动估计

Robotics Lab3 --图像特征匹配.跟踪与相机运动估计 图像特征匹配 图像特征点 携带摄像头的机器人在运动过程中,会连续性地获取多帧图像,辅助其感知周围环境和自身运动.时间序列上相连的两幅或多幅图像,通常存在相同的景物,只是它们在图像中的位置不同.而位置的变换恰恰暗含了相机的运动,这时就需要相邻图像间的相似性匹配. 选取一大块图像区域进行运动估计是不可取的.已知图像在计算机内部是以数字矩阵的形式存储的,[如灰度图的每个元素代表了单个像素的灰度值].而对于点的提取和匹配较为方便,且和数字

[翻译]鲁棒的尺度不变特征匹配在遥感图像配准中应用(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]) 数字对象识别编

特征匹配篇

1. ORB特征匹配 BruteForce-Hamming匹配 //使用ORB特征匹配两张图片,并进行运行时间,对称性测试,ratio测试 #include <iostream> #include <ctime> //#include <dirent.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/non

目标跟踪之模板匹配---简单的模板匹配

一.概述 目标跟踪是计算机视觉领域的一个重要分支.研究的人很多,近几年也出现了很多很多的算法.大家看看淋漓满目的paper就知道了.但在这里,我们也聚焦下比较简单的算法,看看它的优势在哪里.毕竟有时候简单就是一种美. 在这里我们一起来欣赏下“模板匹配”这个简单点的跟踪算法.它的思想很简单,我们把要跟踪的目标保存好,然后在每一帧来临的时候,我们在整个图像中寻找与这个目标最相似的,我们就相信这个就是目标了.那如何判断相似呢?就用到了一些相关性的东西了,这个在我之前的一篇博文里面介绍过,大家可以参考下

特征检测和特征匹配方法

一幅图像中总存在着其独特的像素点,这些点我们可以认为就是这幅图像的特征,成为特征点.计算机视觉领域中的很重要的图像特征匹配就是一特征点为基础而进行的,所以,如何定义和找出一幅图像中的特征点就非常重要.这篇文章我总结了视觉领域最常用的几种特征点以及特征匹配的方法. 在计算机视觉领域,兴趣点(也称关键点或特征点)的概念已经得到了广泛的应用, 包括目标识别. 图像配准. 视觉跟踪. 三维重建等. 这个概念的原理是, 从图像中选取某些特征点并对图像进行局部分析,而非观察整幅图像. 只要图像中有足够多可检

OpenCV探索之路(二十三):特征检测和特征匹配方法汇总

http://www.cnblogs.com/skyfsm/p/7401523.html 一幅图像中总存在着其独特的像素点,这些点我们可以认为就是这幅图像的特征,成为特征点.计算机视觉领域中的很重要的图像特征匹配就是一特征点为基础而进行的,所以,如何定义和找出一幅图像中的特征点就非常重要.这篇文章我总结了视觉领域最常用的几种特征点以及特征匹配的方法. 在计算机视觉领域,兴趣点(也称关键点或特征点)的概念已经得到了广泛的应用, 包括目标识别. 图像配准. 视觉跟踪. 三维重建等. 这个概念的原理是

BF和FLANN特征匹配

BF特征点匹配原理:   暴力匹配 (段匹配) 1 #include <opencv2/opencv.hpp> 2 #include <opencv2/xfeatures2d.hpp> 3 #include <iostream> 4 5 using namespace cv; 6 using namespace std; 7 using namespace cv::xfeatures2d; 8 9 int main(int argc, char** argv) { 10

【特征匹配】SIFT原理之KD树+BBF算法解析

继上一篇中已经介绍了SIFT原理点击打开链接,最后得到了一系列特征点,每个特征点对应一个128维向量.假如现在有两副图片都已经提取到特征点,现在要做的就是匹配上相似的特征点. 相似性查询有两种基本方式:1.范围查询:即给点查询点和查询阈值,从数据集中找出所有与查询点距离小于阈值的点. 2.K近邻查询:给点查询点及正整数K,从数据集中找到与查询点最近的K个数据,当K=1时,就是最近邻查询. 特征匹配算子可以分为两类:1.穷举法:即将数据集中的点与查询点逐一计算距离,如果图1提取到N1个特征点,图2