OpenCV BFMatcher match() 总是返回错误

3

我正在使用4个描述符训练BFMatcher:

bf = cv2.BFMatcher()

bf.clear()
bf.add(des1)
bf.add(des2)
bf.add(des3)
bf.add(des4)
bf.train()

bf.match(des1)

代码bf.match(des1)会抛出以下错误:
error: ..\..\..\..\opencv\modules\core\src\stat.cpp:2473: error: (-215) type == src2.type() && src1.cols == src2.cols && (type == CV_32F || type == CV_8U) in function cv::batchDistance

这可能是什么原因呢?这些描述符是ORB描述符。
2个回答

4

你说得对,你可以在列表中添加描述符,但你只能匹配单个描述符,所以需要遍历整个des1数组并匹配每个单独的描述符,并将匹配项保存在列表中,或者如果不想重复则保存在集合中!

matches = set()
for desc in desc1:
    matches_img = bf.knnMatch(desc,k=2)
    for match in matches_img:
        matches.add(match)

1
请通过添加您所提及的内容的代码来完善您的回答。 - Ram
2
干得好!感谢您改进您的答案。+1 - Ram

0

你应该使用:

    bf  = cv2.BFMatcher(cv2.NORM_HAMMING)

当使用ORB时,错误显示ORB描述符使用的类型不支持匹配器的默认L2距离。


我按照你说的更改了,但问题仍然存在。相同的错误信息被显示。 - Tarantula
好的,那么仅使用两个ORB(如bf.match(des1,des2))进行匹配是否有效,而不进行任何训练?就像这里所示:http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_feature2d/py_matcher/py_matcher.html - QED
好的,现在尝试仅使用那两个des1和des2进行训练。可能是其中另一个desc的大小不同,就像错误信息中所说的“src1.cols == src2.cols”一样。 - QED
所有描述符(des1,des2,des3,des4)的形状相同,即500行32列。 - Tarantula
这很奇怪,因为错误似乎表明它们的类型或大小是错误的。当仅从desc1和desc2进行训练时,它是否有效? - QED
1
似乎我还没有理解match方法的正确输入方式,如果我运行ma = bf.match(des1[0]),它可以正常工作。 - Tarantula

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接