Opencv的KeyPoint和DMatch数据结构

/*
 * Struct for matching: query descriptor index, train descriptor index, train image index and distance between descriptors.
 */
 /*
  * DMatch主要用来储存匹配信息的结构体,query是要匹配的描述子,train是被匹配的描述子,在Opencv中进行匹配时
  * void DescriptorMatcher::match( const Mat& queryDescriptors, const Mat& trainDescriptors, vector<DMatch>& matches, const Mat& mask ) const
  * match函数的参数中位置在前面的为query descriptor,后面的是 train descriptor
  * 例如:query descriptor的数目为20,train descriptor数目为30,则DescriptorMatcher::match后的vector<DMatch>的size为20
  * 若反过来,则vector<DMatch>的size为30
  *
 */
struct CV_EXPORTS_W_SIMPLE DMatch
{
    //默认构造函数,FLT_MAX是无穷大
    //#define FLT_MAX         3.402823466e+38F        /* max value */
    CV_WRAP DMatch() : queryIdx(-1), trainIdx(-1), imgIdx(-1), distance(FLT_MAX) {}
    //DMatch构造函数
    CV_WRAP DMatch( int _queryIdx, int _trainIdx, float _distance ) :
            queryIdx(_queryIdx), trainIdx(_trainIdx), imgIdx(-1), distance(_distance) {}
    //DMatch构造函数
    CV_WRAP DMatch( int _queryIdx, int _trainIdx, int _imgIdx, float _distance ) :
            queryIdx(_queryIdx), trainIdx(_trainIdx), imgIdx(_imgIdx), distance(_distance) {}  

    //queryIdx为query描述子的索引,match函数中前面的那个描述子
    CV_PROP_RW int queryIdx; // query descriptor index
    //trainIdx为train描述子的索引,match函数中后面的那个描述子
    CV_PROP_RW int trainIdx; // train descriptor index
    //imgIdx为进行匹配图像的索引
    //例如已知一幅图像的sift描述子,与其他十幅图像的描述子进行匹配,找最相似的图像,则imgIdx此时就有用了。
    CV_PROP_RW int imgIdx;   // train image index
    //distance为两个描述子之间的距离
    CV_PROP_RW float distance;
    //DMatch比较运算符重载,比较的是DMatch中的distance,小于为true,否则为false
    // less is better
    bool operator<( const DMatch &m ) const
    {
        return distance < m.distance;
    }
};

  

KeyPoint这数据结构中有如下数据结构(http://docs.opencv.org/3.3.0/d2/d29/classcv_1_1KeyPoint.html):

angle:角度,表示关键点的方向,通过Lowe大神的论文可以知道,为了保证方向不变形,SIFT算法通过对关键点周围邻域进行梯度运算,求得该点方向。-1为初值。

class_id:当要对图片进行分类时,我们可以用class_id对每个特征点进行区分,未设定时为-1,需要靠自己设定

octave:代表是从金字塔哪一层提取的得到的数据。

pt:关键点点的坐标

response:响应程度,代表该点强壮大小—response代表着该关键点how good,更确切的说,是该点角点的程度。

size:该点直径的大小

时间: 2024-10-13 11:45:15

Opencv的KeyPoint和DMatch数据结构的相关文章

opencv中keypoint数据结构分析

分析opencv中keypoint数据结构的相关信息,找到opencv的document(http://docs.opencv.org/java/org/opencv/features2d/KeyPoint.html).可以看到KeyPoint这数据结构中有如下数据结构: angle:角度,表示关键点的方向,通过Lowe大神的论文可以知道,为了保证方向不变形,SIFT算法通过对关键点周围邻域进行梯度运算,求得该点方向.-1为初值. class_id:当要对图片进行分类时,我们可以用class_i

Opencv笔记(1) 数据结构的命名规则(CvMat,...)

网上查了很多,发现查资料不如查源码 以Cv为开头的类,都是不含有具体数据的(仅仅存储指针) CvMat typedef struct CvMat { int type; int step; /* for internal use only */ int* refcount; int hdr_refcount; union { uchar* ptr; short* s; int* i; float* fl; double* db; } data; <pre name="code"

keypoint &amp;&amp; DMatch

下面单独介绍KEYPOINT 与DMatch的内在联系 1 std::vector<cv::Point2f> points1, points2; 2 3 for (std::vector<cv::DMatch>::const_iterator it= matches.begin(); 4 it!= matches.end(); ++it) { 5 6 // Get the position of left keypoints 7 float x= keypoints1[it->

OPENCV下SIFT算法使用方法笔记

这几天继续在看Lowe大神的SIFT神作,看的眼花手脚抽筋.也是醉了!!!!实在看不下去,来点干货.我们知道opencv下自带SIFT特征检测以及MATCH匹配的库,这些库完全可以让我们进行傻瓜似的操作.但实际用起来的时候还不是那么简单.下文将对一个典型的基于OPENCV的SIFT特征点提取以及匹配的例程进行分析,并由此分析详细的对OPENCV中SIFT算法的使用进行一个介绍. OPENCV下SIFT特征点提取与匹配的大致流程如下: 读取图片->特征点检测(位置,角度,层)->特征点描述的提取

Opencv 各种特征点提取和匹配

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

【计算机视觉】OpenCV的最近邻开源库FLANN

FLANN介绍 FLANN库全称是Fast Library for Approximate Nearest Neighbors,它是目前最完整的(近似)最近邻开源库.不但实现了一系列查找算法,还包含了一种自动选取最快算法的机制. flann::Index_类 该类模板是最近邻索引类,该类用于抽象不同类型的最近邻搜索的索引. 以下是flann::Index_类的声明: template <typename T> class #ifndef _MSC_VER FLANN_DEPRECATED #e

OpenCV学习笔记[5]FLANN特征匹配

OpenCV学习笔记:FLANN特征匹配 本次给出FLANN特征匹配的Java实现. [简介] 特征匹配记录下目标图像与待匹配图像的特征点(KeyPoint),并根据特征点集合构造特征量(descriptor),对这个特征量进行比较.筛选,最终得到一个匹配点的映射集合.我们也可以根据这个集合的大小来衡量两幅图片的匹配程度. 特征匹配与模板匹配不同,由于是计算特征点集合的相关度,转置操作对匹配影响不大,但它容易受到失真.缩放的影响. [特征匹配] FeatureMatching.java: imp

OpenCV 入门级一[转]

首先声明,这一系列博文是本人在学习 OpenCV 的过程中对自身学习的一个总结而已, 仅作为 OpenCV 入门级参考,并没有什么内容值得高手参考, 所以,只适合和我一样正值学习状态者阅读,高手无意者请飘过,但欢迎留言指教. OpenCV 是一个开源的计算机视觉库,其采用 C/C++ 编写,被设计为可移植的库, OpenCV 的设计目标是执行速度尽可能的快, 其主要关注的是实时应用,同时,OpenCV 的另一个目标是构建一个简单易用的计算机视觉框架, 以帮助开发人员更便捷地设计更复杂的计算机视觉

Opencv中图像的遍历与像素操作

Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0代表黑,255代表白):对于彩色图像,每个像素是一个三元向量,即由三个8位无符号数来表示三个颜色通道(Opencv中顺次为蓝.绿.红). 我们先来介绍下cv::Mat类的获取像素的成员函数at(),其函数原型如下: template<typename _Tp> _Tp& at(int i0