3

基本上你必须首先做一个:

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

然后一个:

surfDesc.compute(image1, keypoints1, descriptors1);

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

我发现自己.compute是我的应用程序中最昂贵的。

.detect 

0.2 秒内完成

.compute

需要~1sec。有什么办法可以加快速度.compute吗?

4

3 回答 3

9

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

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

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

于 2013-02-06T12:33:15.110 回答
3

检测图像中的关键点和计算这些关键点的描述符是有区别的。例如,您可以提取 SURF 关键点并计算 SIFT 特征。请注意,在 DescriptorExtractor::compute 方法中,应用了关键点上的过滤器:

KeyPointsFilter::runByImageBorder()
KeyPointsFilter::runByKeypointSize();
于 2012-06-20T23:01:52.550 回答
0

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

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

于 2013-03-12T18:35:12.820 回答