实验要求
- 学习掌握利用opencv实现基础的图像采集及处理
- 围棋棋盘棋子实时识别与定位
- 主要任务:定位棋子位置及识别棋子颜色
- 给出某行列是何颜色棋子
- 扩展:当出现五子联排时,给出提示信息
关于OpenCV的安装
有朋友跟我说ta的OpenCV安装总是不成功。可能会出现的原因如下:
- numpy版本落后
更新numpy版本后再尝试安装
pip install numpy --upgrade
- 下载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来做,不多赘述。
最终结果参考图如下: