OpenCV drawMatches - queryIdx和trainIdx

时间:2012-11-10 03:08:59

标签: c++ image-processing opencv computer-vision

这是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是另一组关键点的索引。

问题: queryIdx索引到keypoints1trainIdx索引到keypoints2是真的吗?或者,它是相反的吗?

2 个答案:

答案 0 :(得分:22)

这取决于你获得matches的方式。

如果按顺序调用匹配功能:

match(descriptor_for_keypoints1, descriptor_for_keypoints2, matches)

然后queryIdx引用keypoints1trainIdx引用keypoints2,反之亦然。

答案 1 :(得分:5)

变量&#34; 匹配&#34;是 DMatch对象的列表。

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

  1. item.distance :此属性为我们提供描述符之间的距离。较低的距离表示更好的匹配。
  2. item.trainIdx :此属性为我们提供了列车描述符列表中描述符的索引(在我们的例子中,它是img2中的描述符列表)。
  3. item.queryIdx :此属性为我们提供了查询描述符列表中描述符的索引(在我们的示例中,它是img1中的描述符列表)。
  4. item.imgIdx :此属性为我们提供了火车图片的索引。