检测台球桌上的球

k3X*_*3XX 5 opencv image-processing computer-vision

我目前正在一个项目中,我需要能够非常可靠地获得球在台球桌上的位置。

我使用表格上方的Kinect v2作为来源。

初始图像如下所示(在通过丢弃不在表级别上的像素将其从16位转换为8位之后):

台球桌顶视图kinect深度原始

然后,我从当前图像中减去具有空表的参考图像。

阈值和均衡之后,它看起来是这样的:图片

台球桌顶视图kinect深度处理

在单个图像上检测单个球是相当容易的,问题是我必须以30fps的速度不断进行检测。

难点:

  • 低分辨率图像(512 * 424),球的直径约为4-5像素
  • Kinect深度图像在此距离(2米)处有很多噪点
  • 球在深度图像上看起来不同,例如,黑球与其他球相比有点倒立
  • 如果它们彼此接触,则它们可以成为图像上的一个斑点,如果我尝试使用深度阈值将它们分开(仅使用球的顶部),那么某些球可能会从图像中消失
  • 重要的是不要检测到除球以外的任何东西,例如:提示,手等...

我的过程是哪种工作方式,但不够可靠:

  • 通过阈值16位至8位
  • 用空表减去样本图像
  • 播种
  • 门槛
  • 均衡化
  • 腐蚀
  • 扩张
  • 二进制阈值
  • 轮廓查找器
  • 有关输出坐标的其他一些算法

问题在于撞球杆或手会被检测为球,而且如果两个球接触,也会引起问题。还尝试了霍夫圈,但成功率更低。(如果Kinect更近,效果很好,但它不能覆盖整个桌子)

任何线索将不胜感激。

Geo*_*nza 2

扩展上面的评论:

我建议尽可能改进 IRL 设置。大多数时候,确保可靠的设置比在开始检测/跟踪任何东西之前尝试“修复”用户计算机视觉更容易。

我的建议是:

  1. 将相机移近桌子。(您发布的图片可以放大 117%,但仍能遮住口袋)
  2. 将相机与桌子完全垂直对齐(并确保传感器支架坚固且固定良好):处理完美的自上而下视图比稍微倾斜的视图(这就是深度梯度显示的)更容易。(当然数据可以旋转,但是当你可以简单地保持传感器笔直时为什么要浪费 CPU 周期)

通过更可靠的设置,您应该能够根据深度设置阈值。您可以将阈值设置为球中心,因为无论如何,下面的信息都会被遮挡。球不会变形,因此如果半径快速减小,球可能会落入口袋。

如果您有清晰的阈值图像,则可以findContours()使用minEnendingCircle()。此外,您应该根据最小和最大半径值来限制结果,以避免视图中可能出现的其他对象(手、台球杆等)。另请查看Moments(),并务必阅读Adrian 的精彩《Ball Tracking with OpenCV》文章

pyimagesearch.com 使用 OpenCV 进行球跟踪文章预览

它使用 Python,但您应该能够找到您使用的语言的 OpenCV 等效调用。

在跟踪方面 如果您使用 OpenCV 2.4,您应该研究OpenCV 2.4 的跟踪算法(例如 Lucas-Kanade)。如果您已经使用 OpenCV 3.0,它有自己的贡献跟踪算法列表(例如 TLD)。

我建议首先从 Moments 开始:首先使用最简单且计算成本最低的设置,并在进入更复杂的算法之前查看结果如何(这将需要理解并获取正确的参数以获得预期结果)