Opencv:BoW计算SURF描述符

时间:2015-12-11 06:03:48

标签: python opencv surf descriptor

我正在尝试在一组图像上做一些单词,提取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]

1 个答案:

答案 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描述符的首选选择