gpt4 book ai didi

opencv - cvFindContour() 的更快替代品

转载 作者:太空宇宙 更新时间:2023-11-03 20:49:53 26 4
gpt4 key购买 nike

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

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

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

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

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

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

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

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

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

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

  5. 与上述相同,由于 Blob 检测可以(如果我理解正确的话)作为递归洪水填充来实现,是否有任何快速矢量化实现可以用来以某种方式提取有趣的 Blob矩形,并从那里进行种子轮廓检测?

欢迎任何想法!

最佳答案

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

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com