嗨,我编码了一个简单的下棋机器人的视觉系统,我想改善以前的一些研究,以使相机和一个标准的国际象棋使用,都被允许在游戏中移动.到目前为止,我可以在通过网络摄像头获取的图像中找到电路板,我想通过获取连续图像的差异来检测移动,以确定已更改的内容,然后使用有关电路板占用率的先前信息来检测移动.
我的问题是我现在似乎无法可靠地检测到变化,我目前的管道是这样的:减去两个图像 - >直方图均衡差异图像 - >侵蚀和扩张差异图像以消除微小变化 - >制作二进制复制并执行距离变换 - >获取最大的blob(对应于DT后的最高值并填充该blob) - >再次重复,直到DT返回足够小的值以忽略更改.
我在OpenCV和C++中编写所有这些代码.但我的洪水填充似乎总是要么不填充blob,因此大多数情况下我只是检测到一个变化.我也试过使用,cv::inpaint
但也没有帮助.所以我的问题是; 我只是使用错误的方法或以某种方式图灵可以使变化检测更可靠.对于前者,人们是否可以在合理的时间内建议替代路线,最好是C++/Python和/或OpenCV中的可编码路径?
谢谢
假设在移动棋子的同时不移动棋盘,那么固定棋盘和检测棋子移动的问题可以独立解决。
关于我将如何处理它的一些想法:
检测板的方向
您必须能够处理旋转到位的棋盘,以及移动棋盘,只要保持一定的角度,让您可以看到棋子。如果板上有一些您可以轻松识别的东西(例如每个角上的标记),那么如果您失去方向(例如有人将板完全移离相机),您可以轻松地再次找到它,这将会有所帮助。
为了跟踪电路板,您需要在 3D 空间中对相机相对于电路板的位置进行建模。这与确定相机围绕固定板移动的位置是同样的问题。自我情绪问题。一旦解决了这个问题,您就可以进入下一阶段,即检测运动和跟踪对象。
检测工件的移动
这可能是问题中更简单的部分。有很多用于视频中对象检测的算法。我只想补充一点,您可以使用“关键”帧。我的意思是识别那些在单次移动之前和之后您只能看到棋盘的帧。例如,您看不到移动的手会遮挡棋子等。一旦您有了前后框架,您就可以弄清楚移动的是什么以及它相对于棋盘的位置。
如果您假设连续性(即您已经跟踪了棋盘最初排列以来的所有动作,这是众所周知的),那么您可能无法识别每个棋子的形状。
归档时间: |
|
查看次数: |
2799 次 |
最近记录: |