检测池中的球 table

Detecting balls on a pool table

我目前正在做一个项目,我需要能够非常可靠地获得球在游泳池中的位置 table。

我使用 table 以上的 Kinect v2 作为源。

初始 image 看起来像这样(通过丢弃不在 table 水平附近的像素将其从 16 位转换为 8 位后):

然后我从当前图像中减去空的参考图像table。

经过阈值化和均衡后,它看起来像这样:image

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

困难:

我的过程哪种有效但不够可靠:

问题是台球杆或手可以被检测为一个球,而且如果两个球接触则可能会导致问题。还尝试使用 hough 圆,但收效甚微。 (如果 Kinect 更近,效果很好,但它无法覆盖整个 table)

任何线索将不胜感激。

扩展上面的评论:

我建议尽可能改进 IRL 设置。 在大多数情况下,确保可靠的设置比在 detecting/tracking 任何事情之前尝试 "fix" 用户计算机视觉更容易。

我的建议是:

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

通过更可靠的设置,您应该能够根据深度设置阈值。 你可能会到达球的中心,因为下面的信息无论如何都被遮挡了。球不会变形,所以半径减小得很快球可能进了口袋。

如果你有清晰的阈值图像,你可以findContours()minEnclosingCircle(). Additionally you should contrain the result based on min and max radius values to avoid other objects that may be in the view (hands, pool cues, etc.). Also have a look at moments() and be sure to read Adrian's excellent Ball Tracking with OpenCV article

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

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

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