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实现数通设备端口监控示例
Apr 02 Python
跟老齐学Python之大话题小函数(1)
Oct 10 Python
Python多线程编程(一):threading模块综述
Apr 05 Python
Python的re模块正则表达式操作
May 25 Python
python实现百万答题自动百度搜索答案
Jan 16 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
May 31 Python
Python随机生成身份证号码及校验功能
Dec 04 Python
python中return的返回和执行实例
Dec 24 Python
python opencv进行图像拼接
Mar 27 Python
Python中使用socks5设置全局代理的方法示例
Apr 15 Python
Python中使用filter过滤列表的一个小技巧分享
May 02 Python
对python中list的五种查找方法说明
Jul 13 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
2020显卡排行榜天梯图 显卡天梯图2020年3月最新版
2020/04/02 数码科技
提升PHP执行速度全攻略(下)
2006/10/09 PHP
模仿OSO的论坛(五)
2006/10/09 PHP
php 使用array函数实现分页
2015/02/13 PHP
关于document.cookie的使用javascript
2008/04/11 Javascript
javascript window对象属性整理
2009/10/24 Javascript
JavaScript关于select的相关操作说明
2010/01/13 Javascript
理解JSON:3分钟课程
2011/10/28 Javascript
探讨javascript是不是面向对象的语言
2013/11/21 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
angularJS 中input示例分享
2015/02/09 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
详解js界面跳转与值传递
2016/11/22 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
2017/12/29 Javascript
vue-cli axios请求方式及跨域处理问题
2018/03/28 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
解决angularjs中同步执行http请求的方法
2018/08/13 Javascript
vue源码nextTick使用及原理解析
2019/08/13 Javascript
pyttsx3实现中文文字转语音的方法
2018/12/24 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
Python虚拟环境的原理及使用详解
2019/07/02 Python
Django中的cookie和session
2019/08/27 Python
django-crontab 定时执行任务方法的实现
2019/09/06 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
解决Python在导入文件时的FileNotFoundError问题
2020/04/10 Python
美国知名珠宝首饰品牌:Gemvara
2017/10/06 全球购物
会计学个人自荐信模板
2013/12/13 职场文书
会展策划与管理专业大学生职业生涯规划
2014/02/07 职场文书
《晏子使楚》教学反思
2014/02/08 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
css背景和边框标签实例详解
2021/05/21 HTML / CSS
python实现剪贴板的操作
2021/07/01 Python
Python图像处理库PIL详细使用说明
2022/04/06 Python