为什么关键点“检测器”和“提取器”是不同的操作?

3
基本上,你首先需要进行以下操作:

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

然后是a:

surfDesc.compute(image1, keypoints1, descriptors1);

为什么检测和计算是两个不同的操作?在检测之后进行计算不会产生冗余循环吗?
我发现在我的应用程序中,.compute 是最昂贵的。
.detect 

完成时间为0.2秒

.compute

需要 .compute 大约需要 1秒,有没有什么方法可以加速它?
3个回答

9
检测关键点是在图像中选择被认为是“好特征”的点的过程。提取这些关键点的描述符是一种完全不同的过程,它编码了该特征的属性,如与邻域的对比度等,以便与来自不同图像、不同缩放和方向的其他关键点进行比较。
您描述关键点的方式可能对成功匹配至关重要,这真正是关键因素。此外,您描述关键点的方式对匹配速度也起决定性作用。例如,您可以将其描述为浮点数或二进制序列。

3
在图像处理过程中,检测关键点和计算其描述符之间存在差异。例如,您可以提取SURF关键点并计算SIFT特征。请注意,在DescriptorExtractor :: compute方法中,应用于关键点的过滤器:
KeyPointsFilter::runByImageBorder()
KeyPointsFilter::runByKeypointSize();

哎呀,这很有趣!你知道有没有什么更快的方法来计算它?我的个人资料显示,“.compute”部分所花费的时间比其他部分更长。 - dynamic
这取决于您的应用需求,但您应该尝试使用BRIEF描述符。它们的计算速度比SURF更快,并且非常相似。如果您真的想使用SURF,则可以在图像中选择较少的点或以智能方式过滤它们(使用空间约束?)。 - Eric
是的,我在想(选择较少的关键点)。您会在计算完关键点(使用.detect)之后过滤关键点向量,还是事先选择一些关键点?(也许使用海森阈值?) - dynamic
第二个选项,但实际上它取决于您应用的需求。 - Eric
1
你需要重新实现/重载这个方法并进行自定义。 - Eric
显示剩余2条评论

0
继承Jay_Rock的思路,您可以通过使用ORB、Brisk或FREAK等算法提供的二进制描述符来改进处理时间。它们不仅占用32位而不是64位,而且还提供了与SURF一样健壮且更快的计算描述符的不同方法。
如果您最终想要在描述符之间执行匹配操作,则可通过计算两者之间的汉明距离来完成。由于这是两个二进制字符串之间的XOR运算,因此只需要几毫秒即可运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接