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多进程编程技术实例分析
Sep 16 Python
python使用smtplib模块通过gmail实现邮件发送的方法
May 08 Python
Python正则表达式完全指南
May 25 Python
详解python实现线程安全的单例模式
Mar 05 Python
python实现守护进程、守护线程、守护非守护并行
May 05 Python
python中使用zip函数出现错误的原因
Sep 28 Python
python射线法判断检测点是否位于区域外接矩形内
Jun 28 Python
使用OpenCV实现仿射变换—缩放功能
Aug 29 Python
Python使用matplotlib绘制三维参数曲线操作示例
Sep 10 Python
Python实现分数序列求和
Feb 25 Python
详解Python中pyautogui库的最全使用方法
Apr 01 Python
python中如何写类
Jun 29 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学习之运算符相关概念
2011/06/09 PHP
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
浅谈PHP值mysql操作类
2016/06/29 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
php输出形式实例整理
2020/05/05 PHP
初学JavaScript第二章
2008/09/30 Javascript
关于firefox的ElementTraversal 接口 使用说明
2010/11/11 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
2014/06/05 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
jQuery插件Validate实现自定义表单验证
2016/01/18 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
详解微信小程序开发之下拉刷新 上拉加载
2016/11/24 Javascript
JS中把函数作为另一函数的参数传递方法(总结)
2017/06/28 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
微信小程序开发注意指南和优化实践(小结)
2019/06/21 Javascript
Vue配置marked链接添加target=&quot;_blank&quot;的方法
2019/07/19 Javascript
vue+node 实现视频在线播放的实例代码
2020/10/19 Javascript
python超简单解决约瑟夫环问题
2015/05/12 Python
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
2019/01/08 Python
Python使用matplotlib实现交换式图形显示功能示例
2019/09/06 Python
如何在Django中使用聚合的实现示例
2020/03/23 Python
flask开启多线程的具体方法
2020/08/02 Python
Python命名空间及作用域原理实例解析
2020/08/12 Python
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
曼联官方网上商店:Manchester United Direct
2017/07/28 全球购物
Interrail法国:乘火车探索欧洲,最受欢迎的欧洲铁路通票
2019/08/27 全球购物
高三自我评价
2014/02/01 职场文书
超市活动计划书
2014/04/24 职场文书
学习计划书怎么写
2014/09/15 职场文书
党员个人查摆剖析材料
2014/10/16 职场文书
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS