8

嘿,我正在编写一个简单的国际象棋机器人视觉系统,我正在尝试改进以前的一些研究,以允许使用相机和标准国际象棋,并且两者都可以在游戏中移动。到目前为止,我可以在通过网络摄像头获取的图像中定位棋盘,并且我想通过对连续图像进行差异来检测移动,以确定发生了什么变化,然后使用有关棋盘占用的先前信息来检测移动。

我的问题是我目前似乎无法可靠地检测到变化,我当前的管道是这样的:减去两个图像->直方图均衡差异图像->侵蚀和扩张差异图像以删除微小的变化->制作二进制复制并进行距离变换 -> 获取最大的 blob(对应于 DT 并填充该 blob 之后的最大值) -> 再次重复,直到 DT 返回一个小到足以忽略更改的值。

我正在用 OpenCV 和 C++ 编写所有这些代码。但是我的洪水填充似乎总是不能填充斑点,因此大多数情况下我只检测到一个变化。我也尝试过使用cv::inpaint,但这也无济于事。所以我的问题是;我只是使用了错误的方法还是图灵可以使变更检测更可靠。如果是前者,人们是否可以在合理的时间内建议替代路线,最好在 C++/Python 和/或 OpenCV 中编码?

谢谢

4

1 回答 1

3

固定棋盘和检测棋子移动的问题可以独立解决,假设一个人不移动棋盘,同时也移动棋子。

关于我将如何处理它的一些想法:

检测电路板的方向

只要保持一定的角度,您就必须能够处理旋转到位的板子,以及四处移动,让您看到碎片。如果板上有一些您可以轻松识别的东西(例如每个角上的标记),这将有所帮助,这样如果您失去方向(例如有人将板完全远离相机),您可以很容易地再次找到它。

为了跟踪电路板,您需要在 3D 空间中对相机相对于电路板的位置进行建模。这与确定围绕固定板移动的摄像机的位置是相同的问题。自我运动的问题。一旦你解决了这个问题,你就可以进入下一个阶段,即检测运动和跟踪对象。

检测工件的运动

这可能是问题中比较简单的部分。有很多算法用于视频中的对象检测。我只想补充一点,您可以使用“关键”帧。我的意思是识别那些在单次移动前后你只能看到棋盘的帧。例如,您看不到手移动它遮挡了碎片等。一旦有了前/后框架,您就可以弄清楚移动的是什么以及它相对于棋盘的位置。

如果您假设连续性(即您已经跟踪了自板的初始布置以来的所有动作,这是众所周知的),您可能无法识别每块棋子的形状而侥幸逃脱。

于 2011-05-06T16:44:13.687 回答