关于OpenCV BFMatcher匹配结果中imgIdx与trainIdx取值含义的疑问
关于OpenCV BFMatcher匹配结果中imgIdx与trainIdx取值含义的疑问
嘿,我看了你这段OpenCV BFMatcher的测试代码,刚好可以借着它把imgIdx和trainIdx的含义给你讲明白,这俩参数刚开始用的时候确实容易搞混~
先把你给出的测试代码贴在这里方便对照:
import numpy as np, cv2 as cv bf = cv.BFMatcher(cv.NORM_L1, crossCheck=False) bf.add(np.array([[0], [1], [2]], dtype='f4')) # train image 0 bf.add(np.array([[0.1], [1.1], [2.1]], dtype='f4')) # train image 1 bf.train() src = np.array([[0], [1.1], [2.1]], dtype='f4') matches = bf.match(src) for m in matches: print(m.distance, m.queryIdx, m.imgIdx, m.trainIdx)
咱们拆解一下这两个参数的意义:
imgIdx:标记匹配到的描述子属于哪一组训练数据
你用bf.add()方法分两次添加了两组训练描述子,每一次add()就对应一组训练图像的描述子集合。第一次add()的是train image 0,对应的imgIdx就是0;第二次add()的train image 1,对应的imgIdx就是1。简单说,它就是你训练数据的“组索引”。trainIdx:标记在对应组内具体匹配到的是第几个描述子
比如你给train image 1添加的描述子是[[0.1], [1.1], [2.1]],这是一个包含3个元素的数组,每个元素的索引是0、1、2。如果匹配到这个组里的第二个元素[1.1],那对应的trainIdx就是1。它就是单组训练描述子内部的“元素索引”。
结合你的代码场景来看,src里的每个描述子会和所有训练组里的描述子逐一匹配(因为crossCheck=False),所以最终的matches列表里会包含6条结果:
- 比如
src的第一个描述子[0],会匹配到train image 0的第0个描述子(imgIdx=0, trainIdx=0,距离0.0)和train image1的第0个描述子(imgIdx=1, trainIdx=0,距离0.1) - 而
src的第二个描述子[1.1],会匹配到train image0的第1个描述子(imgIdx=0, trainIdx=1,距离1.1)和train image1的第1个描述子(imgIdx=1, trainIdx=1,距离0.0)
这样是不是就清楚多啦?
内容来源于stack exchange
相关产品推荐
相关产品推荐

