在我的计算机视觉中,轮廓检测占用了我的大部分时间,并且它需要更快。我已经通过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% )。因此,采用这种方式似乎并不可行。
有谁对我如何优化对多个矩形的检测有任何想法。我模糊的挥手包括:
任何想法都将受到欢迎!
最佳答案
由于您的目标是矩形检测而不是轮廓检测,因此建议您使用积分图像进行计算。完整图像的说明可以在here中找到。计算完所需图像的积分图像后,可以通过三个操作来计算矩形的像素总和。
假设要在每个非黑色对象周围绘制矩形,可以使用以下方法。递归地将图像及其子图像划分为4个,并丢弃像素总和低于所需阈值的矩形。您将剩下许多近似对象的小矩形。合并相邻的矩形将快速近似检测到的对象。
关于opencv - cvFindContour()的更快替代品,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11335951/