使用Python中的FlannBasedMatcher在DMatch类中的imgIdx问题

时间:2019-02-10 07:53:35

标签: python opencv flann flannbasedmatcher

我和这里有同样的问题:

how to access best image corresponding to best keypoint match using opencv flannbasedmatcher and dmatch

不幸的是,这篇文章没有答案。

我有几个图像(和相应的描述符),我使用“添加”方法将它们添加到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数组。

谢谢。

1 个答案:

答案 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)

希望这会有所帮助。