python识别围棋定位棋盘位置


Posted in Python onJuly 26, 2021

最近需要做一个围棋识别的项目,首先要将棋盘位置定位出来,效果图如下:

效果图

原图

python识别围棋定位棋盘位置

中间处理效果

python识别围棋定位棋盘位置

最终结果

python识别围棋定位棋盘位置

思路分析

我们利用python opencv的相关函数进行操作实现,根据棋盘颜色的特征,寻找到相关特征,将棋盘区域抠出来。最好从原始图像中将棋盘位置截取出来。

源码:定位棋盘位置

from PIL import ImageGrab
import numpy as np
import cv2
from glob import glob

imglist = sorted(glob("screen/*.jpg"))
for i in imglist:
# while 1:
    img = cv2.imread(i)
    image = img.copy()
    w,h,c = img.shape
    img2 =  np.zeros((w,h,c), np.uint8)
    img3 =  np.zeros((w,h,c), np.uint8)
    # img = ImageGrab.grab() #bbox specifies specific region (bbox= x,y,width,height *starts top-left)
    

    hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    lower = np.array([10,0,0])
    upper = np.array([40,255,255])
    mask = cv2.inRange(hsv,lower,upper)
    erodeim = cv2.erode(mask,None,iterations=2)  # 腐蚀 
    dilateim = cv2.dilate(erodeim,None,iterations=2) 

    img = cv2.bitwise_and(img,img,mask=dilateim)
    frame = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, dst = cv2.threshold(frame, 100, 255, cv2.THRESH_BINARY)
    contours,hierarchy = cv2.findContours(dst, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)


    cv2.imshow("0",img)
    i = 0
    maxarea = 0
    nextarea = 0
    maxint = 0
    for c in contours:
        if cv2.contourArea(c)>maxarea:
            maxarea = cv2.contourArea(c)
            maxint = i
        i+=1

    #多边形拟合
    epsilon = 0.02*cv2.arcLength(contours[maxint],True)
    if epsilon<1:
        continue
    
    #多边形拟合
    approx = cv2.approxPolyDP(contours[maxint],epsilon,True)
    [[x1,y1]] = approx[0]
    [[x2,y2]] = approx[2]

    checkerboard = image[y1:y2,x1:x2]
    cv2.imshow("1",checkerboard)
    cv2.waitKey(1000)

cv2.destroyAllWindows()

带保存图像

from PIL import ImageGrab
import numpy as np
import cv2
from glob import glob
import os

imglist = sorted(glob("screen/*.jpg"))
a=0
for i in imglist:
# while 1:
    a=a+1
    img = cv2.imread(i)
    image = img.copy()
    w,h,c = img.shape
    img2 =  np.zeros((w,h,c), np.uint8)
    img3 =  np.zeros((w,h,c), np.uint8)
    # img = ImageGrab.grab() #bbox specifies specific region (bbox= x,y,width,height *starts top-left)
    

    hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    lower = np.array([10,0,0])
    upper = np.array([40,255,255])
    mask = cv2.inRange(hsv,lower,upper)
    erodeim = cv2.erode(mask,None,iterations=2)  # 腐蚀 
    dilateim = cv2.dilate(erodeim,None,iterations=2) 

    img = cv2.bitwise_and(img,img,mask=dilateim)
    frame = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, dst = cv2.threshold(frame, 100, 255, cv2.THRESH_BINARY)
    contours,hierarchy = cv2.findContours(dst, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

    # 保存图片的地址
    img_file_1 = "./temp"
    # 确认上述地址是否存在
    if not os.path.exists(img_file_1):
        os.mkdir(img_file_1)

    cv2.imshow("0",img)
    cv2.imwrite(img_file_1 + "/" + 'temp_%d.jpg'%a, img)
    i = 0
    maxarea = 0
    nextarea = 0
    maxint = 0
    for c in contours:
        if cv2.contourArea(c)>maxarea:
            maxarea = cv2.contourArea(c)
            maxint = i
        i+=1

    #多边形拟合
    epsilon = 0.02*cv2.arcLength(contours[maxint],True)
    if epsilon<1:
        continue
    
    #多边形拟合
    approx = cv2.approxPolyDP(contours[maxint],epsilon,True)
    [[x1,y1]] = approx[0]
    [[x2,y2]] = approx[2]

    checkerboard = image[y1:y2,x1:x2]
    cv2.imshow("1",checkerboard)
    cv2.waitKey(1000)
    # 保存图片的地址
    img_file_2 = "./checkerboard"
    # 确认上述地址是否存在
    if not os.path.exists(img_file_2):
        os.mkdir(img_file_2)
    cv2.imwrite(img_file_2 + "/" + 'checkerboard_%d.jpg'%a, checkerboard)
cv2.destroyAllWindows()

到此这篇关于python识别围棋定位棋盘位置的文章就介绍到这了,更多相关python 围棋定位棋盘位置内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python列表推导式的使用方法
Nov 21 Python
Python中使用语句导入模块或包的机制研究
Mar 30 Python
Python 提取dict转换为xml/json/table并输出的实现代码
Aug 28 Python
利用numpy实现一、二维数组的拼接简单代码示例
Dec 15 Python
python 对类的成员函数开启线程的方法
Jan 22 Python
python 绘制拟合曲线并加指定点标识的实现
Jul 10 Python
django框架F&amp;Q 聚合与分组操作示例
Dec 12 Python
Python语言异常处理测试过程解析
Jan 08 Python
Python3 实现爬取网站下所有URL方式
Jan 16 Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 Python
Python 获取异常(Exception)信息的几种方法
Dec 29 Python
python scipy 稀疏矩阵的使用说明
May 26 Python
python之基数排序的实现
Jul 26 #Python
python之PySide2安装使用及QT Designer UI设计案例教程
python代码实现备忘录案例讲解
Jul 26 #Python
python之django路由和视图案例教程
Jul 26 #Python
OpenCV图像变换之傅里叶变换的一些应用
Python类方法总结讲解
pandas数值排序的实现实例
Jul 25 #Python
You might like
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
php调用Google translate_tts api实现代码
2013/08/07 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
php中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
php中通用的excel导出方法实例
2017/12/30 PHP
js输出列表实现代码
2010/09/12 Javascript
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
jQuery实现冻结表格行和列
2015/04/29 Javascript
JS实用的动画弹出层效果实例
2015/05/05 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
chrome调试javascript详解
2015/10/21 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
2016/05/16 Javascript
Bootstrap 中data-[*] 属性的整理
2018/03/13 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
前端Electron新手入门教程详解
2019/06/21 Javascript
vue 实现input表单元素的disabled示例
2019/10/28 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
解决vue scoped scss 无效的问题
2020/09/04 Javascript
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
编写Python脚本来获取Google搜索结果的示例
2015/05/04 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
在Python中实现替换字符串中的子串的示例
2018/10/31 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
CSS3制作圆角图片和椭圆形图片
2016/07/08 HTML / CSS
HTML5 Canvas中绘制椭圆的4种方法
2015/04/24 HTML / CSS
工作表现自我评价
2014/02/08 职场文书
仓库规划计划书
2014/04/28 职场文书
2014年幼儿园重阳节活动方案
2014/09/16 职场文书
2014年基层党支部工作总结
2014/12/04 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
领导干部学习心得体会
2016/01/23 职场文书
入门学习Go的基本语法
2021/07/07 Golang