检测在撞球台上的球

时间:2016-11-21 10:09:45

标签: opencv image-processing computer-vision

我目前正在开展一个项目,我需要能够非常可靠地将球的位置放在台球桌上。

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

初始image看起来像这样(通过丢弃不在表级别的像素将其转换为16位的8位):

pool table top view kinect depth raw

然后我用当前图像中的空表减去参考图像。

在阈值处理和均衡之后,它看起来像这样:image

pool table top view kinect depth processed

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

难点:

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

我的流程哪种工作但不够可靠:

  • 通过阈值处理16位到8位
  • 使用空表减去样本图像
  • 裁剪
  • 阈值
  • 均等化
  • 侵蚀
  • 扩张
  • 二进制阈值
  • 轮廓查找器
  • 输出坐标上的一些其他算法

问题是可以将球杆或手可以检测为球,如果两个球接触,那么它可能会导致问题。也尝试过hough圈,但成功率更低。 (如果Kinect更接近但是它不能覆盖整个表格,那就很好用)

任何线索都会非常感激。

1 个答案:

答案 0 :(得分:1)

扩展上述评论:

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

我的建议是:

  1. 将相机移近桌子。 (您发布的图像可以大117%,仍然可以覆盖口袋)
  2. 将相机对准与桌子完全垂直(并确保传感器支架坚固且固定良好):处理完美的自上而下视图比略微倾斜的视图更容易(这是深度渐变显示的内容) )。 (确保数据可以旋转,但为什么在简单地保持传感器平直时浪费CPU周期)
  3. 通过更可靠的设置,您应该能够根据深度进行阈值处理。 你可以对球的中心设置阈值,因为无论如何信息都会被遮挡。球不会变形,因此球的半径可能会快速缩小,球可能放在口袋里。

    如果您有一个明确的阈值图像,则可以findContours()minEnclosingCircle()。此外,您应该根据最小和最大半径值来反对结果,以避免视图中可能存在的其他对象(手,池提示等)。另请查看moments(),并务必阅读Adrian's excellent Ball Tracking with OpenCV article

    pyimagesearch.com Ball Tracking with OpenCV article preview

    它使用的是Python,但您应该能够找到与您使用的语言相同的OpenCV调用。

    跟踪 如果您使用OpenCV 2.4,您应该查看OpenCV 2.4's tracking algorithms(例如Lucas-Kanade)。 如果您已经使用过OpenCV 3.0,那么它拥有自己的list of contributed tracking algorithms(例如TLD)。

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