cvFindContours()的更快替代品

时间:2012-07-04 22:18:20

标签: opencv arm computer-vision augmented-reality

轮廓检测占用了我计算机视觉中的大部分时间,而且需要更快。我已经通过NEON指令和矢量化优化了其他所有内容,实际上,轮廓检测在配置文件中占主导地位。不幸的是,对我来说如何优化这一点并不明显。

我正在进行经典的矩形检测过程,以找到基准标记,即cvFindContours(),然后从轮廓中逼近正方形。如果有许多标记可见(或灾难性的,当看不到标记的密集矩形网格时),单独调用cvFindContours()可能需要在iPhone上花费> 30ms。

我已经用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?例如。快速角点检测几乎总是返回我的基准标记角落,即使是非常激进的阈值。有没有办法使用该点集来限制检测? (不幸的是,我不知道这有多大帮助,在许多标记的情况下,或者与标记无关的密集网格线,这在我的应用程序中经常发生。)

  5. 与上面一样,由于Blob检测可以(如果我理解正确)实现为递归泛洪填充,是否有任何快速矢量化实现,然后可以用于某种方式拉出有趣的Blob从那里看矩形和种子轮廓检测?

  6. 欢迎任何想法!

1 个答案:

答案 0 :(得分:2)

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

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