java - 检测台球 table 上的球(条纹和实心)

标签 java opencv

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

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

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

  • 检测球是条纹还是实心
  • 为每个球设置一个 ID,例如条纹为 1-7,纯色为 8-14,每个球都有唯一的 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. 去饱和 球像素并以某个亮度 p 对它们进行阈值
  2. 计算球区域内的白色像素数和总像素数。
  3. 计数阈值:如果白色像素的比例大于某个阈值q,则将其归类为条纹球。否则,它就是实心球。

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


样本测试:

下面是一个示例(手动,使用 p = 0.7)未矫正图像中的一些球,右侧有最终 % 的白色像素.

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

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

关于java - 检测台球 table 上的球(条纹和实心),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51792919/

相关文章:

Java EE 应用服务器 Hello World

java - 如何为单个类的多次运行创建一个数组列表常量?

python - python 上的迭代最近点 (ICP) 实现

python - 如何获得SVM精度?

image-processing - 在 OpenCV 中显示时叠加图像

java错误 ".class expected"

java - Android 帧动画被强制停止。需要理由

java - setter/getter 的正确命名约定

c# - 在 C# 中读取 ROS CompressedImage 数据字节数组

python - OpenCV 2.0 : where is adaptors. py?