python微信跳一跳系列之自动计算跳一跳距离


Posted in Python onFebruary 26, 2018

到现在为止,我们通过前面几篇博文的描述和分析,已经可以自动实现棋子、棋盘位置的准确判断,计算一下两个中心点之间的距离,并绘制在图形上,效果如下。

效果

python微信跳一跳系列之自动计算跳一跳距离

图中的棋子定位采用HSV颜色识别,棋盘定位采用轮廓分割的方法获得,感兴趣的同学可以对其它的定位方法自行验证。

代码

# -*- coding: utf-8 -*-
#VS2017+python3.6+opencv3.4
#2018.02.03
#作者:艾克思

import cv2 
import numpy as np
import math

def hsv(frame):
 lower_blue = np.array([115,75,75]) #设定蓝色的阈值
 upper_blue = np.array([130,255,125])
 r=0 #初始半径=0
 x,y=0,0
 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) #转到HSV空间
 mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)
 cnts = cv2.findContours(mask_blue, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2] 
 if len(cnts) > 0: 
 c = max(cnts, key = cv2.contourArea) #找到面积最大的轮廓
 ((x, y), radius) = cv2.minEnclosingCircle(c) #确定面积最大的轮廓的外接圆 
 center=(int(x),int(y))
 return center

def thresh(img):
 x,y,w,h,x1,y1,w1,h1,x2,y2,w2,h2=0,0,0,0,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,1]
 bottom= gray[h0*2//3,1]
 #min_vale=min(top,bottom)
 #max_vale=max(top,bottom)

 thresh1 = cv2.threshold(gray,top,255, cv2.THRESH_BINARY)[1]
 thresh2 = cv2.threshold(gray,175,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),(0,0,255),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,255),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 length(pt1,pt2):
 x1,y1=pt1
 x2,y2=pt2
 length=math.sqrt((x2-x1)**2+(y2-y1)**2)
 return int(length)

def main():
 filepath='e:/python/jump/hsv/007.png'
 video='e:/python/jump/blackwhite/jumpnew.avi'
 cap = cv2.VideoCapture(video) 
 ret=cap.isOpened()
 ret=True
 while ret:
 #ret,img=cap.read() #读入帧
 img=cv2.imread(filepath)
 if not ret:cv2.waitKey(0)
 point1=hsv(img)
 point2=thresh(img)
 len=length(point1,point2)
 cv2.circle(img,point1,3,(0,0,255),-1)
 cv2.circle(img,point1,15,(0,0,255),2)
 cv2.circle(img,point2,3,(0,0,255),-1)
 cv2.circle(img,point2,15,(0,0,255),2)
 cv2.line(img,point1,point2,(255,255,255),2)
 cv2.putText(img, '{}'.format(len) ,(point2[0]-10,point2[1]-20), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2,cv2.LINE_8, 0)
 cv2.imshow('img',img)
 #cv2.imwrite(filepath,img)
 cv2.waitKey(0)
 cap.release()
 cv2.destroyAllWindows()

if __name__=='__main__':
 main()

更多内容大家可以参考专题《微信跳一跳》进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
从零学python系列之数据处理编程实例(一)
May 22 Python
一则python3的简单爬虫代码
May 26 Python
Python如何实现文本转语音
Aug 08 Python
Python调用C# Com dll组件实战教程
Oct 12 Python
Python使用matplotlib实现绘制自定义图形功能示例
Jan 18 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
May 10 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
May 31 Python
pyqt5 实现多窗口跳转的方法
Jun 19 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Jul 04 Python
python元组和字典的内建函数实例详解
Oct 22 Python
在Python中实现函数重载的示例代码
Dec 12 Python
Python中requests做接口测试的方法
May 30 Python
python微信跳一跳系列之色块轮廓定位棋盘
Feb 26 #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
You might like
php中simplexml_load_string使用实例分享
2014/02/13 PHP
PHP的运行机制与原理(底层)
2015/11/16 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
20分钟轻松创建自己的Bootstrap站点
2016/05/12 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
jQuery实现的自动加载页面功能示例
2016/09/04 Javascript
Web前端开发之水印、图片验证码
2016/11/27 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
2016/11/28 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
Vue创建头部组件示例代码详解
2018/10/23 Javascript
NProgress显示顶部进度条效果及使用详解
2019/09/21 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
vue.js实现左边导航切换右边内容
2019/10/21 Javascript
用Python制作在地图上模拟瘟疫扩散的Gif图
2015/03/31 Python
Python的Django框架中自定义模版标签的示例
2015/07/20 Python
Python简单实现子网掩码转换的方法
2016/04/13 Python
对numpy和pandas中数组的合并和拆分详解
2018/04/11 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
使用Python横向合并excel文件的实例
2018/12/11 Python
python使用opencv实现马赛克效果示例
2019/09/28 Python
Python实现EM算法实例代码
2020/10/04 Python
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
门卫岗位安全职责
2013/12/13 职场文书
二年级小学生评语
2014/04/21 职场文书
竞选班长的演讲稿
2014/04/24 职场文书
幼儿园教研活动总结
2014/04/30 职场文书
2015毕业寄语大全
2015/02/26 职场文书
护士自荐信范文
2015/03/25 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
集结号观后感
2015/06/08 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis