news 2026/6/12 22:26:02

从棋盘识别到AI裁判:手把手教你用OpenCV搭建五子棋对弈记录系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从棋盘识别到AI裁判:手把手教你用OpenCV搭建五子棋对弈记录系统

从棋盘识别到AI裁判:手把手教你用OpenCV搭建五子棋对弈记录系统

线下五子棋比赛中,裁判需要全程紧盯棋盘记录每一步落子位置,这不仅耗费人力,还容易因疲劳导致误判。传统的人工记录方式已经无法满足现代棋类赛事对效率和准确性的双重需求。本文将带你从零开始构建一套完整的五子棋对弈记录系统,这套系统能够自动识别棋盘状态、记录棋谱、判断胜负,甚至提供棋局复盘功能。

1. 系统架构设计

一套完整的五子棋对弈记录系统需要包含以下几个核心模块:

  • 图像采集模块:负责定时拍摄棋盘图像
  • 棋盘识别模块:定位棋盘位置并校正透视变形
  • 棋子检测模块:识别每个棋子的位置和颜色
  • 棋局分析模块:判断当前棋局状态和胜负
  • 数据存储模块:将棋局信息序列化为标准棋谱格式
  • 可视化模块:提供棋局回放和分析功能

1.1 硬件选型建议

对于线下比赛场景,我们需要考虑以下硬件因素:

设备类型推荐配置注意事项
摄像头1080P及以上分辨率固定安装位置,确保棋盘完整入镜
照明均匀柔和的LED光源避免反光和阴影干扰
棋盘标准19×19棋盘建议使用高对比度棋盘

提示:在实际部署时,建议将摄像头固定在棋盘正上方约1.5米处,确保棋盘占据画面主要区域。

2. 核心算法实现

2.1 棋盘定位与校正

棋盘定位是整个系统的基础,我们需要准确找到棋盘在图像中的位置,并校正透视变形:

def find_chessboard(image): # 转换为灰度图 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 高斯模糊降噪 blur = cv2.GaussianBlur(gray, (5, 5), 0) # 边缘检测 edges = cv2.Canny(blur, 50, 150) # 查找轮廓 contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 找到面积最大的轮廓(棋盘) max_contour = max(contours, key=cv2.contourArea) # 获取最小外接矩形 rect = cv2.minAreaRect(max_contour) box = cv2.boxPoints(rect) box = np.intp(box) # 透视变换校正 width, height = int(rect[1][0]), int(rect[1][1]) dst_pts = np.array([[0, 0], [width-1, 0], [width-1, height-1], [0, height-1]], dtype="float32") M = cv2.getPerspectiveTransform(box.astype("float32"), dst_pts) warped = cv2.warpPerspective(image, M, (width, height)) return warped, M

2.2 棋子检测与识别

棋子检测需要解决三个关键问题:

  1. 准确定位每个棋子的中心位置
  2. 正确识别棋子颜色(黑/白)
  3. 将棋子位置映射到棋盘坐标
def detect_stones(image): # 转换为HSV颜色空间 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 定义黑白棋子的颜色范围 lower_black = np.array([0, 0, 10]) upper_black = np.array([180, 255, 90]) lower_white = np.array([0, 0, 100]) upper_white = np.array([180, 30, 255]) # 创建颜色掩膜 mask_black = cv2.inRange(hsv, lower_black, upper_black) mask_white = cv2.inRange(hsv, lower_white, upper_white) # 霍夫圆检测 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp=1, minDist=25, param1=100, param2=19, minRadius=10, maxRadius=20) stones = [] if circles is not None: circles = np.uint16(np.around(circles[0])) for (x, y, r) in circles: # 计算棋盘坐标 row = round(y / (image.shape[0] / 19)) col = round(x / (image.shape[1] / 19)) # 判断棋子颜色 black_area = mask_black[y-r:y+r, x-r:x+r] white_area = mask_white[y-r:y+r, x-r:x+r] if cv2.countNonZero(black_area) > 50: stones.append(('black', row, col)) elif cv2.countNonZero(white_area) > 50: stones.append(('white', row, col)) return stones

3. 胜负判断算法

五子棋的胜负判断需要检查四个方向(水平、垂直、两个对角线)是否有连续五个同色棋子:

def check_win(board, last_move): directions = [(0, 1), (1, 0), (1, 1), (1, -1)] color, row, col = last_move for dx, dy in directions: count = 1 # 正向检查 x, y = row + dx, col + dy while 0 <= x < 19 and 0 <= y < 19 and board[x][y] == color: count += 1 x += dx y += dy # 反向检查 x, y = row - dx, col - dy while 0 <= x < 19 and 0 <= y < 19 and board[x][y] == color: count += 1 x -= dx y -= dy if count >= 5: return True return False

4. 工程化挑战与解决方案

在实际部署中,我们会遇到各种边缘情况和性能挑战:

4.1 处理棋子遮挡问题

在比赛过程中,选手的手可能会遮挡部分棋子。我们可以采用以下策略:

  • 多帧验证:连续分析多帧图像,只有当棋子被检测到多次才确认
  • 运动检测:识别选手手的移动,在选手手离开后立即拍摄新图像
  • 历史数据参考:基于之前的棋盘状态推断可能的落子位置

4.2 提高实时性

为了确保系统能够实时响应,需要进行以下优化:

  1. 区域检测:只检测棋盘区域,而非整张图像
  2. 增量更新:只检查可能发生变化的区域(如新落子位置附近)
  3. 并行处理:将图像采集与处理分离到不同线程

4.3 棋谱存储与标准化

为了便于棋局分析和分享,我们需要将棋局信息存储为标准格式(如SGF):

def save_to_sgf(moves, filename): with open(filename, 'w') as f: f.write('(;GM[1]FF[4]CA[UTF-8]AP[GomokuRecorder]SZ[19]\n') for i, (color, row, col) in enumerate(moves): x = chr(ord('a') + col) y = chr(ord('a') + row) f.write(f';{"B" if color == "black" else "W"}[{x}{y}]\n') f.write(')')

5. 系统集成与部署

将各个模块整合为一个完整的系统需要考虑以下方面:

  • 用户界面:提供简单的控制界面,让裁判可以开始/结束记录
  • 异常处理:当检测到异常情况(如棋盘被遮挡)时发出警报
  • 数据备份:定期自动备份棋谱数据
  • 性能监控:监控系统资源使用情况,确保稳定运行

在实际部署中,我们发现以下几个配置参数对系统性能影响最大:

参数推荐值调整建议
图像分辨率1920x1080过低影响识别精度,过高增加处理负担
检测间隔2秒根据比赛节奏调整
霍夫圆检测参数215-25影响棋子检测灵敏度
颜色阈值需现场校准根据光照条件调整

注意:系统部署后需要进行现场校准,特别是颜色识别阈值和棋盘定位参数,以确保在不同光照条件下的稳定性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 22:24:54

实战指南:UnicodeIt高效LaTeX转Unicode工具深度解析

实战指南&#xff1a;UnicodeIt高效LaTeX转Unicode工具深度解析 【免费下载链接】unicodeit Converts LaTeX tags to unicode: \mathcal{H} → ℋ. Available on the web or as Automator script for the Mac. 项目地址: https://gitcode.com/gh_mirrors/un/unicodeit U…

作者头像 李华
网站建设 2026/6/12 22:22:52

如何永久保存微信聊天记录:WeChatMsg完全免费开源工具终极指南

如何永久保存微信聊天记录&#xff1a;WeChatMsg完全免费开源工具终极指南 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/…

作者头像 李华
网站建设 2026/6/12 22:20:41

解锁BT下载潜能:trackerslist项目让你的下载速度提升300%

解锁BT下载潜能&#xff1a;trackerslist项目让你的下载速度提升300% 【免费下载链接】trackerslist Updated list of public BitTorrent trackers 项目地址: https://gitcode.com/GitHub_Trending/tr/trackerslist 你是否曾经遇到过BT下载速度慢如蜗牛&#xff0c;或者…

作者头像 李华
网站建设 2026/6/12 22:13:55

5个实用技巧:用Locale-Emulator轻松解决软件语言兼容性问题

5个实用技巧&#xff1a;用Locale-Emulator轻松解决软件语言兼容性问题 【免费下载链接】Locale-Emulator Yet Another System Region and Language Simulator 项目地址: https://gitcode.com/gh_mirrors/lo/Locale-Emulator 你是否遇到过这种情况&#xff1a;下载了一个…

作者头像 李华
网站建设 2026/6/12 22:13:01

最强模型Claude Fable 5被破解!Anthropic暗箱降智风波引众怒

最强模型Claude Fable 5被破解就在刚刚&#xff0c;最强模型Claude Fable 5被破解了&#xff01;知名黑客「Pliny the Liberator」公开宣布&#xff0c;Fable 5的安全分类器已被自己率领的团队彻底攻破。属于绝对禁区的漏洞利用代码&#xff0c;以及各种违禁化学品的制作步骤&a…

作者头像 李华
网站建设 2026/6/12 22:11:52

Mermaid Live Editor:3个颠覆性改变让图表创建效率提升500%

Mermaid Live Editor&#xff1a;3个颠覆性改变让图表创建效率提升500% 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-e…

作者头像 李华