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/ironpython:从入门到精通
Oct 02 Python
Cython 三分钟入门教程
Sep 17 Python
Python ZipFile模块详解
Nov 01 Python
Python新手实现2048小游戏
Mar 31 Python
Python网络爬虫中的同步与异步示例详解
Feb 03 Python
pandas将numpy数组写入到csv的实例
Jul 04 Python
在Python中构建增广矩阵的实现方法
Jul 01 Python
Django 开发环境与生产环境的区分详解
Jul 26 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
python 读取数据库并绘图的实例
Dec 03 Python
详解使用scrapy进行模拟登陆三种方式
Feb 21 Python
Python+Appium自动化测试的实战
Jun 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 foreach循环中使用引用的问题
2013/11/06 PHP
完美实现wordpress禁止文章修订和自动保存的方法
2014/11/03 PHP
浅谈php错误提示及查错方法
2015/07/14 PHP
Joomla简单判断用户是否登录的方法
2016/05/04 PHP
PHP读MYSQL中文乱码的快速解决方法
2016/10/01 PHP
php实现多维数组排序的方法示例
2017/03/23 PHP
PHP基于openssl实现非对称加密代码实例
2020/06/19 PHP
通过修改referer下载文件的方法
2008/05/11 Javascript
JavaScript 事件记录使用说明
2009/10/20 Javascript
仅用[]()+!等符号就足以实现几乎任意Javascript代码
2010/03/01 Javascript
javascript cookies操作集合
2010/04/12 Javascript
javascript Array数组对象的扩展函数代码
2010/05/22 Javascript
jQuery is()函数用法3例
2014/05/06 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
2015/08/31 Javascript
Javascript for in的缺陷总结
2017/02/03 Javascript
vue.js 初体验之Chrome 插件开发实录
2017/05/13 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
微信小程序搭建自己的Https服务器
2019/05/02 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
2020/08/03 Javascript
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
python执行使用shell命令方法分享
2017/11/08 Python
利用python实现在微信群刷屏的方法
2019/02/21 Python
python的pygal模块绘制反正切函数图像方法
2019/07/16 Python
Python使用lambda表达式对字典排序操作示例
2019/07/25 Python
css3 iphone玻璃透明气泡完美实现
2013/03/20 HTML / CSS
简述数组与指针的区别
2014/01/02 面试题
高中生自我鉴定范文
2013/10/30 职场文书
电子专业自荐信
2014/07/01 职场文书
学习雷锋月活动总结
2014/07/03 职场文书
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python
python在package下继续嵌套一个package
2022/04/14 Python
基于redis+lua进行限流的方法
2022/07/23 Redis