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 24 Python
老生常谈python函数参数的区别(必看篇)
May 29 Python
书单|人生苦短,你还不用python!
Dec 29 Python
python3 对list中每个元素进行处理的方法
Jun 29 Python
python3.x 将byte转成字符串的方法
Jul 17 Python
Python List cmp()知识点总结
Feb 18 Python
了解不常见但是实用的Python技巧
May 23 Python
使用python实现unix2dos和dos2unix命令的例子
Aug 13 Python
Python抓包并解析json爬虫的完整实例代码
Nov 03 Python
python与idea的集成的实现
Nov 20 Python
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
Apr 14 Python
基于python的matplotlib制作双Y轴图
Apr 20 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面向对象分析设计的经验原则
2008/09/20 PHP
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
php中的路径问题与set_include_path使用介绍
2014/02/11 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
给jQuery方法添加回调函数一款插件的应用
2013/01/21 Javascript
JavaScript中双叹号!!作用示例介绍
2014/09/21 Javascript
jQuery代码实现发展历程时间轴特效
2015/07/30 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
基于JQuery的Ajax方法使用详解
2017/08/16 jQuery
javascript基础进阶_深入剖析执行环境及作用域链
2017/09/05 Javascript
常用的9个JavaScript图表库详解
2017/12/19 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
element上传组件循环引用及简单时间倒计时的实现
2018/10/01 Javascript
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
JavaScript如何借用构造函数继承
2019/11/06 Javascript
在Python中封装GObject模块进行图形化程序编程的教程
2015/04/14 Python
Python运行异常管理解决方案
2020/03/09 Python
CentOS 7如何实现定时执行python脚本
2020/06/24 Python
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
如何选择使用结构还是类
2014/05/30 面试题
Java程序员综合测试题
2014/04/25 面试题
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
公益活动策划方案
2014/01/09 职场文书
会议主持词
2014/03/17 职场文书
新春文艺演出主持词
2014/03/27 职场文书
幼儿园标语大全
2014/06/19 职场文书
班级光棍节联谊会策划书
2014/10/10 职场文书
先进基层党组织事迹材料2016
2016/02/29 职场文书
导游词之杭州西湖
2019/09/19 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers
python数字类型和占位符详情
2022/03/13 Python
python APScheduler执行定时任务介绍
2022/04/19 Python