我和这里有同样的问题:
不幸的是,这篇文章没有答案。
我有几个图像(和相应的描述符),我使用“添加”方法将它们添加到FlannBasedMatcher中(每组描述符一次,对应一个图像)。
但是,当我匹配图像时,返回的imgIdx远大于训练集中的图像数量。我觉得每个描述符都被当作图像,但这不是我想要的。
我想知道每个功能都已匹配到哪个图像(或一组描述符)。
这是我的代码的一部分(我做了一点简化,我知道'test'对于变量名不是很好,但这是临时的)。 另外,我在这里读取.key文件,这些文件基本上是包含图像的关键点和描述符(通过SIFT提取)的文件。
我只是精确地指出,在下面的代码中,featMatch只是我创建的用于创建FlannBasedMatcher(带有初始化参数)的类。
with open(os.path.join(ROOT_DIR,"images\\descriptor_list.txt"),'r') as f:
for line in f:
folder_path = os.path.join(ROOT_DIR,"images\\",line[:-1]+"\\","*.key")
list_key = glob.glob(folder_path)
test2 = []
for key in list_key:
if os.path.isfile(key):
feat = Features()
feat.readFromFile(key)
test = feat.descriptors
test2 = test2+test
featMatch.add(test2)
# Read submitted picture features
feat = Features()
feat.readFromFile(os.path.join(ROOT_DIR,"submitted_picture\\sub.key"))
matches = []
matches.append(featMatch.knnMatch(np.array(feat.descriptors), k=3))
print(matches)
我期望在查看匹配项时,更具体地说是在匹配项的imgIdx时,根据我用'add添加的描述符集的数量,得知匹配特征(trainIdx)对应于哪个图像索引方法。
但是按照这个假设,我应该能够使imgIdx大于我的训练集中的图像(或训练集)数量。
但是,在这里,我得到的数字是2960,而我的训练集中只有大约5张图像。
我的猜测是它返回功能索引而不是图像索引,但是我不知道为什么。
我注意到C ++中的'add'方法采用一个数组数组,其中有一个描述符集列表(我猜每个图像一个)。但是在这里,每个图像具有不同数量的功能,因此我无法真正创建每列中具有不同行数的numpy数组。
谢谢。
答案 0 :(得分:0)
在查看matcher.cpp的C ++源代码后,我终于明白了:
https://github.com/opencv/opencv/blob/master/modules/features2d/src/matchers.cpp
我将发布答案,以防某天有人需要它。
我认为'add'方法在调用时会增加图像计数,但不会。因此,我意识到我必须创建一个Mat列表(或python中的numpy数组),并给它一次“添加”,而不是为每个图像调用它。
这是更新的(并且正在工作的)源代码:
with open(os.path.join(ROOT_DIR,"images\\descriptor_list.txt"),'r') as f:
list_image_descriptors = []
for line in f:
folder_path = os.path.join(ROOT_DIR,"images\\",line[:-1]+"\\","*.key")
list_key = glob.glob(folder_path)
for key in list_key:
if os.path.isfile(key):
feat = Features()
feat.readFromFile(key)
img_descriptors = np.array(feat.descriptors)
list_image_descriptors.append(img_descriptors)
featMatch.add(list_image_descriptors)
# Read submitted picture features
feat = Features()
feat.readFromFile(os.path.join(ROOT_DIR,"submitted_picture\\sub.key"))
matches = []
matches.append(featMatch.knnMatch(np.array(feat.descriptors), k=3))
print(matches)
希望这会有所帮助。