0

我和这里有同样的问题:

如何使用opencv flannbasedmatcher和dmatch访问与最佳关键点匹配对应的最佳图像

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

我有几个图像(和相应的描述符),我使用“add”方法将它们添加到 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++ 中的“添加”方法需要一个数组数组,其中我们有一个描述符集列表(我猜每个图像都有一个)。但是在这里,我对每个图像都有不同数量的特征,所以我不能真正创建一个每列中具有不同行数的 numpy 数组。

谢谢。

4

1 回答 1

1

在查看了matcher.cpp的C++源代码后,我终于弄明白了:

https://github.com/opencv/opencv/blob/master/modules/features2d/src/matchers.cpp

我会发布答案,以防有一天有人需要它。

我认为“添加”方法会在调用时增加图像计数,但事实并非如此。所以,我意识到我必须创建一个 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)

希望这可以帮助。

于 2019-02-10T16:39:13.553 回答