BOWImgDescriptorExtractor
必须接收 32F 所以SURF
或SIFT
必须用于DescriptorExtractor
,但FeatureDetector
肯定可以是任何你想要的,对吧?
我只需要在这里澄清一下,我只见过有人说“你不能使用ORB
with Bow
”,但是在检测功能时,为什么要使用哪个呢?
BOWImgDescriptorExtractor
必须接收 32F 所以SURF
或SIFT
必须用于DescriptorExtractor
,但FeatureDetector
肯定可以是任何你想要的,对吧?
我只需要在这里澄清一下,我只见过有人说“你不能使用ORB
with Bow
”,但是在检测功能时,为什么要使用哪个呢?
我不认为这有关系。您可以使用任意方法进行特征点检测(即 ORB、FAST、SIFT、SURF 等)。
问题可能来自下一步,即特征点描述,原因是 Guanta 在其回答中所述:
您发布的链接提供了一种通过简单转换为浮点数(CV_32F)来解决二进制描述符问题的可能性,并且依赖于 OpenCV 的 k-means 算法只能处理 CV_32F 并使用 L2 距离进行比较这一事实。因此,二进制描述符也可能以错误的方式聚集(因为实际上你想要一个汉明距离测量)!
这就是为什么推荐使用 SIFT/SURF 描述符的原因。但除此之外,您可以将不同类型的特征点检测器与不同类型的描述符混合使用。
粗略地说,与您的标题问题相关的伪代码是:
# 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)