为什么KeyPoint“探测器”和“提取器”是不同的操作?

时间:2012-06-20 22:18:53

标签: opencv sift surf

基本上你首先要做的是:

SurfFeatureDetector surf(400);
surf.detect(image1, keypoints1);

然后是:

surfDesc.compute(image1, keypoints1, descriptors1);

为什么检测和计算是2种不同的操作?
检测后进行计算不会产生冗余循环?

我发现自己.compute是我申请中最贵的。

.detect 

0.2secs

中完成
.compute

需要〜1秒。有没有办法加快.compute

3 个答案:

答案 0 :(得分:9)

关键点的检测只是选择图像中被认为是“好特征”的点的过程。

这些关键点的描述符的提取是一个完全不同的过程,它编码该特征的属性,如与邻居等的对比,因此可以与来自不同图像,不同sclae和方向的其他关键点进行比较。

您描述关键点的方式对于成功匹配至关重要,这确实是关键因素。您描述关键点的方式也是匹配速度的决定因素。例如,您可以将其描述为浮点数或二进制序列。

答案 1 :(得分:3)

检测图像中的关键点和计算这些关键点的描述符之间存在差异。例如,您可以提取SURF关键点并计算SIFT功能。请注意,在DescriptorExtractor :: compute方法中,将应用关键点上的过滤器:

KeyPointsFilter::runByImageBorder()
KeyPointsFilter::runByKeypointSize();

答案 2 :(得分:0)

从Jay_Rock离开的地方开始,您可以使用ORB,Brisk或FREAK等算法提供的二进制描述符来改善处理时间。它们不仅会占用32位而不是64位,它们还提供了不同的计算描述符的方法,这些方法与SURF一样强大且速度更快。

如果您最终想要在描述符之间执行匹配操作,可以通过计算两者之间的汉明距离来完成。鉴于它是两个二进制字符串之间的XOR操作,运行只需几毫秒。