- 前面两篇文章中,介绍了棋盘和棋子的识别,把两者结合起来我们就可以做一个棋谱的保存功能
象棋棋谱之表格识别(一)
- 上个对比效果
网络异常,图片无法展示
|
网络异常,图片无法展示
|
- 遇到的主要问题
想要保存棋盘的话需要知道每个坐标的棋子。
在上篇中顺序打印棋子的时候每条线上的棋子的y(高度坐标,注意算出来的x,y坐标是从左上方开始的)坐标有出入,在根据坐标排序的时候,就出现乱序了。
之前的做法就是根据棋盘每条横线的大概高度,误差在一定范围内的就认定为此线的棋子,大概的做法如下。
#第一排的棋子高度大概就在19左右 if abs(y - 19) < 20: y = 19 复制代码
我们想要完整实现棋盘识别的话,需要知道每个坐标点的棋子,上面的方法就没必要了。这里需要的是根据棋盘的坐标点来寻找匹配的棋子坐标,然后识别每个坐标点上的棋子。思路如下:\
网络异常,图片无法展示
|
思路如下
chess_array=[[] for i in range(10)] if(len(sxFilter)==9 and len(zxFilter)==10): #竖线 直线 print("---------------------") for i in range(len(zxFilter)): for j in range(len(sxFilter)): #直线坐标 x1,x2,y1,y2=zxFilter[i] #竖线坐标 x3,x4,y3,y4=sxFilter[j] check = False print(zxFilter[i],"-",sxFilter[j],i,j) for k in range(len(questionCnts)): x, y, w, h=questionCnts[k] #获取中心坐标 centre_x=x+w/2 centre_y=y+h/2 #范围之内匹配成功 print(centre_x,"-",centre_y) #获取范围 if(abs(centre_x-x3)<25 and abs(centre_y-y1)<25): print("命中!") check=True #抠图 im = img[y:y + h, x:x + w] #匹配 orc = get_match(im) if orc is not None: chess_array[i].append(orc) else: print("未识别...") if not check: chess_array[i].append("空空空") else: print("识别出错了!")