【问题标题】:Faster Alternatives to cvFindContour()cvFindContour() 的更快替代方案
【发布时间】:2012-07-05 08:42:38
【问题描述】:

轮廓检测占用了我在计算机视觉中的大部分时间,而且它需要更快。我已经通过 NEON 指令优化了其他所有内容并进行了矢量化,实际上,轮廓检测主导了轮廓。不幸的是,我不清楚如何优化它。

我正在执行经典的矩形检测过程来查找基准标记,即 cvFindContours(),然后从轮廓近似正方形。在许多标记可见的情况下(或者灾难性的,当不可见标记的密集矩形网格可见时),在 iPhone 上单独调用 cvFindContours() 可能需要超过 30 毫秒。

我已经用 cvFindContours() 替换了极其昂贵的 C++ cv::FindContours()。特别是如果传递一个向量 >,C++ 版本分配和填充向量的时间比其内部 cvFindContours() 花费的时间长!

现在,我完全被 cvFindContours 中的时间所束缚,或者更具体地说,在 cvFindNextContour() 中。 cvFindNextContour 中的代码是分支繁重的,并且显然不容易矢量化。它还实现了一个复杂的算法,我不相信自己在任何优化尝试中都不会出错。

我已经查看了 cvBlobLib(为了消除歧义,我指的是这个:http://code.google.com/p/cvblob/),看看它是否提供了可以更快地完成同样事情的替代算法。源的基本下载非常慢,因为它将轮廓记录到 std::list() 中,并且几乎所有时间都花在内存分配上。用一个预先调整为 256 个元素的 std::vector 替换该列表以消除 push_back() 上的初始副本,仍然会得到一个比 cvFindContours() 长 3 倍的函数,其中 66% 直接在 cvb::cvLabel( )。所以走这条路似乎不可行。

是否有人对如何优化对许多矩形的检测有任何想法。我含糊的挥手包括:

  1. 是否有任何与 cvFindContour() 等效的快速实现,最好是作为多平台的源代码?

  2. 大多数轮廓不是必需的,只有“成功”的矩形有用。特别是,它们的内部轮廓就没有用了。从理论上讲,我是否可以根本不调用 cvFindContours,而是调用 cvStartFindContours/cvFindNextContour,测试找到的每个轮廓,如果我找到了我正在寻找的矩形,则不递归,因为子矩形保证是无用的?

  3. 我可以使用与经典 FindContours()/ApproxPoly() 方法完全不同的矩形检测算法吗?

  4. 有没有办法为 cvFindContours 提供有用的感兴趣区域?例如。即使使用非常激进的阈值,FAST 角点检测几乎总是会返回我的基准标记角点。有没有办法使用该点来限制检测? (不幸的是,我不确定这有多大帮助,同样在许多标记或与标记无关的密集网格线的情况下,这在我的应用程序中经常发生。)

  5. 1234563矩形,然后从那里进行种子轮廓检测?

欢迎任何想法!

【问题讨论】:

  • 只是对您的观点 5 的评论。洪水填充通常不是检测斑点的最有效方法。相反,您想使用两遍或一遍算法,其中一些是可并行的。 “连接组件标签”的 Wikipedia 页面是一个很好的起点。
  • 这里有什么更新吗?新见解?我也有类似的问题。
  • 快速 AR 标记检测算法不使用 findContours,而是在梯度图中(并行)找到部分边缘,然后将它们重新组合成完整边缘,然后再组合成四边形。
  • 您能否提供一个示例图像。你想要什么样的检测
  • @stukmen 可能类似于frl.nyu.edu/wp-content/uploads/2.jpg 不幸的是,我无法提供我的用例的确切示例。

标签: opencv arm computer-vision augmented-reality


【解决方案1】:

由于您的目标是矩形检测而不是轮廓检测,我建议使用积分图像进行计算。积分图像的解释可以找到here。在计算出所需图像的积分图像后,可以通过三个操作来计算矩形的像素和。

假设您想在每个非黑色对象周围绘制矩形,您可以使用如下方法。递归地将图像及其子图像划分为 4,并丢弃像素总和低于所需阈值的矩形。您将留下许多与您的对象近似的小矩形。合并相邻的矩形将产生检测到的对象的快速近似值。

【讨论】:

    猜你喜欢
    • 2018-12-11
    • 2012-01-23
    • 2013-07-13
    • 2011-02-27
    • 2010-09-22
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多