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读写文本文件及编写简单的文本编辑器
Mar 11 Python
简单掌握Python中glob模块查找文件路径的用法
Jul 05 Python
python基础教程之五种数据类型详解
Jan 12 Python
django上传图片并生成缩略图方法示例
Dec 11 Python
Python用sndhdr模块识别音频格式详解
Jan 11 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
Apr 28 Python
opencv python 傅里叶变换的使用
Jul 21 Python
Python爬虫动态ip代理防止被封的方法
Jul 07 Python
Python使用scipy模块实现一维卷积运算示例
Sep 05 Python
Python使用贪婪算法解决问题
Oct 22 Python
信号生成及DFT的python实现方式
Feb 25 Python
python实现简单贪吃蛇游戏
Sep 29 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权限分配的实现代码
2013/04/28 PHP
php格式输出文件var_export函数实例
2014/11/15 PHP
PHP批量修改文件名称的方法分析
2017/02/27 PHP
mouse_on_title.js
2006/08/25 Javascript
JavaScript DOM 添加事件
2009/02/14 Javascript
childNodes.length与children.length的区别
2009/05/14 Javascript
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
js快速排序的实现代码
2013/12/08 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
2016/01/27 Javascript
基于javascript制作经典传统的拼图游戏
2016/03/22 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
Vue.js每天必学之数据双向绑定
2016/09/05 Javascript
Bootstrap Table使用心得总结
2016/11/29 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
你真的了解BOM中的history对象吗
2017/02/13 Javascript
JS表单传值和URL编码转换
2018/03/03 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
layui的面包屑或者表单不显示的解决方法
2019/09/05 Javascript
Vue基础配置讲解
2019/11/29 Javascript
JQuery绑定事件四种实现方法解析
2020/12/02 jQuery
[33:23]Secret vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
Python实现去除列表中重复元素的方法总结【7种方法】
2019/02/16 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
Pycharm plot独立窗口显示的操作
2020/12/11 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
美国知名的隐形眼镜电商:Contacts America
2019/11/19 全球购物
杭州联环马网络笔试题面试题
2013/08/04 面试题
竞选卫生委员演讲稿
2014/04/28 职场文书
公司承诺书格式
2014/05/21 职场文书
合作经营协议书范本
2014/09/16 职场文书