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实现删除列表中满足一定条件的元素示例
Jun 12 Python
Windows下python3.7安装教程
Jul 31 Python
浅谈Pycharm中的Python Console与Terminal
Jan 17 Python
基于Python的Post请求数据爬取的方法详解
Jun 14 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
python 三元运算符使用解析
Sep 16 Python
Win10里python3创建虚拟环境的步骤
Jan 31 Python
scrapy结合selenium解析动态页面的实现
Sep 28 Python
Pandas替换及部分替换(replace)实现流程详解
Oct 12 Python
pytorch 使用半精度模型部署的操作
May 24 Python
python opencv检测直线 cv2.HoughLinesP的实现
Jun 18 Python
python异步的ASGI与Fast Api实现
Jul 16 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
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
第八节--访问方式
2006/11/16 PHP
轻松修复Discuz!数据库
2008/05/03 PHP
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
JavaScript实现一个简易的计算器实例代码
2018/05/10 Javascript
小程序开发基础之view视图容器
2018/08/21 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
python比较两个列表是否相等的方法
2015/07/28 Python
Pandas探索之高性能函数eval和query解析
2017/10/28 Python
Atom的python插件和常用插件说明
2018/07/08 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
python实战串口助手_解决8串口多个发送的问题
2019/06/12 Python
python getpass实现密文实例详解
2019/09/24 Python
pyinstaller将含有多个py文件的python程序做成exe
2020/04/29 Python
Django web自定义通用权限控制实现方法
2020/11/24 Python
Html5+CSS3+EL表达式问题小结
2020/12/19 HTML / CSS
彪马美国官网:PUMA美国
2017/03/09 全球购物
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
英国网上电器商店:Electricshop
2020/03/15 全球购物
高二学生评语大全
2014/04/25 职场文书
学校火灾防控方案
2014/06/09 职场文书
施工安全汇报材料
2014/08/17 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
2015年第31个教师节致辞
2015/07/31 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
分析mysql中一条SQL查询语句是如何执行的
2021/06/21 MySQL
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL