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 元类使用说明
Dec 18 Python
Python进阶篇之字典操作总结
Nov 16 Python
django2 快速安装指南分享
Jan 05 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
Python程序员面试题 你必须提前准备!
Jan 16 Python
python操作excel的方法
Aug 16 Python
Python定时任务APScheduler的实例实例详解
Jul 22 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 Python
Python对Tornado请求与响应的数据处理
Feb 12 Python
Python爬虫之Selenium实现关闭浏览器
Dec 04 Python
5 分钟读懂Python 中的 Hook 钩子函数
Dec 09 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
Jan 24 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开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
PHP统计二维数组元素个数的方法
2013/11/12 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
2016/03/21 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
jQuery探测位置的提示弹窗(toolTip box)详细解析
2013/11/14 Javascript
javascript常用方法汇总
2014/12/02 Javascript
node.js中的dns.getServers方法使用说明
2014/12/08 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
javascript操作cookie
2017/01/17 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
在vue项目创建的后初始化首次使用stylus安装方法分享
2018/01/25 Javascript
JS处理一些简单计算题
2018/02/24 Javascript
JS中的算法与数据结构之集合(Set)实例详解
2019/08/20 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
[04:17]DOTA2完美盛典,rOtk、BurNIng携手巴图演唱《倔强》
2017/11/28 DOTA
Python的一些用法分享
2012/10/07 Python
Python 3.x读写csv文件中数字的方法示例
2017/08/29 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
python字符串反转的四种方法详解
2019/12/02 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
2020/07/14 Python
Django Form常用功能及代码示例
2020/10/13 Python
基于 HTML5 WebGL 实现的垃圾分类系统
2019/10/08 HTML / CSS
内业资料员岗位职责
2014/01/04 职场文书
农村改厕实施方案
2014/03/22 职场文书
相亲活动方案
2014/08/26 职场文书
领导干部学习“三严三实”思想汇报
2014/09/15 职场文书
2014年学生会工作总结范文
2014/11/07 职场文书
初婚初育证明范本
2014/11/24 职场文书
教师学期末个人总结
2015/02/13 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
2016年全国爱眼日宣传教育活动总结
2016/04/05 职场文书
php png失真的原因及解决办法
2021/11/17 PHP