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 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
利用python GDAL库读写geotiff格式的遥感影像方法
Nov 29 Python
python使用response.read()接收json数据的实例
Dec 19 Python
python中嵌套函数的实操步骤
Feb 27 Python
Python 可变类型和不可变类型及引用过程解析
Sep 27 Python
如何使用Python破解ZIP或RAR压缩文件密码
Jan 09 Python
matplotlib quiver箭图绘制案例
Apr 17 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
May 13 Python
Python利用命名空间解析XML文档
Aug 10 Python
python使用列表的最佳方案
Aug 12 Python
Python存储读取HDF5文件代码解析
Nov 25 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
Feb 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
asp函数split()对应php函数explode()
2019/02/27 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
扩展Jquery插件处理mouseover时内部有子元素时发生样式闪烁
2011/12/08 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
Node.js巧妙实现Web应用代码热更新
2015/10/22 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
浅谈JavaScript中变量和函数声明的提升
2016/08/09 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
Moment.js实现多个同时倒计时
2019/08/26 Javascript
解决Idea、WebStorm下使用Vue cli脚手架项目无法使用Webpack别名的问题
2019/10/11 Javascript
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
[56:42]完美世界DOTA2联赛循环赛 Matador vs Forest 第二场 11.06
2020/11/06 DOTA
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
Python搭建FTP服务器的方法示例
2018/01/19 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
2018/05/04 Python
Python提取特定时间段内数据的方法实例
2019/04/01 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
2019/12/13 Python
使用python实现多维数据降维操作
2020/02/24 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
Python对excel的基本操作方法
2021/02/18 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
Schutz鞋官方网站:Schutz Shoes
2017/12/13 全球购物
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
生产部厂长职位说明书
2014/03/03 职场文书
商学院大学生求职的自我评价
2014/03/12 职场文书
《三亚落日》教学反思
2014/04/26 职场文书
老公给老婆的保证书
2014/04/28 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
2014年教学工作总结
2014/11/13 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
《从现在开始》教学反思
2016/02/16 职场文书