什么是最快的边缘检测方法?

4

我计划为一个工业问题实现基于图像处理的解决方案。

这张图片由一个红色的矩形和一系列圆组成的矩阵构成。要求在以下条件下计算圆的数量。(实际应用:计算瓶子盒中的瓶子数目。有任何漏掉的瓶子吗?)

  1. 操作所需时间应该非常短。
  2. 需要检测红色矩形。我的目标是计算包装中的物品数量,因此没有任何机制(传感器)来触发相机。因此,相机将不断地拍照,但程序应该有一种方式来丢弃不必要的图像。
  3. 处理应该是实时的。
  4. 图像捕获可能存在"噪音"。您可能会看到椭圆形而不是圆形。

我的问题如下:

  1. 哪种最佳边缘检测算法与给定场景匹配?
  2. 除边缘检测外,还有其他机制可以使用吗?
  3. 我使用的语言对系统性能有很大影响吗?

@Joe。案例可能会被旋转一点,也可能存在与理想情况有所偏差的情况。请注意,工业环境并不总是表现得完美无缺 :) - Chathuranga Chandrasekara
6个回答

8

啊——你现在告诉我们瓶子是固定位置的!

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

您只需查看每个12个位置中是否有黑色区域即可。 没有比这更容易的事情了。

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

就是这么简单。

然后您指出盒子可能会旋转,物品可能会晃动。 盒子可能会轻微地旋转(甚至很大,每次从0到360),这非常容易处理。 瓶子位于“槽”中(即使晃动),这极大地改变了问题的性质。 您的主要问题(很容易)是等待每个新的红色正方形(箱子)位于相机下方的中心位置。 我刚意识到您在原始问题中的句子中字面上和具体地指的是“矩阵”。与找到无序的圆圈相比,这完全改变了一切。 查找一个斑点是否“开启”其中一个12个点之一,是一种截然不同的问题,与“识别图像中的圆圈”截然不同。 也许您可以发布一张图片来解决问题。


最后,我相信下面的Kenny已经找到了最佳解决方案:斑点分析。


“计算瓶盒中的瓶子数量”...

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

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

是这样吗?

如果是这样,那么您的问题比“任何地方”的瓶子堆积问题要简单得多。

简单地说,我们从哪里看到瓶子? 顶部,侧面,底部还是其他位置? 我们总是看到顶部/底部,还是它们混合在一起(即,从头到尾包装)。 这些问题产生了巨大的差异。


2
+1:预定义的插槽数量=为每个插槽定义一个正方形,在正方形中计算非黑色像素的数量,如果照明良好,则空插槽和非空插槽之间应该有很大的差异。任何图像处理库都可以在几乎实时的情况下完成这项工作,即使在小型嵌入式智能相机上也是如此。 - Adrien Plisson

3

Surf/Sift在这种情况下过于复杂,你肯定不需要它。

如果你想要实时速度(大约在800x600图像上达到20fps+),我建议使用Cuda来实现边缘检测,使用标准滤波方案如sobel, 然后实现二值化+ image closure以确保圆的边缘不会分割开。

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

  1. 运行 blob analysis/connected components 来分割不相交的圆。如果圆可以相交,则下一步将更加棘手。
  2. 对于每个连接的组件/ blob,使用 RANSAC 拟合圆或矩形,它可以实时运行(与我认为非常难以实时运行的Hough变换相比)。

如果无法将形成圆的连接组件分别分割,则第二步将更加困难,因此应该思考如何保证这种情况。

祝好运。

编辑

经过进一步思考,我觉得RANSAC非常适合圆形连接组件相互接触的情况。理论上,RANSAC应该只将圆拟合到连接组件的一部分(因为它能够在大多数异常点的情况下表现良好)。这意味着您可以添加额外的检查,以查看拟合的圆是否覆盖整个连接组件,如果不是,则重新运行留下的连接组件部分的RANSAC。根据需要反复进行。

此外,我意识到我说的是圆,但你也可以使用RANSAC来拟合椭圆而不是圆。

另外,我想评论一下,当我说CUDA是一个好选择时,我的意思是CUDA是实现Sobel滤波器+二值化+图像闭合的好选择。连接组件和RANSAC可能最好留给CPU处理,但您可以尝试将它们推送到CUDA中,虽然我不知道GPU对于这两个任务是否比CPU更有优势。


整套SURF/SIFT特征可能有些过于复杂,但从设计时间的角度来看,使用现有的SIFT/SURF特征提取器可能比自己编写定制算法更快,并且存在实际风险,即任何定制解决方案的最终性能都可能不如那些高度优化的算法(我之前就遇到过这种情况)。 - Gregor Petrin
@Gregor Petrin:确实,您的观点是正确的;然而,在这种特定情况下,SIFT和SURF的使用许可证都非常严格,基本上不允许任何人将它们用于商业目的。此外,据我所知,SIFT和SURF实现目前并不是实时的。 - ldog
+1,但我认为您不需要CUDA。使用高性能库,如使用现代CPU的SIMD指令的IPP,您应该能够轻松地以20 Hz进行Sobel滤波,二值化,形态学操作。即使只使用一个核心,可能也可以做到。 - Niki
CUDA 用于 20fps 的 sobel+bin+close?你疯了吗?使用一个简单的图像处理库在一个不错的处理器上可以做更多的事情!我个人使用最慢的图像处理库(NI Vision)实现了30fps。Matrox MIL 或 Intel IPP 应该足够完成这项工作。 - Adrien Plisson

2
  • 对于圆形,请尝试使用霍夫变换。
  • 其他机制:不确定。
  • 编译型语言可能会更快。

我稍微更新了一下我的问题。图像可能不是非常清晰。我们不会使用快门速度非常高的相机。因此,我们可能会将圆形捕捉为椭圆形。我能否使用霍夫变换进行校正? - Chathuranga Chandrasekara
霍夫变换用于寻找圆形,如果您想获得良好的帧速率,则需要事先知道圆的大小。 - Adrien Plisson

2
SIFT应该对圆形物体有很好的响应 - 虽然它已经被专利保护了。 GLOH是类似的算法,但我不知道是否有任何现成的实现。”
“实际上,进一步研究发现,SURF是SIFT的改进版本,有相当多的实现可用,请查看维基百科页面上的链接。”

SIFT必须在圆形上表现不佳,因为它们是对称的,所以没有首选位置出现。 - user1196549
只是一个快速的提醒,SIFT专利在2020年已经过期。 - Robinson

1

1
  1. 颜色之和+凸包检测边界。你需要的是矩形的4个角,而不是它的边?
  2. 没有运动,没有第二个相机,有一点选择-很多数学方法对抗一点输入(颜色直方图,颜色分布矩阵)。不知道。
  3. Java == 高内存消耗,Lisp == 高脑力消耗,C++ == 内存/CPU/速度/脑力使用最佳。

假设我可以使用第二个相机。 :) - Chathuranga Chandrasekara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接