对于使用OpenCV提取图像特征点的方法,全部分为五部分,第一步:创建特征检测算子,如ORB,SURF,SIFT等;第二步:创建vector keyPoints1, keyPoints2来存储detect到的特征点;第三步:创建Mat descriptors1, descriptors2来存储compute到的描述子;第四步:创建vector matches来存储match到的匹配点对;第五步:限制描述子之间的距离,选择距离较小的匹配点对。
说明:
1.关于vector keyPoints1, keyPoints2,可以理解其为两个具有500行(默认检测500个特征点)的结构体,结构体中包含有的成员有pt、size、angle、response、octave和class_id。使用下列方法进行访问:keyPoints1[0–499].pt,表示特征点的坐标,还有keyPoints1[0–499].pt.x和keyPoints1[0–499].pt.y来分别表示横纵坐标;keyPoints1[0–499].size用来返回特征点的大小;keyPoints1[0–499].angle返回特征点的角度;keyPoints1[0–499].response返回各特征点的响应值;keyPoints1[0–499].octave返回该点位于哪一层金字塔;最后的keyPoints1[0–499].class_id返回特征点的标签。
2.关于Mat descriptors1, descriptors2,这两个矩阵用来存储两个500行32列(ORB特征)的描述子,即每行代表一个特征点的描述子。
3.关于vector match,理解与keyPoints1一样。其中:match.size()返回match的行数;match[0–499].queryIdx返回当前“匹配点”在查询图像的特征在KeyPoints1向量中的索引号,可以据此找到匹配点在查询图像中的位置;match[0–499].trainIdx返回当前“匹配点”在训练(模板)图像的特征在KeyPoints2向量中的索引号,可以据此找到匹配点在训练图像中的位置;match[0–499].imgIdx返回当前匹配点对应训练图像(如果有若干个)的索引,如果只有一个训练图像跟查询图像配对,即两两配对,则imgIdx=0;match[0-499].distance返回特征点之间的欧氏距离,越小表明匹配度越高。