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 相关文章推荐
使用PDB模式调试Python程序介绍
Apr 05 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
Python 多核并行计算的示例代码
Nov 07 Python
Python中实现最小二乘法思路及实现代码
Jan 04 Python
python定向爬取淘宝商品价格
Feb 27 Python
Python Json模块中dumps、loads、dump、load函数介绍
May 15 Python
Django中的forms组件实例详解
Nov 08 Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
Jun 13 Python
Python matplotlib可视化实例解析
Jun 01 Python
Python如何使用input函数获取输入
Aug 06 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
Sep 16 Python
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
Jun 09 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
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
Draggable Elements 元素拖拽功能实现代码
2011/03/30 Javascript
遍历jquery对象的代码分享
2011/11/02 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
Document.location.href和.replace的区别示例介绍
2014/03/04 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
基于javascript实现tab切换特效
2016/03/29 Javascript
Javascript中常用的检测方法小结
2016/10/08 Javascript
深入理解ES7的async/await的用法
2017/09/09 Javascript
vue 监听某个div垂直滚动条下拉到底部的方法
2018/09/15 Javascript
浅谈vue后台管理系统权限控制思考与实践
2018/12/19 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
利用python获取Ping结果示例代码
2017/07/06 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
django 单表操作实例详解
2019/07/30 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
使用TensorFlow搭建一个全连接神经网络教程
2020/02/06 Python
Python操作MongoDb数据库流程详解
2020/03/05 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
如何用css3实现switch组件开关的方法
2018/02/09 HTML / CSS
Agoda.com官方网站:便宜预订全球酒店,高达80%的折扣
2018/04/04 全球购物
Eton丹麦官网:精美的男式衬衫
2020/05/27 全球购物
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
工程建设实施方案
2014/03/14 职场文书
2014年乡镇党建工作总结
2014/11/11 职场文书
区域销售大会开幕词
2016/03/04 职场文书
党员学习型组织心得体会
2019/06/21 职场文书
修改MySQL的默认密码的四种小方法
2021/05/26 MySQL
Java生成读取条形码和二维码的简单示例
2021/07/09 Java/Android