python微信跳一跳系列之色块轮廓定位棋盘


Posted in Python onFebruary 26, 2018

在前几篇博文中,我们分别采用颜色识别,模板匹配,像素遍历等方法实现了棋子和棋盘的定位,具体内容可以参见我的前面的文章内容,在这一篇中,我们来探索一种定位棋盘的新方法。

分析

经过观察,我们看到,无论什么情况下,棋盘和背景之间总是存在着非常明显的色彩对比,这当然是必须的,否则玩游戏的人都无法分辨棋子、棋盘、背景,这个游戏就不可能大火。显然,如果我们将每一幅画面进行色块分割,将彩色图转变为黑白二值图,就可以将背景和棋盘隔离出来,然后对黑白图中的白色轮廓进行分析,将其中位置最高(y值最小)的轮廓标记出来,这个轮廓就是下一步要跳一跳的棋盘。

步骤

  • 抓取图像;
  • 将图像转变为灰度图;
  • 确定工作区域(h//3?2h//3),确定像素阈值;
  • 产生黑白二值图像,同时产生两种黑白图,分别将亮于背景和暗于背景两种情况下的色块隔离出来;

阴影的处理

棋盘往往会有阴影,可以通过进一步缩小目标区域进行色块分割的方法来精准实现定位,感兴趣的同学可以自行练习。

代码

# -*- coding: utf-8 -*-
#VS2017+python3.6+opencv3.4
#2018.02.03
#作者:艾克思

import cv2 

def thresh(img):
 x1,y1,w1,h1,x2,y2,w2,h2=0,0,0,0,0,0,0,0
 gray= cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 #gray=cv2.GaussianBlur(gray,(13,13),0) #高斯模糊
 h0,w0=img.shape[:2]
 top=gray[h0//3,10]
 bottom= gray[h0*2//3,10]

 thresh1 = cv2.threshold(gray,top,255, cv2.THRESH_BINARY)[1] 
 thresh2 = cv2.threshold(gray,bottom,255, cv2.THRESH_BINARY_INV)[1] 
 img1=thresh1[h0//3:h0*2//3,0:w0]
 img2=thresh2[h0//3:h0*2//3,0:w0]

 cnts1, hierarchy1, rr1 = cv2.findContours(img1,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
 cnts2, hierarchy2, rr2 = cv2.findContours(img2,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

 aim1=0
 y_min=h0//3
 for c in hierarchy1:
 if hierarchy1==None:
 x1,y1,w1,h1=w0//2,h0//3,w0//3,h0//3
 break
 else:
 x,y,w,h = cv2.boundingRect(c)
 if y<=y_min:
 y_min=y
 aim1=c
 x1,y1,w1,h1 = cv2.boundingRect(aim1)
 cv2.rectangle(img,(x1,y1+h0//3),(x1+w1,y1+h1+h0//3),(255,0,0),2)

 aim2=0
 y_min=h0//3
 for c in hierarchy2:
 if hierarchy2==None:
 x2,y2,w2,h2=w0//2,h0//3,w0//3,h0//3
 break
 else:
 x,y,w,h = cv2.boundingRect(c)
 if y<=y_min:
 y_min=y
 aim2=c
 x2,y2,w2,h2 = cv2.boundingRect(aim2)
 cv2.rectangle(img,(x2,y2+h0//3),(x2+w2,y2+h2+h0//3),(0,255,0),2)

 if y1+h1//2<=y2+h2//2:
 x,y,w,h=x1,y1,w1,h1
 else: x,y,w,h=x2,y2,w2,h2

 cv2.imshow('img1',thresh1)
 cv2.imshow('img2',thresh2)

 return (x+w//2,y+h0//3+h//2)

def main():
 video='jump.avi'
 cap = cv2.VideoCapture(video) 
 ret=cap.isOpened()
 ret=True
 while ret:
 #ret,img=cap.read() #读入帧
 img=cv2.imread('e:/python/jump/hsv/006.png')
 if not ret:cv2.waitKey(0)
 point=thresh(img)
 cv2.circle(img,point,3,(0,0,255),-1)
 cv2.circle(img,point,15,(0,0,255),2)

 cv2.imshow('img',img)
 if cv2.waitKey(25)==ord('q'): break
 cap.release()
 cv2.destroyAllWindows()

if __name__=='__main__':
 main()

opencv中关于黑白二值分割的参数类型如下:

python微信跳一跳系列之色块轮廓定位棋盘 

在代码编制时,需要将cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV联合使用,以便同时分辨亮色和暗色。

效果

我们放几张棋盘识别的样例,共大家参考。

python微信跳一跳系列之色块轮廓定位棋盘 

这是一张比较典型的样例图,棋盘上半部分为暗色,下半部分为亮色,第一张是亮色部分的分割识别,第二张是暗色部分的分割识别,最后分别绘出各自识别出的色块轮廓,并进行比较。这张样例中,最终识别出的位置在棋盘的中心白点上,效果还是非常好的。

python微信跳一跳系列之色块轮廓定位棋盘 

这也是一张非常典型的样例图,棋盘亮暗部分相互交错,左边图识别出了亮色部分,中间图识别出了暗色部分,最终的比较结果也在棋盘的正中心,效果不错。

python微信跳一跳系列之色块轮廓定位棋盘 

这张样例也将最终的位置锁定在棋盘中心点。

再放一张。

python微信跳一跳系列之色块轮廓定位棋盘 

这也是一张比较典型的情况,最终定位在棋盘的中心白点处,方法可行。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python程序语言快速上手教程
Jul 18 Python
查看django版本的方法分享
May 14 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
Jun 14 Python
深入flask之异步非堵塞实现代码示例
Jul 31 Python
CentOS 7 安装python3.7.1的方法及注意事项
Nov 01 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
Dec 22 Python
这可能是最好玩的python GUI入门实例(推荐)
Jul 19 Python
Django项目之Elasticsearch搜索引擎的实例
Aug 21 Python
python抓取多种类型的页面方法实例
Nov 20 Python
python3的pip路径在哪
Jun 23 Python
python Xpath语法的使用
Nov 26 Python
python自动获取微信公众号最新文章的实现代码
Jul 15 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 #Python
基于Python实现的微信好友数据分析
Feb 26 #Python
TensorFlow 实战之实现卷积神经网络的实例讲解
Feb 26 #Python
使用django-crontab实现定时任务的示例
Feb 26 #Python
Django中的CBV和FBV示例介绍
Feb 25 #Python
python中正则表达式的使用方法
Feb 25 #Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
Feb 24 #Python
You might like
一个PHP操作Access类(PHP+ODBC+Access)
2007/01/02 PHP
php登陆页的密码处理方式分享
2013/10/14 PHP
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
php生成图片验证码-附五种验证码
2015/08/19 PHP
php给图片添加文字水印方法汇总
2015/08/27 PHP
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
2016/07/06 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
2011/09/28 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
JavaScript头像上传插件源码分享
2016/03/29 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
nodejs二进制与Buffer的介绍与使用
2019/07/11 NodeJs
mpvue微信小程序开发之实现一个弹幕评论
2019/11/24 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
2020/02/27 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
python获取文件路径、文件名、后缀名的实例
2018/04/23 Python
python的中异常处理机制
2018/08/30 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
StubHub意大利:购买和出售全球演唱会和体育赛事门票
2017/11/21 全球购物
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
购买原创艺术品:Zatista
2019/11/09 全球购物
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
进修护士自我鉴定
2013/10/14 职场文书
售后服务承诺书
2014/03/26 职场文书
2015年体育部工作总结
2015/04/02 职场文书
学习经验交流会总结
2015/11/02 职场文书
Django REST framework 限流功能的使用
2021/06/24 Python