基于CNN的中国象棋盘面识别
文章目录
- **基于CNN的中国象棋盘面识别**
- 前言
- 一、霍夫变换圆检测算法HoughCircles
- 二、CNN识别棋子
- 三、识别棋子颜色
- 总结
前言
例如:这是本人整个alphazero项目中的一个分支部分,主要是为了实现天天象棋盘面的自动检测,参考了网上的一些做法,同时利用卷积神经网络以最简便的方式实现了中国象棋盘面识别,因为识别速度和效果还算理想,所以记录一夕
天天象棋截图
象棋盘面识别
整个ocr_chessboard.py 分为三个小部分,分别是(1)使用opencv霍夫变换圆检测实现棋子定位,(2)利用自己训练的cnn模型进行棋子识别,(3)opencv识别棋子颜色。
分为三步而不是直接用cnn检测棋子类别跟颜色,主要是因为那样的话cnn数据集制作复杂,模型效果不理想,精准度也不高。
一、霍夫变换圆检测算法HoughCircles
代码如下(示例):
qipan = cv.imread('test2.png',1)
gray = cv.cvtColor(qipan, cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray,100,200,apertureSize = 3)
circle1 = cv.HoughCircles(gray, cv.HOUGH_GRADIENT, 1, 20, param1=100, param2=24, minRadius=26, maxRadius=30)
circles = circle1[0, :, :] # 提取为二维
circles = np.uint16(np.around(circles)) # 四舍五入,取整
# cv.circle(qipan, (i[0], i[1]), i[2], (255, 0, 0), 5) # 画圆
# cv.circle(qipan, (i[0], i[1]), 1, (255, 0, 0), 10) # 画圆心
二、CNN识别棋子
代码如下(示例):
#棋盘横坐标
x=int((i[0])/69)
#棋盘纵坐标
y=int((i[1])/69)
#CNN识别棋子是什么
grab_img=qipan[i[1] - i[2]:i[1] + i[2], i[0] - i[2]:i[0] +i[2]]
grab_gray_img=cv.cvtColor(grab_img, cv.COLOR_BGR2GRAY)
grab_gray_img = cv.cvtColor(grab_gray_img, cv.COLOR_GRAY2RGB)
result=chess_recon.recon_img(grab_img)
三、识别棋子颜色
#识别棋子颜色
img_hsv = cv.cvtColor(grab_img, cv.COLOR_BGR2HSV)
mask1 = cv.inRange(img_hsv, (0, 50, 20), (5, 255, 255))
mask2 = cv.inRange(img_hsv, (175, 50, 20), (180, 255, 255))
mask = cv.bitwise_or(mask1, mask2)
if cv.countNonZero(mask) > 0:
color="红"
else:
color="黑"
总结
源码模型下载地址:源码模型下载地址
到这里就基本实现了棋盘盘面的自动识别,为后续接入alphazero做好了准备工作,因为在代码实现过程中参考了网络上的一些做法,如果有侵权行为,请及时联系本人。QQ:365033268