如何检测填充圆圈的网格?

Posted

技术标签:

【中文标题】如何检测填充圆圈的网格?【英文标题】:How can I detect a grid of filled circles? 【发布时间】:2016-05-21 02:42:09 【问题描述】:

给定一个连接 4 板的图像,我想识别并输出板的状态(一个 6 x 7 矩阵)。我尝试的第一种方法是先找到圆圈,然后在它们的质心中寻找网格图案。

这是我正在使用的 open-cv 函数:

circles = cv2.HoughCircles(bw_im,
                               cv2.cv.CV_HOUGH_GRADIENT,
                               dp=DP,
                               minDist=MIN_DIST,
                               minRadius=MIN_RADIUS,
                               maxRadius=MAX_RADIUS)

我加了非极大值抑制,但是效果不是很好。

有没有比直接处理霍夫圆更好的方法,也许有某种我不知道的填充循环形态学操作。

这是一个示例输入图像:

您可以假设输入图像已被裁剪并且具有与上述类似的边距(我有另一段代码可以处理此问题)。

【问题讨论】:

圆圈,为什么一定是圆圈?分割红色/黄色斑点并使用它们的质心可能更简单。 看看cv2.inRange,例如here,您可以轻松地分割红色和黄色(最后是蓝色),首先将您的图像转换为 HSV。 我也会推荐 HSV 颜色空间以及分割或轮廓检测等。 【参考方案1】:

如果 Hough 不是必需的,我建议按照此处所述实施光线投射算法:https://en.wikipedia.org/wiki/Point_in_polygon

一般步骤是:

    为红色圆圈创建蒙版 在间隔为yx 列上运行光线投射以确定红色的# 和位置 对黄色重复第 1 步和第 2 步

由于您使用的是 RGB,颜色对比度应该足以为您提供良好的效果。

【讨论】:

【参考方案2】:

假设您的网格将保持其位置,最简单的方法是为每个插槽设置一个固定的感兴趣区域,并在每次更改时测量它们的色调值。

【讨论】:

以上是关于如何检测填充圆圈的网格?的主要内容,如果未能解决你的问题,请参考以下文章

如何用增加的半径填充圆?

SVG - 具有笔划宽度的圆圈未填充铬

如何设置数据网格列以填充数据网格集以填充和布局自动调整大小的网格?

如何填充画布上的“对面”形状?

使用 Canvas 为填充圆设置动画

画一个圆圈,用不同的颜色填充不同的部分