Opencv:BoW计算冲浪描述符

2024-05-18 10:53:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一组图片上做一袋字,提取冲浪描述符。但是,我在粘贴在下面的代码的最后一行中得到以下错误:

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]

Tags: imgtypecv2extcvsurf描述符amp
1条回答
网友
1楼 · 发布于 2024-05-18 10:53:15

编辑:

sift = cv2.SURF(400)

创建扩展的SURF描述符(128维),而

^{pr2}$

创建标准SURF描述符(64维)。在

一个可能的解决方案是禁用sift对象的扩展描述符

sift.extended = False

编辑2:

用于扩展描述符:

surf2.setBool("extended", True)

至于L2标准:是的,L2距离可以。如OpenCV docs所述:

L1 and L2 norms are preferable choices for SIFT and SURF descriptors

相关问题 更多 >