基于机器视觉的中国象棋人机博弈系统设计

2019-09-19 07:33
测控技术 2019年6期
关键词:走法中国象棋极坐标

(青岛大学 自动化学院,山东 青岛 266071)

中国象棋历史悠久,经过几千年的发展,如今已在社会各阶层广泛普及,不仅是一种消遣娱乐形式,也是智力开发的一种手段。如今,中国象棋机器人等娱乐型机器人已成为机器人研究领域的热点方向。中国象棋机器人的研究开始于本世纪初,目前中国象棋机器人在人机博弈算法方面的研究已经日趋成熟。在棋子定位与识别方面的研究也正在深入,早期主要是利用反射光[1]、磁性原理以及射频[2]等方法来制作电子棋盘的方式实现棋子的定位与识别。但是这些方法都存在棋盘制作工艺复杂、适应性不强等缺点。如今,随着计算机技术的发展,机器视觉技术已经开始运用到棋子的定位与识别中。

在棋子定位问题上,文献[3]提出一种基于投影直方图和基于LSD算法的直线交点检测方法相结合的中国象棋棋盘角点检测算法,该算法效果较好但是程序复杂。文献[4]使用的是一种基于最小外接圆二次定位棋子的定位方法,存在个别字符定位误差较大的问题。

在棋子识别问题上,主要是运用汉字字符识别的方法,与传统字符识别方法不同,象棋棋子在摆放时具有旋转的任意性,针对旋转不变性问题,Hu[5]首先于1962年提出了连续函数矩的定义,可以用来识别旋转性目标[6]。Khotanzad和Hong[7]在1990年提出Zernike矩方法。Hu和Zernike方法有一定的实用性,但也存在缺点:Hu矩方法其核函数的非正交性和在离散化的过程中仍存在一定误差,对于纹理特征复杂的图像识别率比较低;基于Zernike矩的方法计算复杂。文献[8]提出使用基于文字连通数与孔数的方法和年轮统计的方法,该方法仅从理想情况下字符识别的角度进行考虑,受实际情况中摄像头分辨率、光照等外部因素影响较大。文献[9]采用目前较为常见的神经网络文字识别算法,存在新加入样本需重新对全体样本进行训练的问题,实时性不强。

针对以上问题,本文充分考虑实际应用场景,结合中国象棋人机博弈算法,使用图像剪切方法和基于对数极坐标变换&傅里叶变换的模板匹配方法实现了棋子的定位与识别。并且通过调用中国象棋人机博弈算法,搭建中国象棋机器人硬件平台,实现了中国象棋人机博弈系统的研制。

1 系统总体设计

基于机器视觉的中国象棋人机博弈系统主要包括三部分:① 中国象棋棋盘、棋子图像识别部分,主要过程为将摄像头采集模块采集的图像传入计算机,通过棋子识别算法识别出棋盘信息;② 中国象棋人机博弈算法部分,通过调用中国象棋人机博弈算法,搜索得出系统下一步应进行的走法;③ 机械臂执行部分,在上一步得到的走法的指导下,通过单片机控制机械臂,实现取子、移动、落子等操作,完成对弈过程。

2 中国象棋棋盘、棋子图像识别部分设计

2.1 图像预处理

(1) 桶形畸变矫正。

本系统图像采集模块采用的是普通家用USB网络摄像头,成像分辨率为1280像素×1024像素,在采集图像的过程中,由于镜头凸透镜对光线的折射作用,采集的图像会以镜头中心为圆心,呈圆形向外扩展失真,即桶形畸变现象,如图1(a)所示,因此首先应对图像进行桶形畸变矫正。图1(b)为桶形畸变矫正后的图像。

(2) 图像剪切。

由于棋子在棋盘中的位置是相对固定的,只会出现在横直线交叉点上,不会杂乱无章地出现在任意位置,因此各棋子的位置就比较容易确定。只要将摄像头固定,然后依次测出90个交点的坐标,按照坐标值将整张图片剪切成90张小图片,分别识别每张小图片中的内容。

(3) 棋子有无及棋子颜色的判断。

图1 桶形畸变矫正

由于HSV颜色空间更符合人类的视觉特征,因此在HSV颜色空间进行颜色的判断。先将图片从RGB颜色空间转换到HSV颜色空间,其中颜色的类别主要由色调H和饱和度S所决定,通过设定H、S、V各分量的阈值就可以实现棋子颜色及棋子有无的判断。

(4) 棋子的提取及处理。

经过以上棋子有无的判断之后,将含有棋子的图片进行灰度化、二值化、滤波等一系列操作,经过Hough变换圆检测算法将图片中的棋子提取出来。

然后再对棋子图像进行腐蚀填充等形态学滤波操作,消除图像上细小的噪声,并将其统一处理为50像素×50像素大小,以待后面的操作。提取并处理的11种棋子图片如图2所示。

图2 棋子图片

2.2 棋子类型识别算法

本系统棋子类型识别算法采用的是对数极坐标变换&傅里叶变换的模板匹配算法。

首先图像经过对数极坐标变换,将旋转变化量转化为易于处理的平移变化量,再与傅里叶变换模值的平移不变性相结合,就实现了旋转的不变性。

(1) 对数极坐标变换。

一幅二维图像中的每一像素的位置,可以用笛卡尔坐标表示,也可以用极坐标表示,它们之间存在着对应关系[10]:

(1)

对数极坐标就是在极坐标的基础上增加log运算。转换关系为

(2)

式中,k和l是为了让变换后的图不至于太小而人为加入的调整参数。笛卡尔坐标与对数极坐标的对应关系如图3所示。

图3 笛卡尔坐标系—对数极坐标系变换

当原图像旋转φ弧度时,有

Ψ1=Ψ+φ

(3)

其中Ψ和Ψ1分别为旋转前后对数极坐标中的横坐标。可见,通过坐标变换,可以将笛卡尔坐标下的旋转量转化为对数极坐标下的平移量。如图4所示,将棋子“兵”依次旋转45°和90°,则其变换后的图也依次平移一定的值。

图4 图像的旋转及其对数极坐标变换

(2) 离散傅里叶变换。

众所周知,傅里叶变换具有其模值在时域空间的平移不变性,由于图像是二维离散信号,所以应当使用二维离散傅里叶变换[11]。一个图像尺寸为M×N的函数f(x,y)的二维离散傅里叶变换F(u,v)为

(4)

若将其平移一段距离,则f(x-x0,y-y0)的傅里叶变换为

F(u,v)e-j2π(ux0+vy0)/N

(5)

其模值为

|fft2[f(x,y)]|=|fft2[f(x-x0,y-y0)]|

(6)

可以看出离散傅里叶变换的时域平移不变性,将它与对数极坐标变换相结合就可以实现图像的旋转不变性。

(3) 验证有效性。

为了验证此算法的有效性,随机选取了6张不同棋子的图片,将每张图片依次旋转一定角度,然后计算变换后的图像与原图像的相关系数。表1列出了经不同的角度旋转后的图像与原图像的相关系数。

表1 旋转一定角度后的图像与原图像的相关系数

从表中可以看出,旋转角度为90°、180°、270°时相关系数比较大,而在其他角度时效果不太理想,这可能是由于受实际环境中的光线、位置等的影响。因此在这里选取每张棋子图片旋转0°、10°、20°、30°、40°、50°、60°、70°、80°时的状态,将车、黑将、黑士、黑象、黑卒、红兵、红仕、红帅、红相、马、炮,11种棋子图片,每种图片的9个旋转状态,共99张图片作为模板库。由于黑车和红车、黑炮和红炮、黑马和红马只是颜色的差异,变换是相同的,所以把它们作为一种。

2.3 识别算法与结果

总结以上过程,本系统棋子识别的一般流程如下。

① 将剪切的90张小图片依次进行有无棋子及棋子颜色的识别,然后将有棋子的图片经过灰度化、二值化、滤波及Hough变换将棋子提取出来。

② 创建模板库。

③ 将待识别图像与模板库图像经过变换后作二维相关,最后将待识别的目标归入相关系数最大的那一类。将识别结果以数字的形式表示,例如:“0”表示空白,“1”表示黑将,“2”表示黑车,依此类推。

④ 将90张图片的识别结果以10×9的矩阵形式表示出来,以方便将识别结果传入中国象棋人机博弈算法中。

本文采集100张棋盘图像,其中每个棋子位置、角度任意,并且每张图片都各不相同,在Matlab环境下,运用此方法识别棋盘信息。经检测,识别结果正确率在98%左右。在对弈过程中,由于在每次棋子移动后,棋盘中仅有两个位置的内容会发生变化,因此不必再重复识别所有小图片中的内容,仅识别发生变化的小图片中的内容即可。在本系统中,使用差分法判断每张小图片中的内容是否发生变化,然后依次识别发生变化的小图片中的内容,之后将识别结果组成一个新的矩阵。这样极大地提高了系统的反应速度及可靠性。

3 中国象棋人机博弈算法设计

中国象棋人机博弈算法的主要作用是对一个棋盘局面列出所有合理的走法,并在其中搜索出最佳走法。该算法主要包括棋盘表示、走法产生、估值核心、搜索技术4个部分。

在棋盘的表示方法中,使用一个10×9个字节的二维数组来表示中国象棋的棋盘信息,数组中每一个字节代表棋盘上的一个交点[12],其值表明这个交点上有无棋子或棋子类型。形式如下:

unsigned char position[10][9] =

{

{ 2,3,6,5,1,5,6,3,2 },

{ 0,0,0,0,0,0,0,0,0 },

{ 0,4,0,0,0,0,0,4,0 },

{ 7,0,7,0,7,0,7,0,7 },

{ 0,0,0,0,0,0,0,0,0 },

{ 0,0,0,0,0,0,0,0,0 },

{ 14,0,14,0,14,0,14,0,14 },

{ 0,11,0,0,0,0,0,11,0 },

{ 0,0,0,0,0,0,0,0,0 },

{ 9,10,13,12,8,12,13,10,9 }

};

之后通过走法产生程序罗列出一个局面的所有可能的走法,通过估值程序评估一个局面的优劣程度。搜索算法采用的是Alpha_Bate剪枝搜索算法。Alpha_Bate剪枝搜索算法相较于传统的极大-极小值搜索算法减少了不必要节点的搜索,极大地提高了搜索效率和系统的反应时间。

通过中国象棋人机博弈算法,将搜索产生的下一步走法以一个4位数的形式表示出来,例如“abcd”,即表示将棋盘中第“a”行第“b”列的棋子,移动到第“c”行第“d”列。中国象棋人机博弈算法通过C++程序语言实现,开发平台为Visual Studio 2017。将此算法在Visual Studio 2017中调试好之后,在Matlab中使用mex命令将其转换为Matlab可识别的文件。在图像识别部分产生识别结果矩阵后直接将矩阵传入中国象棋人机博弈算法中,经过搜索产生下一步的走法,之后调用串口将下一步走法发送到下位机单片机中,以指导机械臂的动作。

4 机械臂执行部分设计

这一部分核心控制器采用的是基于ARM CortexTM-M3内核的32位RISC处理器STM32F103ZET6单片机[13],机械臂为4自由度机械臂,共5个数字舵机。在机械臂顶端安装一个电磁铁,通过控制电磁铁的得失电实现对铁质棋子的拿起和放置操作。

单片机控制的机械臂的运动主要是通过控制舵机来实现的。舵机的控制信号为周期是20 ms的脉宽调制(PWM)信号,其中脉冲宽度为0.5~2.5 ms,对应舵机的旋转角度为-90°~90°[14],呈线性变化。也就是说,给它提供一定宽度的PWM信号,它的输出轴就对应一个固定的角度,无论外界转矩怎样改变。

因此在本系统中将棋盘上每个点对应的机械臂上每个舵机应转动的角度,即对应的脉宽量存入一个数组。当单片机接收到串口发送的走法信息后,就会给各个舵机发送相应宽度的脉冲,实现将目标棋子移动到目标位置。因为本系统中舵机数量较多,需要的电流较大,因此各舵机采用单独供电,以提高系统的稳定性,同时舵机应与单片机系统共地。

5 系统测试

本系统实物图如图5所示。

图5 系统实物图

本系统使用的计算机CPU为Intel Core i5-3230M,主频2.6 GHz,系统运行环境为Matlab 2014a,将系统搭建完成后,对该系统进行测试,测试内容主要包括棋子位置与类型的识别,机械臂取子、移动、落子等动作。经过测试,各功能模块都能很好地实现各自的功能,之后对各模块进行联机调试,挑选几名象棋爱好者,同机器人进行对弈测试,在真实的对弈环境中,各模块配合良好,运行稳定,很好地实现了棋子的识别,以及机械臂取子、移动和落子等操作。

6 结束语

本文设计的基于机器视觉的中国象棋人机博弈系统,能够良好地实现人机对弈的过程,克服了电脑象棋软件对游戏者长时间下棋带来的眼睛疲劳及枯燥乏味感,增强了趣味性,特别适合儿童和老年人。并且象棋机器人经过改造更可以应用于其他领域,前景非常广阔。另外,本系统还偶尔存在棋子识别不准确影响系统运行的情况,因此,进一步提高棋子识别的准确率将是以后研究的重点。

猜你喜欢
走法中国象棋极坐标
巧用极坐标解决圆锥曲线的一类定值问题
不同的走法
极坐标视角下的圆锥曲线
马踏连营
中国象棋博弈程序中边界判断的优化方法研究
为业余棋手诊脉
许银川先胜万春林
一共有多少种走法
中国象棋起源