【学科实践实验六】围棋棋盘棋子实时识别与定位的思路、可能出现的问题以及解决方案

实验要求

  • 学习掌握利用opencv实现基础的图像采集及处理
  • 围棋棋盘棋子实时识别与定位
  • 主要任务:定位棋子位置及识别棋子颜色
  • 给出某行列是何颜色棋子
    • 扩展:当出现五子联排时,给出提示信息

关于OpenCV的安装

有朋友跟我说ta的OpenCV安装总是不成功。可能会出现的原因如下:

  1. numpy版本落后
    更新numpy版本后再尝试安装
pip install numpy --upgrade   
  1. 下载OpenCV时用的官方源
    使用官方源会导致下载及其缓慢,可能是几kb/s
    解决方法:更换成镜像源,此处以阿里源为例
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

在命令行中执行完这一条指令后再重新执行pip intsall opencv-python安装

关于opencv读写中文路径报错

如果使用opencv的库函数读取图片,中文路径会导致无法正确读取,以下为解决方案

其中File_path为图片所在文件夹路径,imgeName为文件名(eg. chessboard.png)

def cv_imread(file_path):
    cv_img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), cv2.IMREAD_COLOR)
    return cv_img
srcMat = cv_imread(File_path+imgeName)

第一个参数为图片类型,可换为’.jpg’,需要根据自己的图片类型进行替换。stcMat为图像数组。其中File_path为图片所在文件夹路径,imgeName为文件名(eg. chessboard.png)

cv2.imencode('.png', srcMat)[1].tofile(File_path+imgeName) 

关于VNC连接不成功的问题

树莓派默认关闭了VNC选项,需要手动将其开启。我是通过显示器和树莓派连接来做的图形化操作,命令行的操作可以去搜索一下。。。
在这里插入图片描述
开启后重新连接VNC就会出现如下页面。
请添加图片描述

关于棋盘的种类

广义上分为两种棋盘,一种是棋子落在交叉线上的(以下称为交叉棋盘),一种是棋子落在格子中间的(以下称为中心棋盘)。我会提供关于两类棋盘适用的库函数以及参数。

交叉棋盘

使用的函数如下。参数为本人使用的参数,可以进行替换

  • cv2.cvtColor(srcMat, cv2.COLOR_BGR2GRAY)
    灰度化
  • cv2.equalizeHist(grayMat)
    增加对比度
  • cv2.GaussianBlur(grayMat, (19, 19), 0)
    高斯模糊减少噪点
  • cv2.Canny(blurred, 70, 150)
    边缘检测
  • cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, dp=1, minDist=20, param1=70, param2=10, minRadius=10, maxRadius=20)
    检测圆形棋子的位置

注意的点:

  • 对于给出的例子来说,为彩色棋盘,需要先进行灰度化
  • 白色棋子容易与背景糊到一起,因此灰度化后应该将加大图片对比度,将白色棋子与背景拉开差距。
  • 高斯内核数量越小,保留的细节越多。

最终结果参考图:
请添加图片描述

中心棋盘

方法一

使用的函数如下。参数为本人使用的参数,可以进行替换

  • cv2.cvtColor(srcMat, cv2.COLOR_BGR2GRAY)
    灰度化
  • cv2.equalizeHist(grayMat)
    增加对比度
  • cv2.GaussianBlur(grayMat, (11, 11), 0)
    高斯模糊减少噪点
  • cv2.Canny(blurred, 30, 150)
    边缘检测
  • cv2.findChessboardCorners(参数用默认的即可)
    检测角点

注意的点:

  • 对于给出的例子来说,为黑白棋盘,做不做灰度化无所谓。
  • 白色棋子容易与背景糊到一起,因此灰度化后应该将加大图片对比度,将白色棋子与背景拉开差距。(可以不做灰度化,但是仍需拉对比度)
  • 高斯内核数量越小,保留的细节越多。
  • 检测角点和棋子时需要给出每行/每列的角点数。注意仅数内圈的点,最外圈的点不计入
    • 本例中
    chessboardColCornerCount = 7
    chessboardRowCornerCount = 12
    

最终结果参考图:
请添加图片描述
感觉这种最麻烦,但是最酷欸!!

方法二

也可以使用cv2.HoughCircles来做,不多赘述。
最终结果参考图如下:
请添加图片描述

  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快苏排序OAO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值