Python 从棋盘图像创建数组

Python 从棋盘图像创建数组,python,opencv,computer-vision,Python,Opencv,Computer Vision,基本上,我正在研制一种可以下西洋棋的机器人手臂。 棋盘上方有一个摄像头提供图片(甚至是视频资料,但我想那只是一系列图片,因为跳棋并不是一种快节奏的游戏,我可以每隔几秒钟拍一张照片,然后从那里开始) 我需要找到一种方法将视觉板转换成一个二维数组,输入a.I计算机器人的移动 我有一个线条检测工作,它沿着正方形的边缘绘制线条(作为前一步,还返回canny中的边缘)。此外,我检测到绿色和红色(我的棋盘的方块是绿色和红色),并将它们分别作为掩码返回 我还有一个球体检测,用于检测碎片的位置,还有一些黑白颜色

基本上,我正在研制一种可以下西洋棋的机器人手臂。 棋盘上方有一个摄像头提供图片(甚至是视频资料,但我想那只是一系列图片,因为跳棋并不是一种快节奏的游戏,我可以每隔几秒钟拍一张照片,然后从那里开始)

我需要找到一种方法将视觉板转换成一个二维数组,输入a.I计算机器人的移动

我有一个线条检测工作,它沿着正方形的边缘绘制线条(作为前一步,还返回canny中的边缘)。此外,我检测到绿色和红色(我的棋盘的方块是绿色和红色),并将它们分别作为掩码返回

我还有一个球体检测,用于检测碎片的位置,还有一些黑白颜色检测,返回一个带有黑色或白色检测区域的遮罩

我的问题是,我现在如何将我拥有的这些东西结合起来,从而得到某种类型的数组,从中我可以推断出我的碎片所在的正方形的信息? 例如,我如何构建2d阵列(或将任何8x8)阵列连接到带有红色/绿色瓷砖线条和/或遮罩的电路板图像?我想我必须做一些校准?
其次,有没有一种方法可以覆盖遮罩,这样我就知道哪些棋子在哪个方块中了?

首先,请记住,国际象棋总是从相同位置的相同棋子开始,例如,黑色骑士从8-B开始,在2D数组中可以是[1][7]。如果我是你,我会从一个2D数组开始,其中包含所有棋子的起始位置

至于知道哪些片段在哪里:您不需要识别片段本身。如果我是你,我会做的是检测棋盘上的空白点,与真正识别不同的棋子相比,这其实很容易

一旦你的检测系统检测到一个以前的空白点现在不再是空的,你就知道一个棋子被移动到了那里。由于您还可以检测到一个新的开放点(棋子来自的点),因此您也知道移动的确切棋子。如果你在整场比赛中跟踪这个列表,你总能知道哪些棋子被移动了,哪些棋子在哪里

编辑:


正如评论中提到的,我的答案是基于国际象棋而不是西洋跳棋。不过,这个想法仍然是一样的,但现在你可以将人和国王放置在2D阵列中,而不是棋子。

首先,请记住,国际象棋总是从相同位置的相同棋子开始,例如,黑色骑士从8-B开始,在2D阵列中可以是[1][7]。如果我是你,我会从一个2D数组开始,其中包含所有棋子的起始位置

至于知道哪些片段在哪里:您不需要识别片段本身。如果我是你,我会做的是检测棋盘上的空白点,与真正识别不同的棋子相比,这其实很容易

一旦你的检测系统检测到一个以前的空白点现在不再是空的,你就知道一个棋子被移动到了那里。由于您还可以检测到一个新的开放点(棋子来自的点),因此您也知道移动的确切棋子。如果你在整场比赛中跟踪这个列表,你总能知道哪些棋子被移动了,哪些棋子在哪里

编辑:


正如评论中提到的,我的答案是基于国际象棋而不是西洋跳棋。不过,这个想法仍然是一样的,但现在您可以将人和国王放置在2D阵列中,而不是棋子。

基于边缘检测器或红/绿正方形检测器,计算游戏板上每个正方形的中心坐标。例如,求正方形左右边缘的x坐标的平均值,以获得正方形中心的x坐标。同样,求上边缘和下边缘的y坐标的平均值,以获得中心的y坐标

也可以找到电路板的上边缘、左边缘、下边缘和右边缘,然后进行插值以找到所有正方形的中心。每个正方形的边长可能超过100个像素,因此计算不需要那么精确

要确定碎片的位置,请迭代中心坐标列表并查看像素的颜色。如果是红色或绿色,则正方形为空。如果是黑色或白色,正方形中有相应的一块。使用该信息用AI的信息填充数组

如果图像有噪声,可能需要对中心附近的几个像素取平均值,或者对几个帧上的中心像素取平均值


如果相机位于电路板中心上方,则效果最佳。如果它偏侧,则图像中的边缘将不平行/正交,这可能会使寻找中心的数学变得复杂。

基于边缘检测器或红/绿正方形检测器,计算游戏板上每个正方形的中心坐标。例如,求正方形左右边缘的x坐标的平均值,以获得正方形中心的x坐标。同样,求上边缘和下边缘的y坐标的平均值,以获得中心的y坐标

也可以找到电路板的上边缘、左边缘、下边缘和右边缘,然后进行插值以找到所有正方形的中心。每个正方形的边长可能超过100个像素,因此计算不需要那么精确

要确定碎片的位置,请迭代中心坐标列表并查看像素的颜色。如果是红色或绿色,则正方形为空。如果是黑色或白色,正方形中有相应的一块。使用该信息用i填充数组