基于CNN的中国象棋棋子识别(1)

本文介绍了如何利用深度学习中的卷积神经网络对中国象棋棋子进行自动识别,通过构建多样化的训练集,包括图像预处理、二值化和霍夫变换,以提高模型的泛化能力和鲁棒性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.前言        

        中国象棋作为一种古老而深受喜爱的棋类游戏,一直以来都吸引着无数棋手的热情。随着人工智能和计算机视觉技术的不断发展,将这项传统的棋类运动与现代技术相结合,探索人机协作与智能决策的可能性成为了一项有趣而挑战性的任务。

        本项目旨在利用卷积神经网络(CNN)这一深度学习的强大工具,对中国象棋中的棋子进行自动识别。

2.构建训练集(图像预处理)

        我本来想直接搜集网络上现成的数据集进行训练,但是我发现并没有完备的数据集,且针对在线下棋(例:天天象棋)更是没有一个恰当的训练集,于是我构建了适合网络下棋应用场景的训练集。

    1.转换为二值图像,提取圆内棋子

        一个棋子可以截取几张不同位置,颜色,状态的图片,运行以下代码进行一个初步的提取。

        此处为图像处理的主要部分,在我们运行模型测试的同时也要进行图像的预处理,首先第一步是将图像转换为灰度图像,接着转换为二值化图像,最后利用霍夫变换提取出棋子。

#将原图转换为二值化图像
def firstStep(name):
    #转灰度->二值化图像
    image = Image.open(name)
    image = image.convert("L")
    image = image.point(lambda x: 0 if x < 128 else 255)
    image.save('task1.png')

#利用霍夫变换,提取圆内图像
def houghCircles():
    img_src = cv2.imread('task1.png')
    gray = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)
    #模糊处理
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)
    #可以针对图片再进行一些腐蚀,膨胀操作等,更好的提取象棋的字
    
    #这里是霍夫变化,可以修改对假圆的识别力度,大小等,更好的提取
    circles = cv2.HoughCircles(blurred, cv2.HOUGH_GRADIENT, dp=1, minDist=50, param1=50, param2=30, minRadius=30,maxRadius=0)

    if circles is not None:
        circles = np.uint16(np.around(circles))

        for i in circles[0, :]:
            center = (i[0], i[1])
            radius = i[2]

            # 提取圆内部内容
            mask = np.zeros_like(blurred)
            cv2.circle(mask, center, radius, 255, thickness=-1)
            result = cv2.bitwise_and(img_src, img_src, mask=mask)

            path='task2.png'
            # 显示提取出的圆内部内容
            cv2.imwrite(path, result)

       2.旋转角度,批量构建数据集                                                        

#旋转棋子
def thirdStep(name,angle):
    # 读取图像
    image = cv2.imread('task2.png')

    # 获取图像中心点坐标
    height, width = image.shape[:2]
    center = (width // 2, height // 2)

    # 定义旋转角度(正值为顺时针,负值为逆时针
    print(angle)

    # 创建旋转矩阵
    rotation_matrix = cv2.getRotationMatrix2D(center, angle, 1.0)

    # 使用旋转矩阵进行仿射变换
    rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height),
                                   borderMode=cv2.BORDER_CONSTANT, borderValue=(0, 0, 0))
    
    #输入训练集路径
    path=""+name
    cv2.imwrite(path,rotated_image)

if __name__ == '__main__':
    
    #截图所存放文件夹
    path = "./Origin"
    dirs = os.listdir(path)
    for file in dirs:
        flag=0
        pic_dir = os.path.join(path, file)
        print(file)
        for i in os.listdir(pic_dir):
            image_dir = os.path.join(pic_dir, i)
            firstStep(image_dir)
            houghCircles()
            for i in range(1,360):
                flag=flag+1
                angle=i
                thirdStep(file+"/"+str(flag)+".png",angle)

3. 验证效果

        这是我经过上述操作后的图像转变。

        原始截图 

        

        二值化图像 

        霍夫变换图像

        

         上述操作完成后,基本完成训练集的构建,

4.结尾    

        在中国象棋棋子识别这一任务中,构建一个多样性的数据集是确保模型泛化能力的关键因素之一。通过包含各种各样的棋局、棋子摆放方式和环境条件,我们能够更好地模拟真实对局情景,使得模型在面对未曾见过的棋盘布局时也能做出准确的判断。

        多样性的数据集不仅有助于模型更好地学习棋子的外观特征,还能够帮助模型更好地适应不同的光照、阴影和背景条件。这对于将模型应用于实际象棋对局中至关重要,因为真实世界中的环境变化是不可避免的。

        此外,多样性的数据集也有助于提高模型的鲁棒性,使其对于输入数据的微小变化能够更加稳健。一个能够泛化到各种情境的模型,才能真正成为实际应用中可靠的工具。

        因此,通过致力于构建一个多样性且全面的数据集,我们可以更好地培养出具备强大泛化能力的中国象棋棋子识别模型,为象棋爱好者提供更加智能和可靠的辅助工具。这也反映了在深度学习领域中,良好的数据基础是取得卓越性能的不可或缺的一环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值