4

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

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

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

我的问题如下,

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

6 回答 6

8

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

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

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

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

就这么容易。

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


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


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

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

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

那是对的吗?

如果是这样,那么您的问题比“任何地方”的一堆瓶子的更普遍的问题要容易得多。

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

于 2010-11-06T20:05:42.517 回答
3

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

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

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

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

如果您不能单独分割形成圆圈的连接组件,那么第 2 步将变得更加困难,因此应该对如何保证该条件进行一些额外的思考。

祝你好运。

编辑

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

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

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

于 2010-10-05T16:51:34.510 回答
2
  • 对于圆圈,请尝试 Hough 变换。
  • 其他机制:不知道
  • 编译的语言可能会更快。
于 2010-10-05T11:30:50.773 回答
1
  1. 颜色总和 + 凸包来检测边界。您主要需要矩形的 4 个角,而不是边?
  2. 没有运动,没有第二台摄像机,有一点选择 - 大量数学方法针对一点输入(颜色直方图,颜色分布矩阵)。不知道。
  3. Java == 高内存消耗,Lisp == 高脑消耗,C++ == 内存/cpu/速度/大脑使用最佳。
于 2010-10-05T11:34:13.557 回答
1

SIFT应该对圆形物体有很好的反应——不过它是专利的。GLOH是一个类似的算法,但我不知道是否有现成的实现。

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

于 2010-10-05T11:39:29.690 回答
1

如果对比度好,斑点分析就是这项工作的算法。

于 2010-11-06T20:34:04.833 回答