我和这里有同样的问题:
如何使用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 数组。
谢谢。