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基础教程之类class定义使用方法
Feb 20 Python
Python实现的寻找前5个默尼森数算法示例
Mar 25 Python
浅谈python下含中文字符串正则表达式的编码问题
Dec 07 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
Python实用工具FuckIt.py介绍
Jul 02 Python
django的ORM操作 增加和查询
Jul 26 Python
详解python中自定义超时异常的几种方法
Jul 29 Python
浅谈pytorch、cuda、python的版本对齐问题
Jan 15 Python
TensorFlow学习之分布式的TensorFlow运行环境
Feb 05 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
Feb 27 Python
Django模板标签中url使用详解(url跳转到指定页面)
Mar 19 Python
python 实现图片裁剪小工具
Feb 02 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
基于PHP与XML的PDF文档生成技术
2006/10/09 PHP
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
js parsefloat parseint 转换函数
2010/01/21 Javascript
JavaScript中去掉数组中的重复值的实现方法
2011/08/03 Javascript
js验证输入是否为手机号码或电话号码示例
2013/12/30 Javascript
图片翻转效果具体实现代码
2014/01/09 Javascript
Jquery遍历节点的方法小集
2014/01/22 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
2016/06/20 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
2016/06/28 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
基于构造函数的五种继承方法小结
2017/07/27 Javascript
浅谈js中的this问题
2017/08/31 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
2017/11/09 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
2018/02/11 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
JavaScript图片旋转效果实现方法详解
2020/06/28 Javascript
mac系统安装Python3初体验
2018/01/02 Python
Python matplotlib绘图可视化知识点整理(小结)
2018/03/16 Python
python射线法判断一个点在图形区域内外
2019/06/28 Python
高中军训感言1000字
2014/03/01 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
学习计划书怎么写
2014/09/15 职场文书
2014乡镇干部对照检查材料思想汇报
2014/09/26 职场文书
党员廉洁自律个人总结
2015/02/13 职场文书
英文诗歌翻译方法(赏析)
2019/08/16 职场文书
2019年特色火锅店的创业计划书模板
2019/08/28 职场文书
MySQL sql_mode的使用详解
2021/05/08 MySQL
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL
详解Golang如何优雅的终止一个服务
2022/03/21 Golang