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的加密模块md5、sha、crypt使用实例
Sep 28 Python
Python脚本获取操作系统版本信息
Dec 17 Python
Python实现图片转字符画的示例代码
Aug 21 Python
Python pyinotify日志监控系统处理日志的方法
Mar 08 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
Jul 06 Python
python命令行参数用法实例分析
Jun 25 Python
python使用socket 先读取长度,在读取报文内容示例
Sep 26 Python
Django通过dwebsocket实现websocket的例子
Nov 15 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
Feb 28 Python
python zip,lambda,map函数代码实例
Apr 04 Python
Python3将ipa包中的文件按大小排序
Apr 17 Python
Pytorch 实现变量类型转换
May 17 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中的一些数组排序方法分享
2012/07/20 PHP
ThinkPHP登录功能的实现方法
2014/08/20 PHP
php解析http获取的json字符串变量总是空白null
2015/03/02 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
JavaScript 应用类库代码
2008/06/02 Javascript
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
2013/02/04 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
浅谈JS闭包中的循环绑定处理程序
2014/11/09 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
js密码强度检测
2016/01/07 Javascript
JS解决iframe之间通信和自适应高度的问题
2016/08/24 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
微信小程序实现横向增长表格的方法
2018/07/24 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
2018/09/02 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
JS查找孩子节点简单示例
2019/07/25 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
2020/02/15 Javascript
python实现用户管理系统
2018/01/10 Python
浅析Python数字类型和字符串类型的内置方法
2019/12/22 Python
tensorflow2.0保存和恢复模型3种方法
2020/02/03 Python
CSS3实现swap交换动画
2016/01/19 HTML / CSS
Paul Smith英国官网:英国国宝级时装品牌
2019/03/21 全球购物
印度排名第一的蛋糕、鲜花和礼品送货:Winni
2019/08/02 全球购物
"引用"与多态的关系
2013/02/01 面试题
酒店个人培训自我鉴定
2013/12/11 职场文书
成绩单公证书
2014/04/10 职场文书
二年级小学生评语
2014/04/21 职场文书
三年级学生评语大全
2014/12/26 职场文书
借条格式范本
2015/05/25 职场文书
python识别围棋定位棋盘位置
2021/07/26 Python