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 django 增删改查操作 数据库Mysql
Jul 27 Python
python将文本中的空格替换为换行的方法
Mar 19 Python
OpenCV搞定腾讯滑块验证码的实现代码
May 18 Python
Python 抓取微信公众号账号信息的方法
Jun 14 Python
python3 enum模块的应用实例详解
Aug 12 Python
PyCharm2018 安装及破解方法实现步骤
Sep 09 Python
python深copy和浅copy区别对比解析
Dec 26 Python
Python smtp邮件发送模块用法教程
Jun 15 Python
python调用有道智云API实现文件批量翻译
Oct 10 Python
next在python中返回迭代器的实例方法
Dec 15 Python
利用Python脚本写端口扫描器socket,python-nmap
Jul 23 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经典的给图片加水印程序
2006/12/06 PHP
PHP5 面向对象程序设计
2008/02/13 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
Laravel使用消息队列需要注意的一些问题
2017/12/13 PHP
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
javascript浏览器窗口之间传递数据的方法
2015/01/20 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
两种简单的跨域方法(jsonp、php)
2017/01/02 Javascript
Ionic 2 实现列表滑动删除按钮的方法
2017/01/22 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
2017/04/16 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
JavaScript实现仿Clock ISO时钟
2018/06/29 Javascript
JavaScript实现Excel表格效果
2020/02/07 Javascript
[04:12]第二届DOTA2亚洲邀请赛选手传记-Newbee.Sccc
2017/04/03 DOTA
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python 链接和操作 memcache方法
2017/03/04 Python
python对excel文档去重及求和的实例
2018/04/18 Python
python模块smtplib学习
2018/05/22 Python
python实现数据分析与建模
2019/07/11 Python
django form和field具体方法和属性说明
2020/07/09 Python
python集合能干吗
2020/07/19 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
葡萄牙语专业个人求职信
2013/12/10 职场文书
酒吧创业计划书
2014/01/18 职场文书
雷锋精神演讲稿
2014/05/13 职场文书
教师个人读书活动总结
2014/07/08 职场文书
扶贫办主任查摆“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书
维稳承诺书
2015/01/20 职场文书
python迷宫问题深度优先遍历实例
2021/06/20 Python
python如何查找列表中元素的位置
2022/05/30 Python