历经1个月的准备,凡哥写出了稳定的跳一跳自动运行脚本,可以稳定地识别跳一跳平面的边缘点,分数轻松破万。
同时凡哥也编写了干货满满的凡哥带你玩转OpenCV之跳一跳主题教程 . 在凡哥的公司网站上会陆续更新。myfange.com
需要完整教程的同学也可加入OpenCV广场群:627671914,查看会员制度。
实际上,我们做的这个稳定的跳一跳图像识别程序,用到的都是基础的图像处理方法。
非常传统,这些简单的几何体,还不至于劳烦人工智能深度学习。
基本上,所有涉及的函数,凡哥都已经在课程中讲解过了。 所以,你直接阅读凡哥写的代码会非常容易。
在这篇文章里,还提到了实现哪部分的代码,需要阅读凡哥的教程的章节号,方便大家查阅。
SelectROI 截取图片的部分区域, 见教程CH4.1_SelectROI区域选择与图像裁剪-凡哥带你玩转OpenCV 。
# 先转换为HSV格式的图片
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
颜色空间转换(cvtColor)的详细使用方法见 CH1.2_通过Matplotlib展示图片-凡哥带你玩转OpenCV
根据对hsv颜色空间下棋子的颜色分布的观察:
颜色分布图的绘制见 CH4.2_颜色统计与分布曲线绘制-凡哥带你玩转OpenCV
- H通道 代表颜色 ,用蓝色曲线绘制
- S通道 代表色彩饱和度, 用绿色曲线绘制
- V通道 代表亮度 , 用红色曲线绘制
观察到颜色的分布后,记录颜色的上下阈值,写在代码里。
# 阈值下界
lowerb = (104, 33, 58)
# 阈值上界
upperb = (136, 121, 104)
有了上界与下界之后,就可以将图片进行二值化.
mask = cv2.inRange(img_hsv, lowerb, upperb)
图像二值化(inRange) 见教程 CH4.3_图像全局二值化与可视化调参-凡哥带你玩转OpenCV
接下来我们在图像中寻找固定宽高范围的矩形区域。
轮廓的外接矩形寻找,见教程 CH5.2_轮廓的外接矩形-凡哥带你玩转OpenCV
如果找到的话,就可以确定棋子的底部中心, 如上图红点所标注。
图片的标注与几何图形绘制请参见第二章,CH2.3_几何图像绘制与文字绘制-凡哥带你玩转OpenCV
如果找不到的话, 或者图像中存在多个满足宽高要求的连通域, 我们可以使用模板匹配Template Matching 进行进一步检索。
模板匹配见 CH6.1_模板匹配-凡哥带你玩转OpenCV
棋子的识别代码的具体实现见文件:BlackChess.py
。
为了更好更高效的看懂这部分的代码,对numpy的掌握程度要求比较高.
首先我们将图片BGR
三通道, 分别进行Canny算子求得盒子的边缘二值图像,然后将三个通道的边缘图像叠加在一起。
你需要了解二值化图片之间的与,或,非等逻辑运算.详见教程CH4.6_二值化逻辑运算-凡哥带你玩转openCV
接下来我们找到边缘图像中,最顶上的那个轮廓点集合,如下图中红线标注。
轮廓的获取与遍历,请参见教程 CH5.1_获取边缘点集与绘制-凡哥带你玩转OpenCV
然后还要找到最顶上的顶点,与顶点所在的坐标,如下图绿色圆圈处。
在顶点所在的序号分别向左向右延伸, 找到平台的左顶点left_point
跟平台右顶点right_point
三点确定一个四边形。 根据平行四边形的特性, 我们可以方便地求出来另外一个点的坐标。
# 通过平行四边形的定理 获取下方的点
down_point = (left_point[0]+right_point[0]-top_point[0],left_point[1]+right_point[1]-top_point[1])
四个点确定一个外接矩形区域, 在这个矩形区域内检索小白点。如果存在的话, 这个就是中心。
如果不存在的话, 就将左顶点left_point与右顶点right_point 中心作为平面中心点。
平台中心点检索详情见NextJumpPlat.py
有意思的是延迟与距离并不是完全线形的, 随着距离的变大, 比例因子ratio也在变小。
所以按照经验,用一条直线来拟合距离跟ratio
之间的关系。
首先你需要确定两个点. 这两个参考点需要自己调参。
pt1 = (800, 1.4) # 距离是800像素的时候, ratio是1.4
pt2 = (300, 1.63) # 距离是300像素的时候, ratio是1.63
给定一个距离distance, 先求出来在这条直线上对应distance 处的比例因子ratio
然后再相乘得到延迟时间。
def distance2time(distance):
'''
距离与延迟时间不完全成正比,需要添加惩罚项
'''
print(distance)
pt1 = (800, 1.4)
pt2 = (300, 1.63)
ratio = pt1[1] - (pt1[1]-pt2[1])*(pt1[0]-distance)/(pt1[0]-pt2[0])
print("distance: %.2f ratio=%.2f"%(distance, ratio))
# 时间必须是整数类型
return int(distance * ratio)
安装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
修改AutoJump.py
文件中
# 初始化ADBHelper 传入手机分辨率
adb = ADBHelper(1080, 1920)
模板匹配不具备变尺度的特性, 如果你的手机分辨率跟我不相同, 就需要手机截图后,用SelectROI重新选取。替换little_chess.png
模板匹配教程,详见CH6.1模板匹配-凡哥带你玩转OpenCV
你可以在AutoJump.py
中开启或者关闭Debug模式。
开发环境详细参数
-
os
不限,推荐使用linux(ubuntu,树莓派等) -
python
3.6 -
numpy
1.13.3 -
opencv
3.3.0
凡哥配的树莓派的操作系统有编译好的最新的
3.4.0
版本如果你已经配置好了linux开发环境并安装好了opencv, 请跳过此部分
凡哥帮大家配好了带opencv运行环境的Ubuntu跟树莓派两个版本的操作系统。
镜像文件均可以在我们的会员群里下载。 树莓派的系统直接拷贝到SD卡中即可。
凡哥配好的Ubuntu虚拟机,你也可以一键导入VirtualBox。
详情见视频教程:
视频教程-第四节_使用Virtualbox导入凡哥配置好开发环境的虚拟主机
如果你想自己配置的话,凡哥帮大家写好了详细的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开发环境是否正常.
进入工程根目录 ,并执行指令。
python AutoJump.py
OpenCV广场群 627671914