凡哥OpenCV基础入门教程-跳一跳专题
2018-03-16 20:46
906 查看
原创作品,转载请注明出处!!
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/02/65131c37ae6f5bf85a8a32b6f830d7ec)
opencv jump course实际上,我们做的这个稳定的跳一跳图像识别程序,用到的都是基础的图像处理方法。非常传统,这些简单的几何体,还不至于劳烦人工智能深度学习。基本上,所有涉及的函数,凡哥的教程中都会讲解。 所以,你直接阅读凡哥写的代码会非常容易。在这篇文章里,还提到了实现哪部分的代码,需要阅读凡哥的教程的章节号,方便大家查阅。效果展示
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/02/54faf605893f99caa5bfa07b294f3f26)
2018-02-22-17-03-19-081616.png
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/02/942016361684f040410b83966ca4e7a9)
little_chess.png首先将BGR格式的图片转换为HSV色彩空间。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/02/866cc1e12bf876078851c0aa28f568cb)
little_chess_hsv_stat.pngH通道 代表颜色 ,用蓝色曲线绘制
S通道 代表色彩饱和度, 用绿色曲线绘制
V通道 代表亮度 , 用红色曲线绘制
观察到颜色的分布后,记录颜色的上下阈值,写在代码里。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/02/45b8ac261fb773f6bcf00d58e398ec9f)
20180222_demo02_bin_chess.png如果找到的话,就可以确定棋子的底部中心, 如上图红点所标注。 图片的标注与几何图形绘制请参见第二章,CH2.3_几何图像绘制与文字绘制-凡哥带你玩转OpenCV如果找不到的话, 或者图像中存在多个满足宽高要求的连通域, 我们可以使用模板匹配Template Matching 进行进一步检索。 模板匹配见 CH6.1_模板匹配-凡哥带你玩转OpenCV
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/02/055b2f19cb1fb7f68a717b76893027a5)
template_match_res棋子的识别代码的具体实现见文件:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/02/b9a2ed2ac0361fb3d864130336980b09)
20180222_demo03.png接下来我们找到边缘图像中,最顶上的那个轮廓点集合,如下图中红线标注。 轮廓的获取与遍历,请参见教程 CH5.1_获取边缘点集与绘制-凡哥带你玩转OpenCV
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/02/c13c2d371dc29afd1996648dfb39497a)
find_top_point_and_make_sample.png然后还要找到最顶上的顶点,与顶点所在的坐标,如下图绿色圆圈处。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/02/489d6feb31c6fa14c744a79de693892b)
20180222_next_plat_demo03.png在顶点所在的序号分别向左向右延伸, 找到平台的左顶点left_point
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/02/daa5f0694b0de76e164b59cc11481f56)
find_left_point_of_box跟平台右顶点right_point
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/02/de3384b89d83d23aa327aa4e56bf2054)
find_right_point_of_box三点确定一个四边形。 根据平行四边形的特性, 我们可以方便地求出来另外一个点的坐标。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/02/f4448cd610232c0917103f43758e663f)
20180222_white_point_demo02.png如果不存在的话, 就将左顶点left_point与右顶点right_point 中心作为平面中心点。平台中心点检索详情见
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/02/942016361684f040410b83966ca4e7a9)
little_chess.png
凡哥配的树莓派的操作系统有编译好的最新的
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/01/b434ee01b62db4ccbe7e53dfd4a580ff)
96_20180117213930
0. 前言
历经1个月的准备,凡哥写出了稳定的跳一跳自动运行脚本,可以稳定地识别跳一跳平面的边缘点,分数轻松破万。GitHub地址:https://github.com/mushroom-x/FGJumperMaster同时凡哥也编写了干货满满的凡哥带你玩转OpenCV之跳一跳主题教程 . 在凡哥的公司网站上会陆续更新。www.myfange.com需要更多计算机视觉教程的同学也可加入OpenCV广场群:627671914,查看会员制度。opencv jump course实际上,我们做的这个稳定的跳一跳图像识别程序,用到的都是基础的图像处理方法。非常传统,这些简单的几何体,还不至于劳烦人工智能深度学习。基本上,所有涉及的函数,凡哥的教程中都会讲解。 所以,你直接阅读凡哥写的代码会非常容易。在这篇文章里,还提到了实现哪部分的代码,需要阅读凡哥的教程的章节号,方便大家查阅。效果展示
2018-02-22-17-03-19-081616.png
1. 识别过程与原理介绍
步骤1: 利用SelectROI 截取棋子的图片,用于色彩统计。
SelectROI 截取图片的部分区域, 见教程CH4.1_SelectROI区域选择与图像裁剪-凡哥带你玩转OpenCV 。little_chess.png首先将BGR格式的图片转换为HSV色彩空间。
1# 先转换为HSV格式的图片 2img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)颜色空间转换(cvtColor)的详细使用方法见 CH1.2_通过Matplotlib展示图片-凡哥带你玩转OpenCV根据对hsv颜色空间下棋子的颜色分布的观察: 颜色分布图的绘制见 CH4.2_颜色统计与分布曲线绘制-凡哥带你玩转OpenCV
little_chess_hsv_stat.pngH通道 代表颜色 ,用蓝色曲线绘制
S通道 代表色彩饱和度, 用绿色曲线绘制
V通道 代表亮度 , 用红色曲线绘制
观察到颜色的分布后,记录颜色的上下阈值,写在代码里。
1# 阈值下界 2lowerb = (104, 33, 58) 3# 阈值上界 4upperb = (136, 121, 104)有了上界与下界之后,就可以将图片进行二值化.
1mask = cv2.inRange(img_hsv, lowerb, upperb)图像二值化(inRange) 见教程 CH4.3_图像全局二值化与可视化调参-凡哥带你玩转OpenCV接下来我们在图像中寻找固定宽高范围的矩形区域。 轮廓的外接矩形寻找,见教程 CH5.2_轮廓的外接矩形-凡哥带你玩转OpenCV
20180222_demo02_bin_chess.png如果找到的话,就可以确定棋子的底部中心, 如上图红点所标注。 图片的标注与几何图形绘制请参见第二章,CH2.3_几何图像绘制与文字绘制-凡哥带你玩转OpenCV如果找不到的话, 或者图像中存在多个满足宽高要求的连通域, 我们可以使用模板匹配Template Matching 进行进一步检索。 模板匹配见 CH6.1_模板匹配-凡哥带你玩转OpenCV
template_match_res棋子的识别代码的具体实现见文件:
BlackChess.py。
步骤2: 寻找跳一跳平台
为了更好更高效的看懂这部分的代码,对numpy的掌握程度要求比较高. 见教程 Numpy快速入门-凡哥带你玩转Python科学计算首先我们将图片BGR三通道, 分别进行Canny算子求得盒子的边缘二值图像,然后将三个通道的边缘图像叠加在一起。 你需要了解二值化图片之间的与,或,非等逻辑运算.详见教程CH4.6_二值化逻辑运算-凡哥带你玩转openCV
20180222_demo03.png接下来我们找到边缘图像中,最顶上的那个轮廓点集合,如下图中红线标注。 轮廓的获取与遍历,请参见教程 CH5.1_获取边缘点集与绘制-凡哥带你玩转OpenCV
find_top_point_and_make_sample.png然后还要找到最顶上的顶点,与顶点所在的坐标,如下图绿色圆圈处。
20180222_next_plat_demo03.png在顶点所在的序号分别向左向右延伸, 找到平台的左顶点left_point
find_left_point_of_box跟平台右顶点right_point
find_right_point_of_box三点确定一个四边形。 根据平行四边形的特性, 我们可以方便地求出来另外一个点的坐标。
1# 通过平行四边形的定理 获取下方的点 2down_point = (left_point[0]+right_point[0]-top_point[0],left_point[1]+right_point[1]-top_point[1])四个点确定一个外接矩形区域, 在这个矩形区域内检索小白点。如果存在的话, 这个就是中心。
20180222_white_point_demo02.png如果不存在的话, 就将左顶点left_point与右顶点right_point 中心作为平面中心点。平台中心点检索详情见
NextJumpPlat.py
步骤3: 计算距离并求得按压延时
有意思的是延迟与距离并不是完全线形的, 随着距离的变大, 比例因子ratio也在变小。ratio=delay/distance所以按照经验,用一条直线来拟合距离跟ratio之间的关系。首先你需要确定两个点. 这两个参考点需要自己调参。
1pt1 = (800, 1.4) # 距离是800像素的时候, ratio是1.4 2pt2 = (300, 1.63) # 距离是300像素的时候, ratio是1.63给定一个距离distance, 先求出来在这条直线上对应distance 处的比例因子ratio然后再相乘得到延迟时间。
1def distance2time(distance): 2 ''' 3 距离与延迟时间不完全成正比,需要添加惩罚项 4 ''' 5 print(distance) 6 pt1 = (800, 1.4) 7 pt2 = (300, 1.63) 8 9 10 ratio = pt1[1] - (pt1[1]-pt2[1])*(pt1[0]-distance)/(pt1[0]-pt2[0]) 11 print("distance: %.2f ratio=%.2f"%(distance, ratio)) 12 13 # 时间必须是整数类型 14 return int(distance * ratio)
2. 准备工作
预备1: ADB安装与手机配置
安装ADB驱动与打开手机的USB调试功能 见教程 CH3.1_ADB安装过程与ADB部分指令介绍-凡哥带你玩转OpenCV 注意: 电脑每次开机都需要重启adb server,手机每次断开连接都需要开启USB调试功能与PTP文件传输。 详情见教程CH3.1。ADB的功能介绍,命令行使用说明,也在CH3.1_ADB安装过程与ADB部分指令介绍-凡哥带你玩转OpenCV中.为了能够在python中执行ADB指令,我们需要借助python的子进程subprocess模块 。在使用
subprocess之前, 你需要补习一些操作系统的基本概念, 例如什么是管道什么是进程等等。 操作系统基本概念,见教程CH3.2 补习操作系统中的基本概念-凡哥带你玩转OpenCV接下来你需要学习
subprocess模块使用 见教程CH3.3_subprocess模块的使用说明-凡哥带你玩转OpenCV我们用python对我们需要用到的几个功能 截图 与模拟点击 做了一个封装。 在教程CH3.3中也有详细说明。代码见
ADBHelper.py
预备2: 设定手机屏幕分辨率
修改AutoJump.py文件中
1# 初始化ADBHelper 传入手机分辨率 2adb = ADBHelper(1080, 1920)
预备3: 替换模板文件
模板匹配不具备变尺度的特性, 如果你的手机分辨率跟我不相同, 就需要手机截图后,用SelectROI重新选取。替换little_chess.png模板匹配教程,详见CH6.1模板匹配-凡哥带你玩转OpenCV
little_chess.png
预备4: Debug模式
你可以在AutoJump.py中开启或者关闭Debug模式。
预备5: 开发环境的搭建
开发环境详细参数os不限,推荐使用linux(ubuntu,树莓派等)
python3.6
numpy1.13.3
opencv3.3.0
凡哥配的树莓派的操作系统有编译好的最新的
3.4.0版本 如果你已经配置好了linux开发环境并安装好了opencv, 请跳过此部分
① 虚拟机镜像
凡哥帮大家配好了带opencv运行环境的Ubuntu跟树莓派两个版本的操作系统。镜像文件均可以在我们的会员群里下载。 树莓派的系统直接拷贝到SD卡中即可。凡哥配好的Ubuntu虚拟机,你也可以一键导入VirtualBox。详情见视频教程:视频教程-第四节_使用Virtualbox导入凡哥配置好开发环境的虚拟主机96_20180117213930
② Linux配置教程
如果你想自己配置的话,凡哥帮大家写好了详细的Ubuntu安装与配置说明。详细步骤放在了凡哥的教学网站上 www.myfange.com建议大家在PC上浏览教程(PC上,bilibili的播放器才能正常使用)在VirtualBox上安装Ubutu16-04的虚拟机-凡哥带你配置OpenCV开发环境 在本次教程里, 凡哥带大家安装VirtualBox, 介绍了一下VirtualBox与VMWare的不同之处. 教大家如何创建一个虚拟机, 如何分配物理资源等. 然后我们挂载Ubuntu16.04的镜像, 凡哥逐步教大家安装Ubuntu.课程最后, 你可以进入到你自己安装的Ubuntu桌面, 是不是很有成就感.在Ubuntu下安装Anaconda科学计算包并运行python程序-凡哥带你配置OpenCV开发环境 在这节课, 凡哥带大家从Anaconda的官网下载sh安装文件, 并在本地运行它. 安装完成之后, 需要添加环境变量PATH到.bashrc下, 接下来我们测试一下anaconda是否安装成功. 最后, 凡哥给大家演示了, 安装Anaconda之后运行IPython与Jupyter Notebook 交互式编程环境.Ubuntu下利用Anaconda安装opencv-凡哥带你配置OpenCV开发环境 这篇文章一来教大家如何使用anaconda 来搜索包, 添加channel , 二来也演示配置opencv开发环境的过程。 我们安装来自conda-forge , 我们选择的opencv版本是opencv=3.3.0. 另外, 当你安装完anaconda之后, 管理python包的工具就从pip转变为conda 文章写的比较仓促, 为anaconda指令讲解不是很详细, 请多包涵.在VirtualBox虚拟机里使用Opencv获取USB摄像头的图像-凡哥带你配置OpenCV开发环境 在这一讲里, 凡哥将会带大家在virtualbox中运行opencv的程序, 并且读取usb摄像头的图像。 在运行程序之前, 你需要在VirtualBox上安装对应的拓展包. 然后, 凡哥还详细讲解了opencv中调用VideoCapture获取图像并展示在窗口的程序. 通过这篇文章的操作, 你可以检测你的USB设备是否可以在虚拟机里正常读取, 另外, 测试你配置的opencv开发环境是否正常.3. 运行代码
进入工程根目录 ,并执行指令。1python AutoJump.py
相关文章推荐
- 凡哥OpenCV基础入门教程(跳一跳专题)-CH3.3-subprocess模块的使用说明
- 凡哥OpenCV基础入门教程(跳一跳专题)-CH1.4-图片保存imwrite
- 凡哥OpenCV基础入门教程(跳一跳专题)-CH3.4-实战篇 手动模式玩跳一跳
- 凡哥OpenCV基础入门教程(跳一跳专题)-CH2.3-几何图像绘制与文字绘制
- 凡哥OpenCV基础入门教程(跳一跳专题)-CH1.1-读入图片并显示图片的相关属性
- 凡哥OpenCV基础入门教程(跳一跳专题)-CH1.2_通过Matplotlib展示图片
- 凡哥OpenCV基础入门教程(跳一跳专题)-CH3.1-ADB安装过程与ADB部分指令介绍
- 凡哥OpenCV基础入门教程(跳一跳专题)-CH3.2-进程与数据流重定向
- 凡哥OpenCV基础入门教程(跳一跳专题)-CH1.3-通过HighGUI展示图片
- 凡哥OpenCV基础入门教程(跳一跳专题)-CH2.1-花式创建空白画布
- 凡哥带你玩转OpenCV小班精品课第一期_OpenCV基础入门+跳一跳小程序项目实战 课程介绍
- Android基础入门教程——10.13 传感器专题(4)——其他传感器了解
- Android基础入门教程——10.10 传感器专题(1)——相关介绍
- Android基础入门教程——10.11 传感器专题(2)——方向传感器
- OpenCV2/3基础入门高清视频教程
- 最基础的Python的socket编程入门教程
- 【转】Gulp入门基础教程
- OpenGL 入门基础教程 —— 键盘和鼠标响应
- CG插画入门教程之人体动态基础与面部画法分析
- 盗雪html5入门基础视频教程全集下载