使用OpenCV工具从连续图像差异中检测国际象棋的走法

8
嘿,我正在编写一个简单的国际象棋机器人视觉系统,我正在尝试改进以前的研究,允许使用摄像头和标准棋盘,并允许在比赛期间两者都移动。到目前为止,我可以通过网络摄像头获取图像并定位棋盘,我想通过取两个连续图像的差异来检测动作,以确定发生了什么变化,然后使用有关棋盘占用的先前信息来检测动作。
我的问题是,我目前似乎无法可靠地检测变化,我的当前流程如下: 减去两个图像->直方图均衡化差异图像->侵蚀和扩张差异图像以消除较小的变化->制作二进制副本并进行距离变换->获取最大的斑点(对应于DT之后的最高值,并填充该斑点)->再次重复,直到DT返回足够小的值以忽略更改。
我正在使用OpenCV和C ++编写所有这些内容,但我的泛洪似乎总是不填充斑点,因此大多数情况下我只检测到一个变化。我还尝试使用cv :: inpaint ,但也没有帮助。所以我的问题是;我是否只是使用了错误的方法或者某种方式可以使变化检测更可靠。如果是前者,人们可以建议替代路线,最好可以在合理的时间内用C ++ / Python和/或OpenCV编码?
谢谢
1个回答

3
定位棋盘并检测棋子移动的问题可以分开解决,假设在移动棋子时不移动棋盘。
以下是我处理此问题的一些想法:
检测棋盘的方向
您必须能够处理旋转的棋盘,以及移动棋盘,只要保持某个角度,让您可以看到棋子。如果棋盘上有您可以轻松识别的东西(例如每个角落上的标记),那么如果您失去方向(例如有人将棋盘完全移开摄像机),您可以轻松找回它。
为了跟踪棋盘,您需要在3D空间中建模相机相对于棋盘的位置。这与确定相机在固定棋盘周围移动的位置相同。一个Egomotion问题。解决了这个问题后,您可以继续下一阶段,即检测运动和跟踪物体。
检测棋子的运动
这可能是问题中比较简单的部分。有很多算法可以用于视频中的物体检测。我只想补充一下,您可以使用“关键”帧。我的意思是要识别那些在单次移动之前和之后只看到棋盘的帧。例如,您不会看到手移动或遮挡棋子等情况。一旦您获得了前后帧,就可以确定移动的内容以及其相对于棋盘的位置。
如果您假设连续性(即已经跟踪自棋盘初始布局以来的所有移动,这是众所周知的),则可能不需要识别每个棋子的形状。

最后一点注意:如果可以的话,我会避免使用C++来完成这个任务。用Python可能会更快地完成。当然,除非你发现了一些非常有价值的C++库,你非得使用它不可。在那种情况下,我会将其封装并从Python中使用。 - Assaf Lavie
感谢您的建议,我并不害怕完全放弃C++,我可以用Python完成所有工作,我更多地是在寻找创意。对于第一阶段,我有一个限制条件,即棋盘不需要进行任何修改(因此没有标记或类似的东西),因此我非常感谢任何考虑到这一点的评论。 - makokal
你可以依赖棋子的颜色是黑色或白色吗?如果可以的话,你可以在开始时对棋盘进行主成分分析并通过其颜色确定两方。但从那时起,你就必须跟踪棋盘以避免失去方向感。 - Assaf Lavie
是的,我事先有棋子的颜色,并且可以通过某种形式的“直方图均衡化”来处理光照变化。我将尝试在此基础上实现一些东西。感谢宝贵的建议。 - makokal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接