嘿,我正在编写一个简单的国际象棋机器人的视觉系统,我正在努力改进以前的一些研究,允许使用相机和标准的国际象棋集,并允许两者在游戏过程中移动。到目前为止,我可以在通过网络摄像头获得的图像中找到棋盘,我想通过连续图像的差异来检测移动,以确定发生了什么变化,然后使用以前关于棋盘占用的信息来检测移动。
我的问题是,我似乎不能可靠地检测变化的时刻,我目前的管道是这样的:减去两张图像->直方图平衡差异图像->侵蚀和扩大差异图像以消除微小的变化->进行二进制复制并进行距离变换->获得最大的blob(对应于DT后的最高值并填充该blob) ->再次重复,直到DT返回一个足够小的值以忽略变化。
我在OpenCV和c++中编码所有这些。但我的洪水填充似乎总是不填充blobs,因此大多数情况下,我只检测到一个变化。我也尝试过使用cv::inpaint
,但这也没有帮助。我的问题是;是我使用了错误的方法,还是图灵可以使变更检测更可靠?在前者的情况下,人们是否可以建议替代路线,最好在合理的时间内用c++/Python和/或OpenCV编码?
谢谢
如果不移动棋盘,同时移动棋子,则可以独立解决固定在棋盘上和检测棋子移动的问题。
关于如何处理它的一些想法:
检测单板方向
你必须能够处理在适当的地方旋转的棋盘,以及移动周围,只要保持一定的角度,让你看到的碎片。如果在板上有一些你可以很容易地识别的东西(例如,每个角上的标记),这样如果你失去方向(例如,有人把板从相机完全移开),你可以很容易地找到它。
为了跟踪板子,你需要在3D空间中模拟相机相对于板子的位置。这与确定相机在固定板上移动的位置是一样的问题。自我情感的问题。一旦你解决了这个问题,你就可以进入下一个阶段,即检测运动和跟踪物体。
检测棋子移动
这可能是问题中比较简单的部分。有很多算法用于视频中的目标检测。我只想补充一点,你可以使用"关键"帧。我的意思是,识别那些你只看到一个动作前后棋盘的帧。例如,你看不到手在移动,它模糊了棋子等。一旦你有了前后帧,你就可以弄清楚什么移动了,以及它相对于板的位置。
如果你假设连续性,你可能无法识别每个棋子的形状(即你已经跟踪了自棋盘初始安排以来的所有移动,这是众所周知的)。