我试图在一组图片上做一袋字,提取冲浪描述符。但是,我在粘贴在下面的代码的最后一行中得到以下错误:
type==src2.type()&;src1.cols==src2.cols&;(type==CV f | |类型==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]
编辑:
创建扩展的SURF描述符(128维),而
^{pr2}$创建标准SURF描述符(64维)。在
一个可能的解决方案是禁用sift对象的扩展描述符
编辑2:
用于扩展描述符:
至于L2标准:是的,L2距离可以。如OpenCV docs所述:
相关问题 更多 >
编程相关推荐