我找不到关于该主题的任何令人满意的答案。我想制作一个程序,从台球 table 上方的相机获取快照并检测球。我正在使用 OpenCV 和 Java。我现在的算法基本上是:
模糊图像 -> 将 RGB 转换为 HSV -> 分成 3 个平面 -> 在 H 平面上使用 Canny() -> 使用 HoughCircles() 方法检测球
这个算法可以很好地检测球,它只有两个球(绿色和蓝色,因为 table 的背景是绿色的)有问题。但我想更进一步:
- 检测球是条纹还是实心
- 为每个球设置一个 ID,例如条纹为 1-7,纯色为 8-14,每个球都有唯一的 ID,在比赛期间不会改变
您知道如何执行任务 #1 吗?我的想法是使用 inRange() 函数,但是我必须为每个球准备一个掩码,以检测指定颜色范围内的那个球,并对每个球进行这种检测,对吗?感谢您分享您的意见。
@Edit:在这里,我为您提供了一些示例,说明我的算法是如何工作的。我更改了一些参数,因为我想检测所有内容,现在它的效果更差,但它仍然可以非常准确地工作。我会给你三个来自相机的原始图像样本,我检测到球的图像(未失真,带有一些过滤器)和检测到球的图像。
最佳答案
建议:
如果您可以屏蔽掉与球对应的像素,则以下方法应该可以根据相关像素区分条纹/实心球:
- 去饱和 球像素并以某个亮度
p
对它们进行阈值。 - 计算球区域内的白色像素数和总像素数。
- 计数阈值:如果白色像素的比例大于某个阈值
q
,则将其归类为条纹球。否则,它就是实心球。
(想法是条纹是白色的,并且总是至少部分可见,因此条纹球将具有更高比例的白色像素)。
样本测试:
下面是一个示例(手动,使用 p = 0.7
)未矫正图像中的一些球,右侧有最终 % 的白色像素.
看起来 q = 0.1
的分类阈值(至少 10% 的白色像素是条纹球)将区分这两组,尽管根据更多信息调整阈值是理想的数据。
如果您使用此方法遇到阴影球的问题,您也可以尝试在设置阈值之前重新调整每个球的亮度(以便亮度跨越整个范围 0、1),这应该会减少该方法对绝对亮度的依赖.
关于java - 检测台球 table 上的球(条纹和实心),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51792919/