检测池中的球 table
Detecting balls on a pool table
我目前正在做一个项目,我需要能够非常可靠地获得球在游泳池中的位置 table。
我使用 table 以上的 Kinect v2 作为源。
初始 image 看起来像这样(通过丢弃不在 table 水平附近的像素将其从 16 位转换为 8 位后):
然后我从当前图像中减去空的参考图像table。
经过阈值化和均衡后,它看起来像这样:image
在单个图像上检测单个球相当容易,问题是我必须以 30fps 不断地检测。
困难:
- 低分辨率图像(512*424),一个球的直径约为 4-5 像素
- Kinect 深度图像从这个距离(2 米)开始有很多噪声
- 球在深度图像上看起来不同,例如黑球与其他球相比有点倒置
- 如果它们相互接触,那么它们可能会变成图像上的一个斑点,如果我尝试使用深度阈值将它们分开(仅使用球的顶部),那么一些球可能会从图像中消失
- 除了球之外的任何东西都不应被检测到,例如:球杆、手等,这一点非常重要...
我的过程哪种有效但不够可靠:
- 16 位到 8 位,通过阈值处理
- 将示例图像减去空白 table
- 裁剪
- 阈值
- 均衡
- 侵蚀
- 膨胀
- 二进制阈值
- 轮廓查找器
- 一些关于输出坐标的进一步算法
问题是台球杆或手可以被检测为一个球,而且如果两个球接触则可能会导致问题。还尝试使用 hough 圆,但收效甚微。 (如果 Kinect 更近,效果很好,但它无法覆盖整个 table)
任何线索将不胜感激。
扩展上面的评论:
我建议尽可能改进 IRL 设置。
在大多数情况下,确保可靠的设置比在 detecting/tracking 任何事情之前尝试 "fix" 用户计算机视觉更容易。
我的建议是:
- 将相机移近 table。 (您发布的图片可以大 117%,但仍能遮住口袋)
- 将相机与 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 开始:最初使用最简单且计算成本最低的设置,然后在进入更复杂的算法之前先看看结果有多稳健(这将需要理解并获得正确的参数以获得预期结果出)
我目前正在做一个项目,我需要能够非常可靠地获得球在游泳池中的位置 table。
我使用 table 以上的 Kinect v2 作为源。
初始 image 看起来像这样(通过丢弃不在 table 水平附近的像素将其从 16 位转换为 8 位后):
然后我从当前图像中减去空的参考图像table。
经过阈值化和均衡后,它看起来像这样:image
在单个图像上检测单个球相当容易,问题是我必须以 30fps 不断地检测。
困难:
- 低分辨率图像(512*424),一个球的直径约为 4-5 像素
- Kinect 深度图像从这个距离(2 米)开始有很多噪声
- 球在深度图像上看起来不同,例如黑球与其他球相比有点倒置
- 如果它们相互接触,那么它们可能会变成图像上的一个斑点,如果我尝试使用深度阈值将它们分开(仅使用球的顶部),那么一些球可能会从图像中消失
- 除了球之外的任何东西都不应被检测到,例如:球杆、手等,这一点非常重要...
我的过程哪种有效但不够可靠:
- 16 位到 8 位,通过阈值处理
- 将示例图像减去空白 table
- 裁剪
- 阈值
- 均衡
- 侵蚀
- 膨胀
- 二进制阈值
- 轮廓查找器
- 一些关于输出坐标的进一步算法
问题是台球杆或手可以被检测为一个球,而且如果两个球接触则可能会导致问题。还尝试使用 hough 圆,但收效甚微。 (如果 Kinect 更近,效果很好,但它无法覆盖整个 table)
任何线索将不胜感激。
扩展上面的评论:
我建议尽可能改进 IRL 设置。 在大多数情况下,确保可靠的设置比在 detecting/tracking 任何事情之前尝试 "fix" 用户计算机视觉更容易。
我的建议是:
- 将相机移近 table。 (您发布的图片可以大 117%,但仍能遮住口袋)
- 将相机与 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 开始:最初使用最简单且计算成本最低的设置,然后在进入更复杂的算法之前先看看结果有多稳健(这将需要理解并获得正确的参数以获得预期结果出)