检测台球桌上的球(条纹和固体)

Jak*_*ruk 8 java opencv

我找不到任何令人满意的答案.我想制作一个程序,从池台上方的摄像头获取快照并检测球.我正在使用OpenCV和Java.我的算法现在基本上是:

模糊图像 - >将RGB转换为HSV - >分割成3个平面 - >在H平面上使用Canny() - >使用HoughCircles()方法检测球

这个算法很好地检测球,它只有两个球的问题(绿色和蓝色,因为表的背景是绿色).但我想更进一步:

  • 检测球是否属于条纹或实体
  • 设置每个球的ID,条纹将具有例如1-7和实体8-14,每个球将具有在游戏期间不改变的唯一ID

你知道如何实现任务#1吗?我的想法是使用inRange()函数,但是我必须为每个在指定颜色范围内检测到一个球的球准备一个掩码,并为每个球做这个检测,对吗?感谢您分享您的意见.

@Edit:在这里,我给你一些我的算法如何工作的样本.我改变了一些参数因为我想要检测所有内容,现在它的效果更差,但它仍然可以很好地准确地运行.我会给你三张来自相机的原始图像样本,我检测到的图像(未失真,带有一些滤镜)和带有检测到的球的图像.

原始图像编号1 Canny图像编号1 检测到的球数为1的图像

原始图像编号2 Canny图像编号2 检测到的球数为2的图像

Oll*_*han 3

推荐:

如果您可以屏蔽与球对应的像素,则以下方法应该可以根据关联的像素区分条纹/实心球:

  1. 降低球像素的饱和度并在某个亮度下设置阈值p
  2. 计算球区域内白色像素的数量和总像素。
  3. 计数阈值:如果白色像素的比例大于某个阈值q,则将其分类为条纹球。否则,它就是一个实心球。

(这个想法是条纹是白色的,并且总是至少部分可见,因此条纹球将具有更高比例的白色像素)。


样品测试:

下面是一个将其应用于未校正p = 0.7图像中的某些球(手动使用 )的示例,最终 % 白色像素位于右侧。

看起来分类阈值q = 0.1(至少 10% 的白色像素成为条纹球)将区分这两个组,尽管基于更多数据调整阈值是理想的选择。

如果使用此方法遇到阴影球问题,您还可以尝试在阈值化之前重新调整每个球的亮度(以便亮度跨越整个范围 0、1),这应该使该方法更少依赖于绝对亮度。

  • 我将在下周尝试一下并就该主题进行一些更新。如果其他人对设置球 ID 等有一些想法,请随时分享。 (2认同)
  • 对于球 ID,您可能只需找到每个球像素的主色调(转换为 HSV,取色调值的饱和度加权平均值),然后按球的色调值对球进行排序以获得规范的排序(因为无论照明的相对色调应处于相同的顺序)。不过,您需要为白/黑球准备特殊的盒子。更强大的选择是使用直方图交集(https://mpatacchiola.github.io/blog/2016/11/12/the-simplest-classifier-histogram-intersection.html),或者只计算直方图特征向量并训练支持向量机。 (2认同)