1

BOWImgDescriptorExtractor必须接收 32F 所以SURFSIFT必须用于DescriptorExtractor,但FeatureDetector肯定可以是任何你想要的,对吧?

我只需要在这里澄清一下,我只见过有人说“你不能使用ORBwith Bow,但是在检测功能时,为什么要使用哪个呢?

4

2 回答 2

5

我不认为这有关系。您可以使用任意方法进行特征点检测(即 ORB、FAST、SIFT、SURF 等)。

问题可能来自下一步,即特征点描述,原因是 Guanta 在其回答中所述:

您发布的链接提供了一种通过简单转换为浮点数(CV_32F)来解决二进制描述符问题的可能性,并且依赖于 OpenCV 的 k-means 算法只能处理 CV_32F 并使用 L2 距离进行比较这一事实。因此,二进制描述符也可能以错误的方式聚集(因为实际上你想要一个汉明距离测量)!

这就是为什么推荐使用 SIFT/SURF 描述符的原因。但除此之外,您可以将不同类型的特征点检测器与不同类型的描述符混合使用。

于 2015-03-04T14:59:37.487 回答
1

粗略地说,与您的标题问题相关的伪代码是:

# Construct vocabulary
bow_trainer = cv2.BOWKMeansTrainer(50)
bow_trainer.add(np.float32(descriptors))
vocab = bow_trainer.cluster().astype(descriptor.dtype)

# Create an object for computing global image BoW descriptors
bow_descr = cv2.BOWImgDescriptorExtractor(ORBdetector, CV2.BFMatcher(CV.NORM_HAMMING))
bow_descr.setVocabulary(vocab)

# Load an image, find keypoints, compute global image descriptor
img = cv2.imread("PathtoImage", ...)
keypoints = detector.detect(img,None)
description = bow_descr.compute(img, kps)

# Visualization
plt.figure( ...)

# Distance calculation (assuming you have two histograms, stored each in the "description" variable)
dist = 1 - cv2.compareHist(pic1.description, pic2.description, cv2.HISTCMP_CORREL)
于 2019-04-16T11:47:18.760 回答