我正在尝试在一组图像上做一些单词,提取SURF描述符。但是,我在下面粘贴的代码的最后一行得到以下错误:
type == src2.type()&& src1.cols == src2.cols&& (type == CV_32F || type == CV_8U)
如果我改用“SIFT”,那么一切正常。但是当我使用“SURF”时,BoW无法计算SURF描述符。
这是实例化SURF的正确方法吗?我可以使用cv2.NORM_L2距离函数吗?
imgs2Keypoints = {}
kmeansTrainer = cv2.BOWKMeansTrainer(10);
for pathToImage in images:
sift = cv2.SURF(400)
img = cv2.imread(pathToImage)
kp, des = sift.detectAndCompute(img, None)
des = np.float32(des)
kmeansTrainer.add(des)
imgs2Keypoints[pathToImage] = kp
vocabulary = kmeansTrainer.cluster()
bow_ext.setVocabulary(vocabulary)
surf2 = cv2.DescriptorExtractor_create("SURF")
bow_ext = cv2.BOWImgDescriptorExtractor(surf2, cv2.BFMatcher(cv2.NORM_L2))
for pathToImage in images:
img = cv2.imread(pathToImage)
histogram = bow_ext.compute(img, imgs2Keypoints[pathToImage])[0]
答案 0 :(得分:1)
编辑:
sift = cv2.SURF(400)
创建扩展的SURF描述符(128维),而
surf2 = cv2.DescriptorExtractor_create("SURF")
创建标准的SURF描述符(64维)。
一种可能的解决方案是禁用 sift 对象的扩展描述符
sift.extended = False
编辑2:
用于扩展描述符:
surf2.setBool("extended", True)
对于L2规范:是的,L2距离很好。如OpenCV docs中所述:
L1和L2规范是SIFT和SURF描述符的首选选择