您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 造纸印刷 > 基于Open-cv-+-Python微信跳一跳辅助程序
基于Opencv+Python自动跳一跳辅助玩微信跳一跳的方式有:•正常玩家:•外星生物玩家:喵星人•“神仙”玩家:目录1.基本介绍2.原理与算法3.具体模块及代码4.不足及改进01基本介绍此项目中,我们用到的工具有:1.OpenCV-python3.3.02.Python(此项目版本为3.6)3.Arduino(包括相关的套件)请输入标题OpenCVOpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和MacOS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、JAVA、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python、Java的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#、Ch、Ruby的支持。OpenCVPythonPythonPython是一种面向对象的解释型计算机程序设计语言,由荷兰人GuidovanRossum(吉多·范罗苏姆)于1989年发明,第一个公开发行版发行于1991年。Python语法简洁清晰,特色之一是强制用空白符(whitespace)作为语句缩进。Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。(如本项目的OpenCV)ArduinoArduinoArduino是一款便捷灵活、方便上手的开源电子原型平台。由一个欧洲开发团队于2005年冬季开发。主要包含两个主要的部分:硬件部分是可以用来做电路连接的Arduino电路板;另外一个则是ArduinoIDE,你的计算机中的程序开发环境。你只要在IDE中编写程序代码,将程序上传到Arduino电路板后,程序便会告诉Arduino电路板要做些什么了。基于Arduino的项目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上运行的软件,他们之间进行通信(比如Flash,Processing,MaxMSP)来实现。环境配置:windows下的python+opencv安装1.python下载及安装在python官网下载对应版本的python:此项目中用的是python3.6版本,下载好后直接点击安装,记得安装的时候确保勾选了pip和addpythontopath这两项。python安装成功后,可在命令提示符窗口用pipinstallpackageNamea安装第三方模块(前提是确定将Python添加到了系统变量)2.安装numpyNumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵在命令提示符窗口用pipinstallnumpy,系统会自动下载numpy并进行安装,可在窗口中查看下载进度。下图是已经安装成功了的。3.opencv-python下载及安装在~gohlke/pythonlibs/#opencv下载相应版本的opencv-python。左图为各个版本的opencv-python下载完成后,打开CMD命令行窗口,调整当前路径之文件所在的目录下,然后用pipinstallopencv_python-3.4.1+contrib-cp36-none-win_amd64.whl(whl包含py文件的压缩包)进行安装4.测试环境•最后测试一下是否安装成功,打开CMD,进入python,输入importcv2,如果没有提示错误信息,则说明opencv配置成功•1.RGB模型•三维坐标:•RGB:三原色Red,Green,Blue•原点到白色顶点的中轴线是灰度线,r、g、b三分量相等,强度可以由三分量的向量表示。•用RGB来理解色彩、深浅、明暗变化:•色彩变化:三个坐标轴RGB最大分量顶点与黄紫青YMC色顶点的连线•深浅变化:RGB顶点和CMY顶点到原点和白色顶点的中轴线的距离•明暗变化:中轴线的点的位置,到原点,就偏暗,到白色顶点就偏亮•2.HSV模型•倒锥形模型:•这个模型就是按色彩、深浅、明暗来描述的:•色调H,用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°•饱和度S,饱和度高,颜色则深而艳。•明度V,表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射情况或反射反射情况有关。就是说,屏幕是亮一点还是暗一点。因为后期考虑加装摄像头,实现“纯”物理辅助,为防止光线,环境亮度等因素对摄像头捕获的画面的影响,故本项目采用的是HSV模型•注意:对于HSV模型•OpenCV中的H范围为0-180•而Photoshop中H的范围为0-360所以棋子的H的范围为[(255-15)/2,(255+15)/2]02Program=algorithm+datastructure原理与算法距离(distance)和按压时间(press_time)•算法公式:按压时间=距离*按压系数•此处的距离为以像素为单位整个程序的核心目标,便是精确记算出棋子到目标方块中心点的距离之后通过一个常量的系数确定出所需要的按压时间。流程图棋子的位置:二值化处理后,检测轮廓,得到棋子的重心的坐标目标区域的中心点:1.小白点的模板匹配2.如果匹配失败,则选取边缘提取的方法PC将按压时间发送给Arduino,Arduino控制舵机(或继电器)实现一定时间的模拟按压03模块及具体代码在Python中调用numpy和OpenCVimportcv2Importnumpy棋子位置的确定:self_detect(img)•1.切片操作•2.RGB转为HSV•3.二值化处理•4.检测轮廓,矩形包围轮廓•5.找到棋子的重心坐标并标记出来1.切片操作:•缩小遍历范围降低运算量同时降低误识别的几率•代码:•region_upper=int(img.shape[0]*0.3)#img.shape是一个二维矩阵region_lower=int(img.shape[0]*0.7)#shape[0]表示图像的高度region=img[region_upper:region_lower]经过多次的尝试,发现其中裁剪的系数0.3、0.7截取出的图片刚好能包含所需的信息效果示意:2.RGB转为HSVPython:cv2.cvtColor(src,code[,dst[,dstCn]])hsv_img=cv2.cvtColor(region,cv2.COLOR_BGR2HSV)轮廓(Contours),指的是有相同颜色或者密度,连接所有连续点的一条曲线。3.轮廓检测在轮廓检测之前,首先要对图片进行二值化或者Canny边缘检测。在OpenCV中,寻找的物体是白色的,而背景必须是黑色的,因此图片预处理时必须保证这一点。先利用cv2.inRange函数设阈值,去除背景部分函数很简单,参数有三个•第一个参数:hsv指的是原图•第二个参数:lower指的是图像中低于这个lower的值,图像值变为0•第三个参数:upper指的是图像中高于这个upper的值,图像值变为0而在lower~upper之间的值变成255mask=cv2.inRange(hsv_img,lower,upper)#根据阈值构建掩模代码:color_lower=np.int32([105,25,45])color_upper=np.int32([135,125,130])color_mask=cv2.inRange(hsv_img,color_lower,color_upper)3.轮廓检测检测棋子的轮廓参数•第一个参数是寻找轮廓的图像;•第二个参数表示轮廓的检索模式,有四种:cv2.RETR_EXTERNAL表示只检测外轮廓cv2.RETR_LIST检测的轮廓不建立等级关系cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。cv2.RETR_TREE建立一个等级树结构的轮廓。cv2.findContours(image,mode,method[,contours[,hierarchy[,offset]]])返回值一个是轮廓本身,还有一个是每条轮廓对应的属性。检测棋子的轮廓•关于轮廓的逼近方法,有:cv2.CHAIN_APPROX_NONE:获取每个轮廓的每个元素,相邻像素的位置差不超过1,即连续的点,但通常我们并不需要所有的点•cv2.CHAIN_APPROX_SIMPLE:压缩水平方向、垂直方向和对角线方向的元素,保留该方向的终点坐标,如矩形的轮廓可用4个角点表示,这是一种常用的方法,比第一种方法能得出更少的点•cv2.CHAIN_APPROX_TC89_L1和cv2.CHAIN_APPROX_TC89_KCOS:对应Tch-Chain链逼近算法左:cv2.CHAIN_APPROX_NONE右:cv2.CHAIN_APPROX_SIMPLErect=cv2.boundingRect(max_contour)•边界矩形•直边界矩形一个直矩形(就是没有旋转的矩形)。•它不会考虑对象是否旋转。所以边界矩形的面积不是最小的。可以使用函数cv2.boundingRect()查找得到。•函数返回的值(x,y)为矩形左上角的坐标,(w,h)是矩形的宽和高。获取棋子的重心位置并标记出来代码(计算出重心的坐标,并在途中标记出来))x,y,w,h=rectcenter_coord=(x+int(w/2),y+h+region_upper-20)#棋子重心的坐标0cv2.circle(img,center_coord,5,(0,255,0),-1)其中cv2.circle(img,center_coord,5,(0,255,0),-1)为绘制一个圆形•img:你想要绘制图形的那幅图像•center_cood:圆心坐标•linetype:线条的类型,8连接,抗锯齿等。默认情况是8连接•color:形状的颜色。以RGB为例,需要传入一个元组,例如:(0,255,0)代表蓝色。对于灰度图只需要传入灰度值。•thickness:线条的粗细。如果给一个闭合图形设置为-1,那么这个图形就会被填充。默认值是1.•importcv2importnumpyasnpimg=cv2.imread('e:/hasage.jpg')#region_upper=int(img.shape[0]*0.3)#region_lower=int(img.shape[0]*0.7)region=img#[region_upper:region_lower]cv2.imshow('test',region)cv2.waitKey()hsv_img=cv2.cvtColor(region,cv2.COLOR_BGR2HSV)hsv_img=cv2.resize(hsv_img,(450,800))cv2.imshow('RGBTOHSV',hsv_img)cv2.waitKey()color_lower=np.int32([105,25,45])color_upper=np.int32([135,125,130])color_mask=cv2.inRange(hsv_img,color_lower,color_upper)color_mask=cv2.resize(color_mask,(450,800))cv2.imshow('color_mask',color_mask)cv2.waitKey()scontours=cv2.findContours(color_mask,cv2.RETR_EXTERNAL,cv2.C
本文标题:基于Open-cv-+-Python微信跳一跳辅助程序
链接地址:https://www.777doc.com/doc-5561188 .html