我找不到关于该主题的任何令人满意的答案。我想制作一个程序,可以从台球桌上方的相机获取快照并检测球。我正在使用 OpenCV 和 Java。我现在的算法基本上是:
模糊图像 -> 将 RGB 转换为 HSV -> 分成 3 个平面 -> 在 H 平面上使用 Canny() -> 使用 HoughCircles() 方法检测球
该算法可以很好地检测球,但仅对两个球(绿色和蓝色,因为桌子的背景是绿色)有问题。但我想更进一步:
- 检测球是否属于条纹或实心
- 设置每个球的 ID,条纹有例如 1-7,实心有 8-14,每个球都有唯一的 ID,在比赛期间不会改变
您知道如何实施任务#1吗?我的想法是使用 inRange() 函数,但是我必须为每个球准备一个掩码来检测指定颜色范围内的一个球,并对每个球进行此检测,对吗?感谢您分享您的意见。
@编辑:在这里我给你一些我的算法如何工作的示例。我更改了一些参数,因为我想检测所有内容,现在它的效果更差,但它仍然具有相当好的准确性。我将为您提供三个来自相机的原始图像样本、我检测到球的图像(未失真,带有一些滤镜)和检测到球的图像。
推荐:
如果您可以屏蔽与球对应的像素,则以下方法应该可以根据关联的像素区分条纹/实心球:
-
去饱和球像素和临界点它们在一定的亮度下
p
.
-
Count球区域内白色像素的数量和总像素。
-
计数阈值:如果白色像素的比例大于某个阈值
q
,将其分类为条纹球。否则,它就是一个实心球。
(这个想法是条纹是白色的,并且总是至少部分可见,因此条纹球将具有更高比例的白色像素)。
样品测试:
这是一个应用的示例(手动,使用p = 0.7
)到一些球未纠正的图像,最终 % 白色像素位于右侧。
看起来分类阈值是q = 0.1
(至少 10% 的白色像素成为条纹球)将区分这两个组,尽管基于更多数据调整阈值是理想的选择。
如果使用此方法遇到阴影球问题,您还可以尝试在阈值化之前重新调整每个球的亮度(以便亮度跨越整个范围 0、1),这应该使该方法更少依赖于绝对亮度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)