【问题标题】:Why KeyPoint "detector" and "extractor" are different operation?为什么KeyPoint“检测器”和“提取器”操作不同?
【发布时间】:2012-06-20 22:18:53
【问题描述】:

基本上你必须先做一个:

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

然后是:

surfDesc.compute(image1, keypoints1, descriptors1);

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

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

.detect 

0.2 秒内完成

.compute

需要 ~1 秒。有什么办法可以加速.compute

【问题讨论】:

    标签: opencv sift surf


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 嗯,这很有趣!你知道有什么方法可以更快地计算它吗?我的个人资料显示.compute 是比其他部分花费更多时间的部分
      • 这取决于您的应用程序的需要,但您应该尝试使用简要描述符。它们被设计为比 SURF 计算速度更快,并且非常相似。如果您真的想使用 SURF,您可能希望在图像中选择更少的点或以智能方式过滤它们(使用空间约束?)。
      • 是的,我在想(选择更少的关键点)你会在计算后过滤关键点的向量(使用.detect)还是先选择几个关键点? (也许有粗麻布阈值?)
      • 第二个选项,但这真的取决于你的应用程序的需要。
      • 需要重新实现/重载方法并自定义。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        • 1970-01-01
        • 2012-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多