版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于Opencv + Python 自动跳一跳辅助1/54玩微信跳一跳方式有:正常玩家:外星生物玩家:喵星人“神仙” 玩家:2/54目录1.基本介绍2.原理与算法3.详细模块及代码4.不足及改进3/5401基本介绍此项目中,我们用到工含有:1. OpenCV-python 3.3.02.Python(此项目版本为3.6)3.Arduino(包含相关套件)4/54请输入标题OpenCV OpenCV是一个基于BSD许可(开源)发行跨平台计算机视觉库,能够运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效由一系列 C 函数和少许 C+ 类组成,同时提供了Py
2、thon、JAVA、MATLAB等语言接口,实现了图像处理和计算机视觉方面很多通用算法。 OpenCV用C+语言编写,它主要接口也是C+语言,不过依然保留了大量C语言接口。该库也有大量Python、Java 接口。这些语言API接口函数能够经过在线文档取得。如今也提供对于C#、Ch、Ruby支持。OpenCV5/54PythonPython Python 是一个面向对象解释型计算机程序设计语言,由荷兰人Guido van Rossum(吉多范罗苏姆)于1989年创造,第一个公开发行版发行于1991年。 Python语法简练清楚,特色之一是强制用空白符(white space)作为语句缩进。 P
3、ython含有丰富和强大库。它常被昵称为胶水语言,能够把用其它语言制作各种模块(尤其是C/C+)很轻松地联结在一起。(如本项目标OpenCV )6/547/54ArduinoArduino Arduino是一款便捷灵活、方便上手开源电子原型平台。由一个欧洲开发团体于冬季开发。 主要包含两个主要部分:硬件部分是能够用来做电路连接Arduino电路板;另外一个则是Arduino IDE,你计算机中程序开发环境。你只要在IDE中编写程序代码,将程序上传到Arduino电路板后,程序便会告诉Arduino电路板要做些什么了。 基于Arduino项目,能够只包含Arduino,也能够包含Arduino和
4、其它一些在PC上运行软件,他们之间进行通信 (比如 Flash, Processing, MaxMSP)来实现。8/54环境配置:windows下python+ opencv安装1.python下载及安装在python官网下载对应版本python:/downloads/windows/ 此项目中用是python3.6版本,下载好后直接点击安装,记得安装时候确保勾选了pip和add python to path这两项。python安装成功后,可在命令提醒符窗口用 pip install packageNamea 安装第三方模块(前提是确定将Python添加到了系统变量)2.安装numpy Num
5、Py系统是Python一个开源数值计算扩展。这种工具可用来存放和处理大型矩阵在命令提醒符窗口用pip install numpy,系统会自动下载numpy并进行安装,可在窗口中查看下载进度。下列图是已经安装成功了。9/543.opencv-python下载及安装在/gohlke/pythonlibs/#opencv下载对应版本opencv-python。左图为各个版本opencv-python下载完成后,打开CMD命令行窗口,调整当前路径之文件所在目录下,然后用pip install opencv_python-3.4.1+contrib-cp36-none-win_amd64.whl(whl
6、 包含py文件压缩包)进行安装10/544.测试环境最终测试一下是否安装成功,打开CMD,进入python,输入import cv2,假如没有提醒错误信息,则说明opencv配置成功11/541. RGB模型三维坐标:RGB:三原色 Red, Green, Blue原点到白色顶点中轴线是灰度线,r、g、b三分量相等,强度能够由三分量向量表示。用RGB来了解色彩、深浅、明暗改变:色彩改变: 三个坐标轴RGB最大分量顶点与黄紫青YMC色顶点连线深浅改变:RGB顶点和CMY顶点到原点和白色顶点中轴线距离明暗改变:中轴线点位置,到原点,就偏暗,到白色顶点就偏亮12/542. HSV模型倒锥形模型:这个
7、模型就是按色彩、深浅、明暗来描述:色调H,用角度度量,取值范围为0360,从红色开始按逆时针方向计算,红色为0,绿色为120,蓝色为240饱和度S,饱和度高,颜色则深而艳。明度V,表示颜色明亮程度,对于光源色,明度值与发光体光亮度相关;对于物体色,此值和物体透射情况或反射反射情况相关。就是说,屏幕是亮一点还是暗一点。 13/5414/54因为后期考虑加装摄像头,实现“纯”物理辅助,为预防光线,环境亮度等原因对摄像头捕捉画面影响,故本项目采取是 HSV模型 注意:对于HSV模型OpenCV中H 范围为0-180而Photoshop中H范围为0-360 所以棋子H范围为 (255-15)/2, (
8、255+15)/215/5402Program = algorithm + data structure原理与算法16/54距离(distance)和 按压时间(press_time)算法公式:按压时间 = 距离 * 按压系数此处距离为以像素为单位整个程序关键目标,便是准确记算出棋子到目标方块中心点距离之后经过一个常量系数确定出所需要按压时间。17/541、棋子与目标方块识别,并计算像素距离2、给假定个时间距离系数如1.5,舵机转动、延时这两个待调参数 计算舵机实际执行时间3、PC经过串口将按压时间发送给Arduino,从而控制舵机4、依据执行结果手动调整时间距离系数,和舵机转动延时参数按压系
9、数获取逻辑:18/54流程图棋子位置:二值化处理后,检测轮廓,得到棋子重心坐标目标区域中心点:1.小白点模板匹配 2.假如匹配失败,则选取边缘提取方法PC将按压时间发送给Arduino, Arduino控制舵机(或继电器)实现一定时间模拟按压19/5403模块及详细代码在Python中调用numpy 和 OpenCVimport cv2 Import numpy20/54棋子位置确定: self_detect(img)1.切片操作2.RGB转为HSV3.二值化处理4.检测轮廓,矩形包围轮廓5.找到棋子重心坐标并标识出来21/541.切片操作:缩小遍历范围 降低运算量同时降低误识别几率代码:re
10、gion_upper=int(img.shape0*0.3) #img.shape是一个二维矩阵region_lower=int(img.shape0*0.7) #shape0表示图像高度region=imgregion_upper:region_lower经过屡次尝试,发觉其中裁剪系数0.3、0.7 截取出图片刚好能包含所需信息22/54效果示意:23/542.RGB转为HSVPython: cv2.cvtColor(src,code,dst,dstCn)hsv_img=cv2.cvtColor(region,cv2.COLOR_BGR2HSV)24/54轮廓(Contours),指是有相同
11、颜色或者密度,连接全部连续点一条曲线。3.轮廓检测在轮廓检测之前,首先要对图片进行二值化或者Canny边缘检测。在OpenCV中,寻找物体是白色,而背景必须是黑色,所以图片预处理时必须确保这一点。25/54先利用cv2.inRange函数设阈值,去除背景部分 函数很简单,参数有三个 第一个参数:hsv指是原图第二个参数:lower指是图像中低于这个lower值,图像值变为0第三个参数:upper指是图像中高于这个upper值,图像值变为0 而在lowerupper之间值变成255mask=cv2.inRange(hsv_img,lower,upper) # 依据阈值构建掩模代码:color_l
12、ower=32(105,25,45)color_upper=32(135,125,130)color_mask = cv2.inRange(hsv_img, color_lower, color_upper)3.轮廓检测26/54检测棋子轮廓 参数第一个参数是寻找轮廓图像;第二个参数表示轮廓检索模式,有四种: cv2.RETR_EXTERNAL表示只检测外轮廓 cv2.RETR_LIST检测轮廓不建立等级关系 cv2.RETR_CCOMP建立两个等级轮廓,上面一层为外边界,里面一层为内孔边界信息。假如内孔内还有一个连通物体,这个物体 边界也在顶层。 cv2.RETR_TREE建立一个等级树结构
13、轮廓。cv2.findContours(image,mode,method,contours,hierarchy,offset)返回值 一个是轮廓本身,还有一个是每条轮廓对应属性。27/54检测棋子轮廓关于轮廓迫近方法,有:cv2.CHAIN_APPROX_NONE:获取每个轮廓每个元素,相邻像素位置差不超出1,即连续点,但通常我们并不需要全部点cv2.CHAIN_APPROX_SIMPLE:压缩水平方向、垂直方向和对角线方向元素,保留该方向终点坐标,如矩形轮廓可用4个角点表示,这是一个惯用方法,比第一个方法能得出更少点cv2.CHAIN_APPROX_TC89_L1和cv2.CHAIN_AP
14、PROX_TC89_KCOS:对应Tch-Chain链迫近算法 左:cv2.CHAIN_APPROX_NONE 右:cv2.CHAIN_APPROX_SIMPLE28/54max_contour = cv2.convexHull(max_contour)凸包与轮廓近似相同,但不一样,即使有些情况下它们给出结果是一样。函数 cv2.convexHull() 能够用来检测一个曲线是否含有凸性缺点,并能纠正缺点。普通来说,凸性曲线总是凸出来,最少是平。假如有地方凹进去了就被叫做凸性缺点。参考代码为: hull=cv2.convexHull(points,hull,clockwise,returnPo
15、ints)points 我们要传入轮廓 hull 输出,通常不需要 clockwise 方向标志。假如设置为 True,输出凸包是顺时针方向。不然为逆时针方向。 returnPoints 默认值为 True。它会返回凸包上点坐标。假如设置为 False,就会返回与凸包点对应轮廓上点。29/54rect = cv2.boundingRect(max_contour)边界矩形直边界矩形 一个直矩形(就是没有旋转矩形)。它不会考虑对象是否旋转。所以边界矩形面积不是最小。能够使用函数 cv2.boundingRect() 查找得到。函数返回值(x,y)为矩形左上角坐标,(w,h)是矩形宽和高。30/5
16、4获取棋子重心位置并标识出来代码(计算出重心坐标,并在途中标识出来)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 为例,
17、需要传入一个元组,比如: (0,255,0)代表蓝色。对于灰度图只需要传入灰度值。 thickness:线条粗细。假如给一个闭合图形设置为 -1,那么这个图形就会被填充。默认值是 1.31/54 import cv2import numpy as npimg=cv2.imread(e:/hasage.jpg)#region_upper=int(img.shape0*0.3)#region_lower=int(img.shape0*0.7)region=img#region_upper:region_lowercv2.imshow(test,region )cv2.waitKey()hsv_im
18、g = cv2.cvtColor(region , cv2.COLOR_BGR2HSV)hsv_img =cv2.resize(hsv_img ,(450,800)cv2.imshow(RGB TO HSV,hsv_img )cv2.waitKey()color_lower=32(105,25,45)color_upper=32(135,125,130)color_mask = cv2.inRange(hsv_img, color_lower, color_upper)color_mask =cv2.resize(color_mask ,(450,800)cv2.imshow(color_ma
19、sk,color_mask )cv2.waitKey() scontours= cv2.findContours(color_mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)1if len(contours)0: max_contour = max(contours, key=cv2.contourArea) max_contour = cv2.convexHull(max_contour) rect = cv2.boundingRect(max_contour) x, y, w, h = rect cv2.rectangle(color_mask
20、 , (x, y), (x + w, y + h), (0, 255, 0), 5) img = cv2.resize(img, (450, 800) cv2.imshow(cicle, img) cv2.waitKey(0) center_coord=(x+int(w/2),y+h- 20) cv2.circle(img, center_coord, 5, (0,255,0), -1) img=cv2.resize(img,(450,800) cv2.imshow(cicle, img ) cv2.waitKey(0) print( center_coord)32/54目标位置 goal_d
21、etect(img)1.模板匹配(匹配小白点得到其坐标)2.假如匹配失败,利用边缘检测结果寻找物块上沿和下沿 从而求得目标方块中心点坐标33/54Canny边缘检测思想:经过求导和求梯度确定全部长得像“边缘”像素去掉最不像“边缘”像素区分强边缘(保留)和弱边缘(待定)使用Canny边缘检测时对图像预处理:使用高斯滤波器滤除噪声(导数对噪声非常敏感) 边缘检测:CV2.Canny34/54edge=cv2.Canny(image,threshold1,threshold2,edges,apertureSize,L2gradient)必要参数edges:输出边缘图,需要和源图片有一样尺寸和类型im
22、age:待处理图像thresh1和thresh2:分别为低阈值和高阈值,提议高低阈值之比为3:1到2:1之间可选参数aptertureSize:应用Sobel算子孔径大小,有默认值3L2gradient:计算图像梯度幅值标识,有默认值false边缘检测:CV2.Canny35/54注意:首先,因为Canny只能处理灰度图,所以将读取图像转成灰度图。GRAY_img=cv2.cvtColor(region,cv2.COLOR_BRG2GRAY) 并用高斯平滑处理原图像降噪。blurImg=cv2.GaussianBlur(img,(9,9),0)调用Canny函数,指定最大和最小阈值,其中ape
23、rtureSize默认为336/54模板匹配:是一项在一幅图像中寻找与另一幅模板图像最匹配(相同)部分技术。就是在整个图像区域发觉与给定子图像匹配那小块区域。工作方法:在待检测图像上,模板图像从左到右,从上向下逐一像素滑动,计算模板图像与重合子图像匹配度,匹配程度越大,二者相同可能性越大。对于 T 覆盖在 I 上每个位置,把度量值保留到结果图像矩阵 (R) 中,在 R 中每个位置 (x,y) 都包含匹配度量值。R 图像中最黑(0 1)或最白(2 3 4 5)(匹配方法不一样)位置代表最高匹配,红色框住位置很可能是结果图像矩阵中最大数值,所以这个区域 (以这个点为顶点,长宽和模板图像一样大小矩阵
24、) 被认为是匹配。模板匹配37/54匹配方法有:CV_TM_SQDIFF 平方差匹配法,最好匹配为0,值越大匹配越差CV_TM_SQDIFF_NORMED 归一化平方差匹配法CV_TM_CCORR 相关匹配法,采取乘法操作,数值越大表明匹配越好CV_TM_CCORR_NORMED 归一化相关匹配法 CV_TM_CCOEFF 相关系数匹配法,最好匹配为1,-1表示最差匹配CV_TM_CCOEFF_NORMED 归一化相关系数匹配法前面两种方法为越小值表示越匹配,后四种方法值越大越匹配。其实模板匹配使用和直方图反向投影calcBackProject函数很像,只是直方图反向投影对比是直方图,而模板匹
25、配对比是图像像素值,相比较而言,直方图反向投影匹配鲁棒性更加好。模板匹配38/541.切片操作(纵向和横向)region_upper=int(img.shape0*0.3)region_lower=int(img.shape0*0.6)if body_position0切片:矩阵第一维第400行到最终,结果是还一个图片,只是范围是第400行开始#forrowin小图片=一行一行读.一行1080个点以下表示:#r0,g0,b0,r1,g1,b1,.,Rn,Gn,Bn#n=1079,就是说有1079个点#读出来之后max(这一行点)#取最大点(Rn最大那个列表/数列)#得到Rk,Gk,Bk#第k行
26、maxRGB#np.nonzero()=非0元素坐标/索引;#np.nonzero()00#切片,!这个能够判断你图是个RGB三通道图片(或者通道3), 而非单通道灰度图.#第一个0,取出含有非0全部行(只要rgb一个0即可),#第二个0从非0全部行中取出第1个非0行#总结:从400行开始找到第一个满足条件行:这行有非0元素(只要有一个数字0就能够).x=int(np.mean(np.nonzero(canny_imgy)#canny_imgy取出那个非0行#R0,G0,B0,R1,G1,B1,.R799,G799,B799#在这一行中全部非0元素坐标平均值.#int()向下取整.比如:int
27、(1.9)=1.41/54:# 先尝试匹配截图中中心原点,# 假如匹配值没有到达0.95,则使用边缘检测匹配物块上沿res1 = cv2.matchTemplate(img_rgb, temp_white_circle, cv2.TM_CCOEFF_NORMED)min_val1, max_val1, min_loc1, max_loc1 = cv2.minMaxLoc(res1)if max_val1 0.95: print(found white circle!) x_center, y_center = max_loc10 + w2 / 2, max_loc11 + h2 / 2else
28、: # 边缘检测 img_rgb = cv2.GaussianBlur(img_rgb, (5, 5), 0) canny_img = cv2.Canny(img_rgb, 1, 10) H, W = canny_img.shape img_rgb, x_center, y_center = get_center(canny_img)42/54中心点标注:center_coord =(x_center, y_center)cv2.circle(img, center_coord, 10, (255,0,0), -1) 其中cv2.circle(img, center_coord, 5, (25
29、5,0,0), -1) 为绘制一个圆形 img:你想要绘制图形那幅图像 center_cood:圆心坐标 linetype:线条类型, 8 连接,抗锯齿等。默认情况是 8 连接 color:形状颜色。以 RGB 为例,opencv中为BGR需要传入一个元组,比如: (255,0,0)代表蓝色。对于灰度图只需要传入灰度值。 thickness:线条粗细。假如给一个闭合图形设置为 -1,那么这个图形就会被填充。默认值是 1.43/54def find_board(img,piece_x,piece_y): board_x = 0 board_y = 0 result = 0 img2 = img.
30、copy() method = cv2.TM_CCOEFF_NORMED img:170, = 0 for i in special_board: template = cv2.imread(i, 0) template_w, template_h = template.shape:-1 res = cv2.matchTemplate(img, template, meth) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) if max_val 0.99 and (max_loc1 + template_h / 2) 0.9: # board_x = max_loc0 + 22 # board_y = max_loc1 + 22 # result = 1 # print(white_point_val: %f % max_val) # return board_x, board_y, result for i in range(piece_y - 120, piece_y + 10): for j in range(piece_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吉祥图案在中国传统建筑上的应用分析研究 土木工程管理专业
- 小区工程维修管理办法
- 卫生洁具公司经营管理办法
- 2026年高职(工商管理)岗位技能测试试题及答案
- 2026年农业科技发展与乡村振兴考试卷
- 步行式插秧机无线遥控化设计:技术革新与应用探索
- 正像广视野玻璃体手术用眼底观察镜:从研制到临床应用的深度探索
- 欧菲光复合式股权激励对代理成本的影响剖析:基于理论与实践的双重视角
- 主题5 问题解决Solving Problems- 2026年初中英语中考主题作文满分训练
- 欧盟东扩背景下中国对欧盟直接投资产业结构的动态演变与策略优化
- 三一集团在线测试题库
- 四年级下册语文,第1单元和第2单元的小测试的卷子
- 中建集团海外市场开拓战略规划
- GB/T 338-2025工业用甲醇
- 财政部人社部就业补助资金管理办法2026版解读
- 吸塑厂生产安全管理制度
- 2025年医学影像复试题目及答案
- 无人机应用于施工巡检方案
- 洁净区化学品安全培训
- 羊水栓塞指南2025版
- 2025西部科学城重庆高新区招聘急需紧缺人才35人参考笔试题库及答案解析
评论
0/150
提交评论