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

我正在执行经典的矩形检测过程以找到基准标记,即cvFindContours(),然后从轮廓中近似正方形。在可见许多标记的情况下(或灾难性地,当可见不包含标记的矩形密集网格时),仅在iPhone上对cvFindContours()的调用可能会花费30毫秒以上的时间。

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

现在,我完全受时间限制在cvFindContours中,或更具体地说,在cvFindNextContour()中。 cvFindNextContour内部的代码是分支繁重的,而且显然不容易向量化。它还实现了一个复杂的算法,我不相信自己在进行任何优化尝试时都不会出错。

我已经看过cvBlobLib(为了消除歧义,我的意思是这个:http://code.google.com/p/cvblob/),看它是否提供了可以更快地完成相同操作的替代算法。源代码的基本下载速度非常慢,因为它会将轮廓记录到std::list()中,并且几乎将所有时间都花在了内存分配上。将列表替换为大小为256个元素的std::vector来消除push_back()上的初始副本,仍然会使您使用的函数比cvFindContours()长3倍,直接占cvb::cvLabel()的66% )。因此,采用这种方式似乎并不可行。

有谁对我如何优化对多个矩形的检测有任何想法。我模糊的挥手包括:

  • 有没有等效于cvFindContour()的快速实现,理想情况下,作为我的多平台源代码,它也可以作为源代码使用?
  • 不需要大多数轮廓,只有“成功”的矩形有用。尤其是它们的内部轮廓就没有用了。从理论上讲,我可以根本不调用cvFindContours,而是调用cvStartFindContours/cvFindNextContour,测试找到的每个轮廓,如果找到要查找的矩形就不进行递归,因为这样可以保证子矩形无用?
  • 从经典的FindContours()/ApproxPoly()方法中可以使用一种完全不同的矩形检测算法吗?
  • 是否可以用感兴趣的有用区域“灌注” cvFindContours?例如。快速拐角检测几乎总是会返回我的基准标记拐角,即使阈值非常激进也是如此。有没有一种方法可以使用该点集来进行极限检测? (不幸的是,在很多标记或与标记无关的密集网格线(通常在我的应用程序中)的情况下,我不确定这有多大帮助。)
  • 与上述相同,由于Blob检测可以(如果我理解正确的话)可以实现为递归泛洪填充,因此是否有任何快速的矢量化实现可用于以某种方式提取有趣的Blob矩形和种子轮廓从那里检测?

  • 任何想法都将受到欢迎!

    最佳答案

    由于您的目标是矩形检测而不是轮廓检测,因此建议您使用积分图像进行计算。完整图像的说明可以在here中找到。计算完所需图像的积分图像后,可以通过三个操作来计算矩形的像素总和。

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

    关于opencv - cvFindContour()的更快替代品,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11335951/

    10-12 23:13