持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
来源:公众号「冒泡的肥皂」
转载请联系授权(微信ID:wxid_yhudfewbgu6c21)
-
前面两篇文章中,介绍了棋盘和棋子的识别,把两者结合起来我们就可以做一个棋谱的保存功能
- 上个对比效果
-
遇到的主要问题
想要保存棋盘的话需要知道每个坐标的棋子。
在上篇中顺序打印棋子的时候每条线上的棋子的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("识别出错了!")