k3X*_*3XX 5 opencv image-processing computer-vision
我目前正在一个项目中,我需要能够非常可靠地获得球在台球桌上的位置。
我使用表格上方的Kinect v2作为来源。
初始图像如下所示(在通过丢弃不在表级别上的像素将其从16位转换为8位之后):
然后,我从当前图像中减去具有空表的参考图像。
阈值和均衡之后,它看起来是这样的:图片
在单个图像上检测单个球是相当容易的,问题是我必须以30fps的速度不断进行检测。
难点:
我的过程是哪种工作方式,但不够可靠:
问题在于撞球杆或手会被检测为球,而且如果两个球接触,也会引起问题。还尝试了霍夫圈,但成功率更低。(如果Kinect更近,效果很好,但它不能覆盖整个桌子)
任何线索将不胜感激。
扩展上面的评论:
我建议尽可能改进 IRL 设置。大多数时候,确保可靠的设置比在开始检测/跟踪任何东西之前尝试“修复”用户计算机视觉更容易。
我的建议是:
通过更可靠的设置,您应该能够根据深度设置阈值。您可以将阈值设置为球中心,因为无论如何,下面的信息都会被遮挡。球不会变形,因此如果半径快速减小,球可能会落入口袋。
如果您有清晰的阈值图像,则可以findContours()使用minEnendingCircle()。此外,您应该根据最小和最大半径值来限制结果,以避免视图中可能出现的其他对象(手、台球杆等)。另请查看Moments(),并务必阅读Adrian 的精彩《Ball Tracking with OpenCV》文章
它使用 Python,但您应该能够找到您使用的语言的 OpenCV 等效调用。
在跟踪方面 如果您使用 OpenCV 2.4,您应该研究OpenCV 2.4 的跟踪算法(例如 Lucas-Kanade)。如果您已经使用 OpenCV 3.0,它有自己的贡献跟踪算法列表(例如 TLD)。
我建议首先从 Moments 开始:首先使用最简单且计算成本最低的设置,并在进入更复杂的算法之前查看结果如何(这将需要理解并获取正确的参数以获得预期结果)