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 相关文章推荐
numpy判断数值类型、过滤出数值型数据的方法
Jun 09 Python
基于Python List的赋值方法
Jun 23 Python
Python 字符串换行的多种方式
Sep 06 Python
Laravel+Dingo/Api 自定义响应的实现
Feb 17 Python
Python时间和字符串转换操作实例分析
Mar 16 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
Jun 04 Python
Python一键安装全部依赖包的方法
Aug 12 Python
python 实现Flask中返回图片流给前端展示
Jan 09 Python
Python自动重新加载模块详解(autoreload module)
Apr 01 Python
Matplotlib 绘制饼图解决文字重叠的方法
Jul 24 Python
Python Tkinter实例——模拟掷骰子
Oct 24 Python
python中openpyxl和xlsxwriter对Excel的操作方法
Mar 01 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 PDO中文乱码解决办法
2009/07/20 PHP
Ha0k 0.3 PHP 网页木马修改版
2009/10/11 PHP
php学习之 数组声明
2011/06/09 PHP
PHP中使用CURL获取页面title例子
2015/01/07 PHP
PHP数学运算与数据处理实例分析
2016/04/01 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
jQuery实现不断闪烁文字的方法
2015/05/15 Javascript
浅谈JS继承_寄生式继承 &amp; 寄生组合式继承
2016/08/16 Javascript
phantomjs导出html到pdf的方法总结
2017/10/19 Javascript
微信小程序实现列表下拉刷新上拉加载
2020/07/29 Javascript
详解node Async/Await 更好的异步编程解决方案
2018/05/10 Javascript
使用angular-cli webpack创建多个包的方法
2018/10/16 Javascript
微信小程序云开发实现数据添加、查询和分页
2019/05/17 Javascript
详解小程序云开发攻略(解决最棘手的问题)
2019/09/30 Javascript
原生JS实现留言板功能
2020/02/08 Javascript
vue 扩展现有组件的操作
2020/08/14 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
python3使用tkinter实现ui界面简单实例
2014/01/10 Python
python2.7使用plotly绘制本地散点图和折线图
2019/04/02 Python
python实现学生成绩测评系统
2020/06/22 Python
Python数据可视化常用4大绘图库原理详解
2020/10/23 Python
python中time包实例详解
2021/02/02 Python
CSS3按钮鼠标悬浮实现光圈效果源码
2016/09/11 HTML / CSS
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
大学生个人推荐信范文
2013/11/25 职场文书
广告创意求职信
2014/03/17 职场文书
学雷锋标语
2014/06/25 职场文书
音乐教育专业自荐信
2014/09/18 职场文书
网络工程专业大学生求职信
2014/10/01 职场文书
食品药品安全责任书
2015/05/11 职场文书
80行代码写一个Webpack插件并发布到npm
2021/05/24 Javascript
解决pycharm下载库时出现Failed to install package的问题
2021/09/04 Python
nginx之queue的具体使用
2022/06/28 Servers