我目前正在开展一个项目,我需要能够非常可靠地将球的位置放在台球桌上。
我使用表格上方的Kinect v2作为来源。
初始image看起来像这样(通过丢弃不在表级别的像素将其转换为16位的8位):
然后我用当前图像中的空表减去参考图像。
在阈值处理和均衡之后,它看起来像这样:image
在单张图像上检测单个球相当容易,问题是我必须以30fps的速度不断检测。
难点:
我的流程哪种工作但不够可靠:
问题是可以将球杆或手可以检测为球,如果两个球接触,那么它可能会导致问题。也尝试过hough圈,但成功率更低。 (如果Kinect更接近但是它不能覆盖整个表格,那就很好用)
任何线索都会非常感激。
答案 0 :(得分:1)
扩展上述评论:
我建议尽可能地改进IRL设置。 大多数情况下,确保可靠的设置比在尝试检测/跟踪任何内容之前尝试“修复”用户计算机视觉更容易。
我的建议是:
通过更可靠的设置,您应该能够根据深度进行阈值处理。 你可以对球的中心设置阈值,因为无论如何信息都会被遮挡。球不会变形,因此球的半径可能会快速缩小,球可能放在口袋里。
如果您有一个明确的阈值图像,则可以findContours()
和minEnclosingCircle()。此外,您应该根据最小和最大半径值来反对结果,以避免视图中可能存在的其他对象(手,池提示等)。另请查看moments(),并务必阅读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开始:最初使用最简单且计算量最小的设置,并在进入更复杂的算法之前看看结果是如何进行的(这需要理解并获得正确的参数以获得预期结果)