Opencv 带文字袋的ORB特征检测器

Opencv 带文字袋的ORB特征检测器,opencv,image-recognition,orb,Opencv,Image Recognition,Orb,BOWImgDescriptorExtractor必须接收32F,因此必须对描述符Extractor使用SURF或SIFT,但对于FeatureDetector,这肯定可以是任何您想要的,对吗 我只是需要澄清一下,我只见过有人说你不能使用带弓的ORB,但当检测到这些功能时,为什么你使用哪一个会很重要呢?我认为这不重要。您可以使用任意方法进行特征点检测,即ORB、FAST、SIFT、SURF等 问题可能来自下一步,即特征点描述,原因如下: 您发布的链接提供了通过简单转换为浮点CV_32F来解决二进

BOWImgDescriptorExtractor必须接收32F,因此必须对描述符Extractor使用SURF或SIFT,但对于FeatureDetector,这肯定可以是任何您想要的,对吗


我只是需要澄清一下,我只见过有人说你不能使用带弓的ORB,但当检测到这些功能时,为什么你使用哪一个会很重要呢?

我认为这不重要。您可以使用任意方法进行特征点检测,即ORB、FAST、SIFT、SURF等

问题可能来自下一步,即特征点描述,原因如下:

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


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

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

问题可能来自下一步,即特征点描述,原因如下:

您发布的链接提供了通过简单转换为浮点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)

大致上,与标题问题相关的伪代码是:

# 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)

嗯,我使用的是徽标,使用SURF,它可以检测徽标上和周围的特征点,即背景-即使是白色,但使用ORB,因为它在边缘检测方面更好,只获取徽标也更好。-为了澄清这一点,我将ORB用于特征检测器,SURF用于描述符提取。我认为特征检测器最重要的标准是速度、质量和在不同照明和比例条件下的重复性。下面是OpenCV特征检测算法的两个比较,但您的想法可以在实践中发挥作用。这就是为什么我想使用ORB,但使用它比简单地使用SURF或SIFT要困难得多。我更好奇的是,为什么这不是我以前见过的方法。我使用的是徽标,使用SURF,它可以检测徽标上和周围的特征点,即背景-即使是白色,但使用ORB,因为它在边缘检测方面更好,只获取徽标也更好。-为了澄清这一点,我将ORB用于特征检测器,SURF用于描述符提取。我认为特征检测器最重要的标准是速度、质量和在不同照明和比例条件下的重复性。下面是OpenCV特征检测算法的两个比较,但您的想法可以在实践中发挥作用。这就是为什么我想使用ORB,但使用它比简单地使用SURF或SIFT要困难得多。我更好奇的是,为什么这不是我以前见过的方法。