用Python+OpenCV给五子棋拍个照,自动识别棋盘和胜负(附完整代码)
2026/6/2 3:39:30 网站建设 项目流程

用Python+OpenCV打造智能五子棋裁判系统:从图像识别到胜负判定

五子棋作为一款经典策略游戏,其规则简单却蕴含无限变化。当计算机视觉遇上传统棋类游戏,会碰撞出怎样的火花?本文将带你用Python和OpenCV构建一个能自动识别棋盘状态、判断胜负的智能系统。无论你是想为线下对弈添加科技感,还是探索计算机视觉的趣味应用,这个项目都能让你在动手实践中掌握图像处理的核心技术。

1. 环境准备与核心思路

在开始编码前,我们需要明确系统的技术路线。整个流程可分为四个关键阶段:

  1. 棋盘定位:从杂乱背景中提取棋盘区域
  2. 棋子检测:识别棋盘上所有棋子的精确位置
  3. 颜色识别:区分黑白两色棋子
  4. 胜负判定:检查是否存在五子连珠

1.1 基础环境配置

首先确保已安装必要的Python库:

pip install opencv-python numpy matplotlib

核心工具简介:

  • OpenCV:计算机视觉处理的核心库
  • NumPy:高效处理图像矩阵运算
  • Matplotlib:辅助调试时可视化中间结果

提示:建议使用Jupyter Notebook进行开发,便于分步调试和结果可视化。

2. 棋盘定位:从图像中提取对战区域

2.1 图像预处理流程

典型的处理流程如下:

import cv2 import numpy as np # 读取原始图像 image = cv2.imread('gobang.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 高斯模糊降噪 blurred = cv2.GaussianBlur(gray, (5, 5), 0) # Canny边缘检测 edges = cv2.Canny(blurred, 50, 150)

参数调整经验:

  • 高斯模糊核大小建议为奇数,典型值(5,5)或(7,7)
  • Canny阈值推荐比例1:3(如50:150)

2.2 棋盘轮廓提取与矫正

找到最大轮廓并计算最小外接矩形:

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)

常见问题及解决方案:

问题现象可能原因解决方法
找不到棋盘轮廓背景过于复杂增加预处理步骤或调整Canny阈值
识别到多个轮廓棋盘不完整使用面积筛选最大轮廓
外接矩形倾斜拍摄角度问题应用透视变换矫正

3. 棋子检测与定位

3.1 霍夫圆检测实战

利用霍夫变换检测圆形棋子:

circles = cv2.HoughCircles( warped_gray, cv2.HOUGH_GRADIENT, dp=1, minDist=25, param1=100, param2=19, minRadius=10, maxRadius=20 )

关键参数解析:

  • minDist:圆之间的最小距离(与棋盘格大小相关)
  • param1:Canny边缘检测的高阈值
  • param2:圆心累加器阈值(越小检测到的圆越多)

3.2 棋盘坐标系建立

将检测到的圆映射到棋盘坐标:

grid_size = width // 18 # 标准19x19棋盘 for (x, y, r) in circles[0]: row = round(y / grid_size) - 4 col = round(x / grid_size) - 4 print(f"检测到棋子位于:行{row}列{col}")

4. 棋子颜色识别技术

4.1 HSV色彩空间分析

转换到HSV空间更易区分黑白:

hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) # 黑白棋子HSV范围 black_lower = np.array([0, 0, 10]) black_upper = np.array([180, 255, 90]) white_lower = np.array([0, 0, 100]) white_upper = np.array([180, 30, 255])

4.2 基于像素统计的判定方法

def detect_stone_color(img, center, radius): mask = np.zeros(img.shape[:2], dtype="uint8") cv2.circle(mask, center, radius, 255, -1) mean = cv2.mean(img, mask=mask)[:3] return "white" if mean[2] > 150 else "black"

5. 胜负判定算法实现

5.1 四方向检测法

核心算法实现:

def check_win(board, row, col): directions = [(0,1), (1,0), (1,1), (1,-1)] for dr, dc in directions: count = 1 for i in range(1,5): r, c = row + i*dr, col + i*dc if 0 <= r < 19 and 0 <= c < 19 and board[r][c] == board[row][col]: count += 1 else: break if count >= 5: return True return False

5.2 性能优化技巧

  • 只检查最新落子周围9x9区域
  • 使用位运算加速棋盘状态存储
  • 实现早期终止条件

6. 完整系统集成与调试

将各模块整合后的主流程:

def analyze_gobang(image_path): # 1. 图像预处理 img = preprocess_image(image_path) # 2. 棋盘定位 warped = locate_board(img) # 3. 棋子检测 circles = detect_circles(warped) # 4. 颜色识别 board = recognize_colors(warped, circles) # 5. 胜负判定 result = check_victory(board) return { 'board_state': board, 'result': result, 'visualization': draw_results(img, circles, result) }

调试建议:

  1. 分阶段验证每个模块
  2. 保存中间结果图像
  3. 使用不同光照条件下的测试图片

7. 进阶优化方向

7.1 光照鲁棒性提升

  • 自动白平衡算法
  • 自适应阈值处理
  • 阴影消除技术

7.2 用户体验增强

# 添加可视化交互 cv2.putText(result_img, f"{winner} wins!", (50,50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2)

7.3 性能对比测试

不同方法的检测准确率对比:

方法准确率速度(fps)适用场景
传统图像处理85%15标准棋盘
深度学习98%8复杂背景
混合方法93%12通用场景

在实际项目中,根据棋盘质量、光照条件和实时性要求选择合适方案。传统方法实现简单适合初学者,而深度学习方案更适合产品化应用。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询