OpenCV drawMatches - queryIdx和trainIdx

sol*_*les 11 c++ opencv image-processing 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]]
Run Code Online (Sandbox Code Playgroud)

注意matches是类型的vector<DMatch>.这是DMatch构造函数:

DMatch(int queryIdx, int trainIdx, float distance)
Run Code Online (Sandbox Code Playgroud)

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

问题:索引索引是否正确?或者是周围的其他方式?queryIdxkeypoints1trainIdxkeypoints2

小智 25

这取决于你如何得到matches.

如果您按顺序调用match函数:

match(descriptor_for_keypoints1, descriptor_for_keypoints2, matches)
Run Code Online (Sandbox Code Playgroud)

然后queryIdxkeypoints1trainIdxkeypoints2,反之亦然.

  • 它们应该使功能更清晰.界面和语言不一致. (6认同)

gsd*_*sdf 7

变量" matches "是DMatch对象的列表 .

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

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

  • 什么是imgIdx?我找不到关于它的讨论。 (2认同)