ARTICLE · 1167439
象棋游戏中棋盘棋子的识别,附源码
象棋游戏中棋盘棋子的识别,附源码前言 



=正文完= 我个人微信xiaomu86119,有按键精灵安卓版的问题可以做找我,常见的问题基本都会,收费解答~ 
更多内容点击进入公众号查看往期文章
大家好,我是郭立员~,本文所讲内容仅供学习参考,请勿非法使用。
这次只是做棋盘棋子的识别,不做象棋api的对接。
一、识别的思路
棋盘大小是9*10共计90个位置,所以我们可以框选出90个区域范围,然后用图色命令识别出每个位置的棋子(无棋子位置为空)。

二、划分区域
棋盘一共有90个位置,每个位置原本就是一个点,现在把它扩展成一个范围。

扩展的方式是上下左右各个方向扩展半个棋盘格。
如果棋盘格不是正方形,那么就把长宽分开写。
三、识别每一个范围的棋子
① 把每一个棋子截图,一般相同的棋子截取一张就可以了,这里按照1-14的编号命名的。

② 做一个数组,把1-14的编号对应的棋子命名存储在数组里面
Dim arr_pic_content = {"車","馬","砲","象","士","卒","将","俥","傌","炮","相","仕","兵","帥"}这样通过识别的序号就可以知道对应的棋子是哪一个。
③ 使用opencv找图,这个找图命令相对容错要高一点,保证相同棋子都可以识别出来。
四、识别的代码
Dim x = 38Dim y = 224Dim w = 58dim h = 56.5Dim arr = {null}Dim intx,intyDim arr_pic_content = {"車","馬","砲","象","士","卒","将","俥","傌","炮","相","仕","兵","帥"}Dim arr_pic = {null}For n = 1 To 14arr_pic[n] = "/sdcard/pictures/xq/"&n&".png"NextKeepCaptureFor j = 0 To 9arr[j+1] = {null}For i = 0 To 8dim ret = OpenCV.FindImgBest(x + (i - 0.5) * w, y + (j - 0.5) * h, x + (i + 0.5) * w, y + (j + 0.5) * h, join(arr_pic,"|"), 0.8, 0.9, 1.2, 10,{"isGray":true})If ret["code"] = 0 Thenarr[j + 1][i + 1] = arr_pic_content[ret["data"][1]["index"]]Elsearr[j + 1][i + 1] = " "End IfNextNextReleaseCaptureFor j = 1 To 10TracePrint encode.TableToJson(arr[j])Next
五、识别的结果

测试识别耗时是2秒多,这个速度后续写下棋的脚本完全够用的。
