【问题标题】:What is the fastest way of edge detection?边缘检测最快的方法是什么?
【发布时间】:2011-04-21 06:17:31
【问题描述】:

我正在考虑针对工业问题实施基于图像处理的解决方案。

图像由一个红色矩形组成。在里面我会看到一个圆圈矩阵。要求是在以下约束条件下计算圈数。 (实际应用:数一个瓶壳里的瓶子数量。有没有漏掉的瓶子???)

  1. 操作所需的时间应该非常短。
  2. 我还需要检测红色矩形。我的目标是计算 包装中的物品并且没有 机制(传感器)来触发 相机。所以相机需要捕捉 照片不断,但 程序应该有办法丢弃 不必要的图像。
  3. 处理应该是实时的。
  4. 图像捕获中可能存在“噪音”。您可能会看到椭圆形而不是圆形。

我的问题如下,

  1. 与给定匹配的最佳边缘检测算法是什么 场景?
  2. 除了边缘之外,我还可以使用其他机制吗? 检测?
  3. 我使用的语言和 系统?

【问题讨论】:

  • @乔。箱子可以由机器人旋转。与理想情况的偏差可能很小。请注意,工业环境的表现并不完美:)

标签: algorithm performance graphics image-processing edge-detection


【解决方案1】:
  • 对于圆,请尝试 Hough 变换。
  • 其他机制:不知道
  • 编译的语言可能会更快。

【讨论】:

  • 稍微更新了我的问题。图像可能不是非常清晰。我们不会使用快门速度非常高的相机。所以我们可以将圆圈捕获为椭圆。我可以为此使用带有霍夫变换的校正吗?
  • 霍夫变换查找圆圈要求您事先知道圆圈的大小,如果您想获得不错的帧率。
【解决方案2】:
  1. 颜色总和 + 凸包来检测边界。大多数情况下,您需要矩形的 4 个角,而不是边?
  2. 没有运动,没有第二个摄像头,有一点选择 - 大量的数学方法针对一点输入(颜色直方图、颜色分布矩阵)。不知道。
  3. Java == 高内存消耗,Lisp == 高脑消耗,C++ == 内存/cpu/速度/大脑使用最佳。

【讨论】:

  • 假设我可以使用第二个相机。 :)
【解决方案3】:

SIFT 应该对圆形物体有很好的响应——不过它已获得专利。 GLOH是类似的算法,不知道有没有现成的实现。

实际上,做更多的研究,SURF 是 SIFT 的改进版本,有很多可用的实现,请查看维基百科页面上的链接。

【讨论】:

  • SIFT 必须在圆圈上表现不佳,因为它们是对称的,因此它们没有首选出现的位置。
【解决方案4】:

Surf/Sift = 在这种情况下你肯定不需要它。

如果您想要实时速度(在 800x600 图像上大约 20fps+),我建议使用 Cuda 使用标准过滤器方案(如 sobel)实现边缘检测,然后实现二值化 + image closure 以确保边缘检测圆圈没有被分割开。

最难的部分是拟合圆圈。这是假设您已经到了获取边缘并确保它们使用图像闭合(形态学)连接的步骤。此时我将按以下步骤进行:

  1. 运行blob analysis/connected components 以分割出接触的圆圈。如果圈子可以触摸,下一步会更棘手
  2. 对于每个连接的组件/blob,使用可以实时运行的RANSAC 拟合一个圆形或矩形(与我认为非常难以实时运行的 Hough 变换相反。)

如果你不能分割形成圆圈的连接组件,那么第 2 步将更加困难,因此应该对如何保证这种情况进行一些额外的思考。

祝你好运。

编辑

再想一想,我觉得 RANSAC 非常适合圆形连接组件确实接触的情况。 RANSAC 应该假设只将圆拟合到连接组件的一部分(由于它在大多数异常点的情况下表现良好的能力。)这意味着您可以添加额外的检查以查看拟合的圆是否包含整个连接组件,如果没有,则在连接组件中被遗漏的部分重新运行 RANSAC。冲洗并根据需要重复多次。

我也意识到我说的是圆形,但您可以使用 RANSAC 轻松拟合椭圆而不是圆形。

另外,我想评论一下,当我说 CUDA 是一个不错的选择时,我的意思是 CUDA 是实现 sobel 过滤器 + 二值化 + 图像关闭的不错选择。连接的组件和 RANSAC 可能最好留给 CPU,但你可以尝试将它们推到 CUDA 上,尽管我不知道 GPU 会给你带来多大的优势。

【讨论】:

  • 整套 SURF/SIFT 特征当然是多余的,但就设计时间而言,使用现有的 SIFT/SURF 特征提取器可能比自己编写自定义算法更快,而且任何定制解决方案的最终性能都会比那些高度优化的算法差(我知道我以前也遇到过),这是一个真正的风险。
  • @Gregor Petrin:确实你的观点是有效的;但是,在这种特殊情况下,使用 SIFT 和 SURF 的许可都具有高度限制性,基本上不允许任何人将它们用于商业目的。此外,据我所知,SIFT 和 SURF 实现目前不是实时的。
  • +1,但我认为您不需要 CUDA。使用像 IPP 这样的高性能库,它使用现代 CPU 的 SIMD 指令,您应该能够轻松地进行 20 Hz 的 sobel 过滤、二值化、形态学运算。可能即使你只使用一个核心。
  • CUDA 用于 20fps sobel+bin+close ?你生病了吗 ??您可以在体面的处理器上使用简单的图像处理库做更多事情!我个人使用现有最慢的图像处理库(即 NI Vision)实现了 30fps。 Matrox MIL 或 Intel IPP 应该足以胜任这项工作。
【解决方案5】:

啊——你现在已经告诉我们瓶子在固定位置了!

这是一个非常简单的问题。

您所要做的就是查看 12 个点中的每一个,看看那里是否有黑色区域。没有什么比这更容易了。

您根本不需要进行任何边缘或形状检测。

就这么简单。

然后你指出盒子可能会旋转,东西可能会摇晃。盒子可能会旋转一点(甚至很多,每次0到360)很容易处理。瓶子在“插槽”中(即使摇晃)的事实极大地改变了问题的性质。你的主要问题(这很容易)是等到每个新的红色方块(板条箱)都在相机下方居中。我刚刚意识到您在原始问题的句子中的字面意思和具体意思是“矩阵”。与发现混乱的圆圈相比,这完全改变了一切。在 12 个点中的一个点上查找 blob 是否“打开”是一个与“识别图像中的圆圈”截然不同的问题。也许您可以发布一张图片来结束这个问题。


最后,我相信下面的 Kenny 已经确定了最佳解决方案:blob 分析。


“数一数瓶壳中的瓶子数量”...

各个瓶子是否位于“插槽”中?即,有 4x3 = 12 个孔,每个瓶子一个。

换句话说,您“只”需要确定 12 个孔中的每个孔中是否有瓶子。

对吗?

如果是这样,你的问题比“任何地方”的一堆瓶子的更一般的问题要容易得多。

很简单,我们从哪里看到瓶子?顶部,侧面,底部,还是?我们是否总是看到顶部/底部,或者它们是混合的(即,从头到尾包装)。这些问题产生了巨大的差异。

【讨论】:

  • +1: 预定义的槽数 = 为每个槽定义一个正方形,计算正方形中的非黑色像素,在良好的照明下,空槽和非-空的。任何图像处理库都几乎可以实时执行此操作,即使在小型嵌入式智能相机上也是如此。
【解决方案6】:

如果对比度好,blob analysis 就是该作业的算法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多