如何识别棋盘图像中的空白方格?OpenCV图像识别相关技术问题咨询
国际象棋棋盘空白方格识别方案
现有代码优化
你当前硬编码Canny阈值的方式适配性较差,建议启用已计算的自适应阈值,同时调整高斯模糊参数避免丢失棋子边缘信息,优化后代码参考:
import cv2 import numpy as np img = cv2.imread("chessboard_input.png", 0) sigma = 0.33 v = np.median(img) # 调整高斯模糊核为5*5,减少棋子边缘的模糊损失 img_blur = cv2.GaussianBlur(img, (5, 5), 1) lower = int(max(0, (1.0 - sigma) * v)) upper = int(min(255, (1.0 + sigma) * v)) img_edge = cv2.Canny(img_blur, lower, upper)
原始输入棋盘:
当前边缘检测输出:
空白方格判断实现思路
无需完全依赖边缘检测结果做判断,按以下步骤处理稳定性更高:
- 先完成方格ROI切分:通过霍夫直线检测筛选出棋盘的9条水平格线和9条垂直格线,计算得到所有格线的坐标后,按坐标裁剪得到64个仅包含单个方格的独立ROI,排除其他区域的干扰。
- 再基于ROI特征判断是否为空,推荐两种低复杂度高准确率的方案:
- 灰度方差判断:空白方格的像素值分布均匀,灰度方差远低于存在棋子的方格。对每个裁剪后的方格灰度图计算方差,设定对应阈值,方差低于阈值判定为空白,高于阈值判定为有棋子。该方案计算速度快,适配性强。
- 直方图匹配判断:提前采集空白黑格、空白白格的灰度直方图作为基准模板,每个待判断方格的直方图和对应颜色的空白模板计算巴氏距离,距离低于阈值则为空白,否则存在棋子。
参考代码片段
# 灰度方差判断空白方格示例,阈值可根据实际测试调整 def is_empty(roi, threshold=150): return np.var(roi) < threshold
内容的提问来源于stack exchange,提问作者yoavarviv11
相关产品推荐
相关产品推荐

