在该主题上找不到令人满意的答案。我想制作一个程序,可以从台球桌上方的摄像机获取快照并检测球。我正在使用OpenCV和Java。现在我的算法基本上是:
模糊图像->将RGB转换为HSV->分成3个平面->在H平面上使用Canny()->使用HoughCircles()方法检测球
此算法可以很好地检测球,它仅存在两个球(绿色和蓝色,因为桌子的背景是绿色)存在问题。但我想更进一步:
您是否知道如何实施任务1?我的想法是使用inRange()函数,但随后我必须为每个球准备一个遮罩,以检测指定范围的颜色中的一个球,并对每个球都进行此检测,对吗?感谢您分享您的意见。
@Edit:在这里,我为您提供一些有关算法工作方式的示例。我更改了一些参数是因为我想检测所有东西,但现在效果更差了,但仍能以相当不错的精度运行。我会给您三个相机原始图像样本,我检测到球的图像(未扭曲,带有一些滤镜)和检测到球的图像。
答案 0 :(得分:2)
推荐
:如果您可以掩盖与球相对应的像素,则以下方法应该可以根据其相关像素来区分条纹/实心球:
p
的亮度阈值。q
,则将其分类为条纹球。否则,这是一个坚实的球。(这种想法是条纹是白色的,并且总是至少部分可见,因此条纹的球将具有更高比例的白色像素)。
样本测试:
以下是此示例(用手p = 0.7
)应用于未校正图像中的某些球,最后有%白色像素在右侧。
看起来q = 0.1
的分类阈值(最少10%的白色像素为条纹球)可以区分这两组,尽管理想的情况是根据更多数据调整阈值。
如果使用此方法遇到阴影球的问题,也可以尝试在阈值化之前重新调整每个球的亮度(以使亮度跨越0、1的整个范围),这应使该方法对绝对亮度的依赖性降低