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