使用OpenCV工具检测国际象棋从连续的图像差异中移动
嘿,我正在编写一个简单的国际象棋机器人的视觉系统,我正试图改进一些以前的研究,以允许使用相机和标准国际象棋套装,并允许在游戏中移动。 到目前为止,我可以在通过网络摄像头采集的图像中找到该电路板,并且我希望通过对不同的连续图像进行检测来确定发生了什么变化,然后使用之前关于电路板占用情况的信息来检测移动。
我的问题是我目前似乎无法可靠地检测到变化,我目前的流水线如下所示:减去两个图像 - >直方图均衡差异图像 - >侵蚀和扩大差异图像以消除微小变化 - >创建二进制复制并执行距离转换 - >获取最大的斑点(对应于DT之后的最高值并填充该斑点) - >重复,直到DT返回一个足够小的值以忽略更改。
我在OpenCV和C ++中编写了所有这些代码。 但是我的洪水填充似乎总是要么不填充斑点,因此大多数情况下我只能得到一个检测到的变化。 我也尝试过使用cv::inpaint
但这也没有帮助。 所以我的问题是; 我只是使用错误的方法,或者某种方式可以使变化检测更可靠。 在前者的情况下,人们是否可以建议其他路线,最好在合理的时间内用C ++ / Python和/或OpenCV编码?
谢谢
解决棋盘上的问题和检测棋子的移动问题可以独立解决,假设棋子在移动棋子的同时不移动棋子。
关于我如何接近它的一些想法:
检测电路板的方向
您必须能够处理正在旋转的板,并且只要保持一定的角度就可以移动,以便您可以看到这些块。 如果在棋盘上有东西可以轻松识别(例如每个角落有一个标记),那么这将有所帮助,这样如果您失去了方向(例如有人将棋盘完全移离摄像机),您可以再次轻松找到它。
为了跟踪电路板,您需要在3D空间中对相机相对于电路板的位置进行建模。 这与确定相机在固定板周围移动的位置相同。 运动的问题。 一旦你解决了这个问题,你就可以进入下一个阶段,即检测运动和跟踪对象。
检测棋子的移动
这可能是问题中较简单的部分。 视频中有很多算法用于对象检测。 我只会补充说,你可以使用“关键”框架。 我的意思是确定在一次移动之前和之后只能看到棋盘的那些帧。 例如,您看不到手遮挡了棋子等。一旦您拥有了前/后框架,您就可以找出移动的位置以及相对于棋盘的位置。
如果你认为连续性(即你已经追踪了自从董事会初始安排以来就知道的所有动作),那么你可能会不知道每件作品的形状。
链接地址: http://www.djcxy.com/p/6713.html上一篇: Detecting Chess moves from successive image differences using OpenCV tools