18

这是 OpenCV 的drawMatches()功能:

void drawMatches(Mat img1, vector<KeyPoint> keypoints1,
                 Mat img2, vector<KeyPoint> keypoints2,
                 vector<DMatch> matches, 
                 Mat outImg) //want keypoints1[i] = keypoints2[matches[i]]

请注意,matches它的类型是vector<DMatch>。这是DMatch构造函数:

DMatch(int queryIdx, int trainIdx, float distance)

据推测,queryIdx是一组关键点trainIdx的索引,并且是另一组关键点的索引。

问题:索引到索引到是真的吗?或者是周围的其他方式?queryIdxkeypoints1trainIdxkeypoints2

4

2 回答 2

33

这取决于你如何获得matches.

如果按顺序调用匹配函数:

match(descriptor_for_keypoints1, descriptor_for_keypoints2, matches)

thenqueryIdxkeypoints1trainIdxkeypoints2,反之亦然。

于 2012-11-10T07:06:12.263 回答
10

变量“ matches ”是 DMatch 对象的列表。

如果我们遍历这个DMatch 对象列表,那么每个项目都将具有以下属性:

  1. item.distance:该属性为我们提供了描述符之间的距离。较低的距离表示更好的匹配。
  2. item.trainIdx:该属性为我们提供了列车描述符列表中描述符的索引(在我们的例子中,它是 img2 中的描述符列表)。
  3. item.queryIdx:这个属性为我们提供了查询描述符列表中描述符的索引(在我们的例子中,它是 img1 中的描述符列表)。
  4. item.imgIdx:该属性为我们提供了火车图像的索引。
于 2015-12-20T11:14:16.387 回答