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 相关文章推荐
Django的数据模型访问多对多键值的方法
Jul 21 Python
Python实现二分查找与bisect模块详解
Jan 13 Python
python 计算文件的md5值实例
Jan 13 Python
微信跳一跳python自动代码解读1.0
Jan 12 Python
python使用xslt提取网页数据的方法
Feb 23 Python
python奇偶行分开存储实现代码
Mar 19 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
Jul 26 Python
用python实现k近邻算法的示例代码
Sep 06 Python
Python玩转PDF的各种骚操作
May 06 Python
python-django中的APPEND_SLASH实现方法
Jun 21 Python
Django多个app urls配置代码实例
Nov 26 Python
python 制作本地应用搜索工具
Feb 27 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&amp;java(二)
2006/10/09 PHP
php中用数组的方法设置cookies
2011/04/21 PHP
PHP实现导出excel数据的类库用法示例
2016/10/15 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
表单内同名元素的控制
2006/11/22 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
再说AutoComplete自动补全之实现原理
2011/11/05 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
javascript date格式化示例
2013/09/25 Javascript
jquery select 设置默认选中的示例代码
2014/02/07 Javascript
javascript简单实现等比例缩小图片的方法
2016/07/27 Javascript
AngularJs expression详解及简单示例
2016/09/01 Javascript
ES6中class类用法实例浅析
2017/04/06 Javascript
AngularJS自定义指令之复制指令实现方法
2017/05/18 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
JS中Attr的用法详解
2017/10/09 Javascript
详解Angular5路由传值方式及其相关问题
2018/04/28 Javascript
angular2 NgModel模块的具体使用方法
2019/04/10 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
Python实现TCP/IP协议下的端口转发及重定向示例
2016/06/14 Python
使用C++扩展Python的功能详解
2018/01/12 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
python操作mysql代码总结
2018/06/01 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
html5给汉字加拼音加进度条的实现代码
2020/04/07 HTML / CSS
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
CK澳大利亚官网:Calvin Klein澳大利亚
2020/12/12 全球购物
六十岁生日答谢词
2014/01/10 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
重温入党誓词主持词
2015/06/29 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
详解Redis主从复制实践
2021/05/19 Redis