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实现遍历数据库并获取key的值
May 17 Python
Linux RedHat下安装Python2.7开发环境
May 20 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
Nov 23 Python
通过Python 接口使用OpenCV的方法
Apr 02 Python
pandas使用get_dummies进行one-hot编码的方法
Jul 10 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
May 27 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
Jan 06 Python
keras的ImageDataGenerator和flow()的用法说明
Jul 03 Python
python使用yaml 管理selenium元素的示例
Dec 01 Python
详解解决jupyter不能使用pytorch的问题
Feb 18 Python
Pytorch 如何实现LSTM时间序列预测
May 17 Python
Python 图片添加美颜效果
Apr 28 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
星际争霸任务指南——虫族
2020/03/04 星际争霸
PHP开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
js导出table数据到excel即导出为EXCEL文档的方法
2013/10/10 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
浅谈JS的基础类型与引用类型
2016/09/13 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
JQuery扩展对象方法操作示例
2018/08/21 jQuery
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
Python模拟登录的多种方法(四种)
2018/06/01 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
python实现递归查找某个路径下所有文件中的中文字符
2019/08/31 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
Python中pass语句的作用是什么
2016/06/01 面试题
影视制作岗位职责
2013/12/04 职场文书
初中生自我鉴定
2014/02/04 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
幼儿园教师个人工作总结2015
2015/05/12 职场文书
反邪教教育心得体会
2016/01/15 职场文书
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript
vue的项目如何打包上线
2022/04/13 Vue.js
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记