/* * 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:該點直徑的大小