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

时间:2018-08-10 19:23:59

标签: java opencv

在该主题上找不到令人满意的答案。我想制作一个程序,可以从台球桌上方的摄像机获取快照并检测球。我正在使用OpenCV和Java。现在我的算法基本上是:

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

此算法可以很好地检测球,它仅存在两个球(绿色和蓝色,因为桌子的背景是绿色)存在问题。但我想更进一步:

  • 检测球是否属于条纹或固体
  • 设置每个球的ID,条纹将具有例如1-7和实体8-14,每个球将具有唯一的ID,该ID在游戏中不会发生变化

您是否知道如何实施任务1?我的想法是使用inRange()函数,但随后我必须为每个球准备一个遮罩,以检测指定范围的颜色中的一个球,并对每个球都进行此检测,对吗?感谢您分享您的意见。

@Edit:在这里,我为您提供一些有关算法工作方式的示例。我更改了一些参数是因为我想检测所有东西,但现在效果更差了,但仍能以相当不错的精度运行。我会给您三个相机原始图像样本,我检测到球的图像(未扭曲,带有一些滤镜)和检测到球的图像。

Original image number 1 Canny image number 1 Image with detected balls number 1

Original image number 2 Canny image number 2 Image with detected balls number 2

1 个答案:

答案 0 :(得分:2)

推荐

如果您可以掩盖与球相对应的像素,则以下方法应该可以根据其相关像素来区分条纹/实心球:

  1. 使球像素去饱和,并以p的亮度阈值
  2. 计数:球区域内的白色像素数和总像素数。
  3. 计数阈值::如果白色像素的比例大于某个阈值q,则将其分类为条纹球。否则,这是一个坚实的球。

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


样本测试:

以下是此示例(用手p = 0.7)应用于未校正图像中的某些球,最后有%白色像素在右侧。

看起来q = 0.1的分类阈值(最少10%的白色像素为条纹球)可以区分这两组,尽管理想的情况是根据更多数据调整阈值。

GrandBlog

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