计算机视觉大作业_第1页
计算机视觉大作业_第2页
计算机视觉大作业_第3页
计算机视觉大作业_第4页
计算机视觉大作业_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于OpenCV的切水果外挂设计第一章 引言1.1 背景在计算机视觉课程的前几课中,听覃老师说,曾经有个学长自己动手做了一个游戏的外挂,获得了很大的成功。跟人感觉这位学长能将自己所学与个人的技能相结合,成功的做出了实际的东西,着实厉害;同时这个过程将会对于个人的学习和成长都将有积极影响和意义。笔者在听了覃老师的介绍后,对于与计算机视觉相关的游戏外挂的设计产生了浓厚的兴趣。有考虑到笔者在外来两年内的研究方向都将图像处理或是计算机视觉,且近期笔者正在使用QT+OpenCV+OpenGL进行基于嵌入式Linux的图像处理和开发。所以笔者若选择一个类似的外挂程序的编写和设计,将对个人今后的学习有着积极

2、的意义。因此笔者在网上搜索了很多与图像处理有关网页游戏,如图1所示。笔者试玩了多种计算机视觉相关的游戏,并最终决定写一个切水果的游戏的外挂程序。 图 1 各种网页游戏 图2 各类切水果的游戏1.2 OpenCV简介OpenCV1的全称是:Open Source Computer Vision Library。OpenCV是一个基于(开源)发行的跨平台计算机视觉库, OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用,可以运行在Linux、Windows和Mac OS操作系统上。OpenCV库的所有代码都经过优化,计算效率很高,因为,它更专注于设计成

3、为一种用于实时系统的开源库。OpenCV采用C语言进行优化,而且,在多核机器上面,其运行速度会更快。它的一个目标是提供友好的机器视觉接口函数,从而使得复杂的机器视觉产品可以加速面世。该库包含了横跨工业产品检测、医学图像处理、安防、用户界面、摄像头标定、三维成像、机器视觉等领域的超过500个接口函数。近年来,在入侵检测、特定目标跟踪、目标检测、人脸检测、人脸识别、人脸跟踪等领域,OpenCV可谓大显身手,而这些,仅仅是其应用的冰山一角。本文便是通过在Visual Studio 2013平台下安装OpenCV,通过编写C+程序,并调用OpenCV计算机视觉和图像处理的API,对游戏中的图像进行处理

4、、识别,为程序的下一步操作提供基础。1.3游戏外挂简介游戏外挂2,其实是一种游戏外辅助程序,他可以协助玩家自动产生游戏动作、修改游戏网络数据包以及游戏内存数据等,以实现玩家用最少的时间和金钱完成功力升级和过关斩将。根据游戏的类型,游戏外挂可以大致分为两类:(1)将游戏中大量繁琐和无聊的攻击动作使用外挂自动完成,以帮助玩家轻松搞定攻击对象并可以跨度增加玩家的经验值,并取得更好的成绩。(2)由外挂程序产生的欺诈性的网络游戏封包,并将这些封包发送到网络游戏服务器,利用这些虚假的信息欺骗服务器进行游戏数值的修改,达到修改角色能力数值的目的。具体有可以分为模拟操作型、修改内存型、封包型等。本文所编写的既

5、是第一类游戏外挂。在切水果的游戏中,游戏玩家需要注意在页面底侧飞出来的各种水果和炸弹,在游戏的初期水果和炸弹飞出的速度较慢,玩家玩起来很轻松。伴随着游戏的进行,游戏的难度将增加,水果和炸弹的出现速度将越来越快。眼花缭乱的水果和炸弹不仅增加了游戏的难度,对于该类游戏的爱好者的视力也将有一定的损伤。因此,本文编写的外挂的目的既是自动识别水果和炸弹,并通过编写程序模拟鼠标操作,进而自动的完成大量的繁琐的切水果的操作。第二章 开发环境搭建笔者在开始安装OpenCV的过程3中,遇到了很多问题,浪费了一些时间。这里我给出一个简单的安装步骤。具体如下所示:Step 1、下载一个较新的OpenCV安装包。注意

6、:不要过新的OpenCV版本,笔者在开始时下载了最新的3.0版本的OpenCV,但是该版本与2.x版本的OpenCV有一定区别。网络上也没有相关的教程,因此浪费了些时间。笔者最终使用的是版本的OpenCV。Step 2、下载OpenCV后,双击运行exe,选择输出(解压)目录,我选择的是C:opencv。然后解压缩后就完成了整个安装。Step 3、配置OpenCV,这里是整个环境搭建的核心内容。Step 3.1在“我的电脑”右击弹出“系统属性”对话框,选择“高级”再点击“环境变量”,然后在“系统变量”中的Path对话框中输入:“;C:opencvopencvbuildx64vc12bin”;

7、具体如图3所示。图3 配置环境变量Step 3.2 打开项目的属性页面,单击“配置属性”,然后点击“VC+目录”,然后手动的加入库文件、引用文件和包含文件。具体操作如图4所示。图4 OpenCV 配置截图1Step 3.3 在已经打开的项目的属性页面中,点击“链接器”,然后点击“输入”,然后手动添加附加依赖项。具体操作如图5所示。图5 OpenCV 配置截图2至此,整个OpenCV环境已经搭建、配置完成。但仍需说明的是,在程序运行时,需要在工程的Debug目录下添加一些DLL文件。笔者为了方便,所以在该目录下添加了程序可能需要的OpenCV的全部DLL文件。具体如图6所示:图6 添加DLL文件

8、第三章 预分析与预处理3.1 游戏选择在确定游戏为“切水果”类型的之后,笔者试完了多个不同版本的切水果的游戏。通过试玩,笔者发现一部分游戏背景复杂,与传统的切水果游戏相差较大,需要处理内容较多,需要程序进行的控制,以及游戏策略均很复杂,这一类游戏如图7中的“切水果完美版”所示。 图7 切水果完美版 图8喜洋洋切水果还有一部分游戏,游戏开发者可能是为了开发速度,或是降低玩家的难度,不需要用鼠标滑过水果(可能是食物),只需要用鼠标左键点击食物的周围区域即可。这类游戏如图8中的“喜洋洋切水果”所示。通过试玩,笔者发现这一类游戏很容易“错切”。还有一部分游戏,与传统的切水果游戏很接近,水果飞出速度合理

9、,鼠标滑过水果后,屏幕出现划痕,切碎的水果自动掉落,如图9中的“简约切水果”所示。个人感觉这样的游戏,控制策略简单;需要的图像处理始终;需要识别的内容也叫简单。因此很适合笔者来写这第一个游戏外挂程序。 图 9简约切水果3.2 获取实验源图像确定具体游戏后,笔者编写了一个简单小程序。通过简单的人机交互,即可获得目标区域的图像,通过设置定时器时间,可以每个30ms读取一次屏幕中目标区域,并将目标区域图像保存至特定目录。本文中人机交互图片如图10所示,实验中保存了500张实验图片,其中部分实验图如图11所示。图 10 人机交互图图11 部分实验图3.3 背景减除考虑到实验图中背景单一不变,且游戏运行

10、开始时,游戏中并没有飞出任何水果或是炸弹。因此笔者多次调试程序,终于获得了背景图片,如图12所示。图12 游戏背景图片而后,笔者编写简单的背景减除代码,去掉了全部背景,结果如图13所示。图 14 背景减除后效果图3.4 颜色空间分析考虑到后期需要检测和识别水果、水渍、切过的水果和炸弹等。因此如果这些在颜色空间有不同的分布,那么便可选择一种对水果更加敏感的色彩空间来表示本文中的实验图像。接下来的处理过程复杂度将会大大减小。因此笔者简单学习了一下四种颜色模型4,5。(1)RGB颜色模型RGB(Red, Green, Blue)颜色模型是最常见的颜色模型,RGB描述的是红绿蓝三色光的数值。其中R代表

11、着Red红色,G代表着Green绿色,B代表这Blue蓝色。通过这3种基本的颜色不同组合,即可合成约1670万种颜色。(2)YUV颜色模型YUV颜色模型是视频中常采用的色彩表示方法,Y指颜色的亮度(Brightness),U和V是两个色差信号 。YUV颜色模型的亮度信号和色差信号U、V是分离的,可以单独处理。根据一个场景内色度总是基本一致且单一,即使是属于不同摄像头的相邻两帧,其色度也具有变化不大的特点。它和红、绿、蓝三色光的关系可用如下式的方程描述:Y=0.3R+0.59G+0.11B 这就是常用的亮度公式。色差U、V是由BY、RY按不同比例压缩而成的。(3)HSV颜色模型HSV (色相hu

12、e,饱和度saturation, 明度value), 也称HSB (B指brightness) 是艺术家们常用的,因为与加法减法混色的术语相比,使用色相,饱和度等概念描述色彩更自然直观。HSV 是RGB色彩空间的一种变形,它的内容与色彩尺度与其出处RGB色彩空间有密切联系。(4)HSL颜色模型HSL (色相hue, 饱和度saturation,亮度lightness/luminance), 也称HLS 或 HSI (I指intensity) 与 HSV非常相似,仅用亮度(lightness)替代了明度(brightness)。二者区别在于,一种纯色的明度等于白色的明度,而纯色的亮度等于中度灰的

13、亮度。由于以上颜色模型均很常见,所以各个颜色模型间的转换关系这里就不一一列出了。同时为了更加清晰了解每个色彩模型对本实验中图像的敏感程度,笔者手动合成了一张几乎包含所有可能出现的图形的图片,如图15所示。而后笔者通过MATLAB展示了图15在RGB、YUV、HSV、HIS四种颜色模型中的具体表现效果,分别如图16(a)、图16(b)、图16(c)、图16(d)所示。图15 合成图片(a) RGB颜色空间显示效果(b) YUV颜色空间显示效果(c) HSV颜色空间显示效果(d) HSI颜色空间显示效果图16 不同颜色空间的显示效果对比图色彩空间分析比较:通过分析比较,可以发现切过的水果和未切的水

14、果,在不同的模型和分量下,显示效果相近,并未出现对某个特定的颜色空间特别敏感这一现象。有考虑到,数据读入时便是RGB形式,如果采用其他颜色空间还需要再次进行转换,无疑增加了计算量。因此笔者采用的是RGB颜色模型。因为RGB颜色模型中,B分量与背景差异最大,因此选用该分量进行后续的处理。3.5 目标区域下采样考虑到本文所写程序为游戏外挂,因此游戏的处理时间越短越好。因此本文从每个角度上考虑,以尽可能的减少程序占用的资源与运行时间,因此本文首先将目标区域中的1/2作为最终的目标区域,如图17中红框内的图像所示,此时图像的分辨率为760*200,数据量为760*400*3=912000 Bytes=

15、890.6KB。因此,笔者在此将图像下采样处理,图像依旧保留原来的特征,而且最终图像的分辨率为380*100,数据量变为原目标区域的1/4大小,一定程度上减少了处理内容,提高了程序运行速度。最终图像下采样后的图像如图18所示。图17 缩小后的目标区域示意图图18 下采样后图像示意图3.6 中值滤波中值滤波6是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声

16、点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=medf(x-k,y-l),(k,lW) ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为3*3,5*5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。考虑到图像减除背景后,其B分量图像中存在少量白色噪声点,在后期的处理中会在一定程度上影响处理效果,因此本文采用中值滤波方法对图像进行铝箔处理。原图像与处理后的图像如图19和图20所示。图19 B分量原始图图20 中值滤波后图像3.7膨胀与腐蚀通过观察,发现如

17、果图像中出现水渍的话,那么会有很多的小的轮廓出现。后续的计算中,这些小的水渍也将增加计算的时间。因此笔者采用膨胀和腐蚀处理方法对图像进行处理。需要说明的是:OpenCV中膨胀和腐蚀均是针对白色区域进行的。本文中原始图像、腐蚀之后的图像、膨胀之后的图像如图21所示。(a)原始图像 (b)腐蚀之后的图像(c)膨胀之后的图像图21 膨胀与腐蚀操作示意图通过对比可以发现,最后经过膨胀处理后,图像中较小的水渍几乎都已经被处理掉了,效果很好。第四章 检测与识别在基本的图像预处理之后,已经获得了较好的待处理图像。因此笔者开始着手目标的检测与识别工作。笔者选择了一些常见的方法,对图像中的未切水果、非未切水果和

18、炸弹进行检测和识别。4.1霍夫变换检测圆霍夫变换简介:计算机视觉中经常需要识别或者定位某些几何图形,比如直线、圆、椭圆,还有其他一些图形。检测直线的霍夫变换提供了在图像中寻找直线的一种算法,是最简单的一种情形,后来发展到检测圆、椭圆、还有一般图形的霍夫变换,其核心思想是把图像中属于某种图形的点集(二维)映射到一个点(可以是高维)上,这个点记录了点集中点的数目,使得程序通过搜索峰值找到该点,这个点就是后面要说到的图形的参数,而该参数的范围就叫做参数空间。霍夫变换检测圆的原理这里不再赘述,如有需要请参考文献8。另外对于OpenCV下该函数原型,以及各项参数的含义这里也不再给出,如有需要请参考文献9

19、。笔者在用该函数进行识别时发现,检测效果与参数设置有很大的关系,经常会出现错误检测和漏检。错检的示意图如图22所示。通过多次尝试,笔者发现该方法错误率和漏检率太高,难以应用于本文的应用。图22 霍夫变换检测圆示意图4.2 边缘检测图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。有许多方法用于边缘检测,它们的绝大部分可以划分为两类:基于查找一类和基于零穿越的一类。基于查找的方法通过寻找图像一阶导数中的最大和最小值来检测边界,通常是将边界定位在梯度最大的方向。基于零穿越的方法通过寻找图像二阶导数零穿越来寻找边界,通常是Laplacian过零点或者非线性差

20、分表示的过零点。本文采用的是OpenCV自带函数 cvCanny(),函数 cvCanny 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘。函数的参数这里同样不予给出,如有需要请参考文献10。边缘检测的示意图如图23所示。 (a) 边缘检测示意图1 (b) 边缘检测示意图2图22 边缘检测示意图4.3 轮廓周长与面积约束边缘检测后,笔者发现一些边缘的轮廓很长,有一些很多;有些轮廓的面积很大,有些则很小;而这些都不是未切的水果。而在笔者查找资料的过程中发现,OpenCV中自带检测轮廓面积和周长的函数,因此笔者调用函数去除掉了这些周长和面积不符合要求的轮廓。实际绘制后,目标的

21、轮廓为多边形。这对于后期的再次处理有一定的影响,因此,笔者根据轮廓的位置,对目标在此处理用矩形框框住目标轮廓。实验结果示意图如图24所示。有本图可以看出,本文的处理时间基本满足实时性的需要,单帧处理时间为25ms左右。图 24 轮廓约束并外接矩形框示意图 4.4保留检测出的样本为了更好地分析,不同的目标之间的区别与识别,笔者编写了一个简单的小程序,保存了300张目标图像。如图25所示。图25 目标图像示意图4.5 样本分类为了找出不同的目标图像之间的区别,笔者计算了各个目标矩形框的内图像的像素差值的均值和均方差,甚至还计算了目标图像的频谱信息。但是都没有找到明显的区别。当然,全黑的炸弹可以非常

22、轻松的识别出来。本文还通过MATLAB的imtool()工具详细观察了图像上的每一个像素值,其示意图如图26所示。图26 查看图像的像素值示意图4.6 颜色对比通过多种方法,依旧没有去除掉已经切过的水果,因此笔者编写了一段小程序,检测图像中出现的特殊颜色,如图27中的红色。检测到特殊颜色后即标记这个目标区域为已经切过的水果,不再此切割。最终去除掉了已经切过的西瓜、划痕、切过的梨子等。图27中最右侧对比图中的白色区域为检测到的红色,本文的程序即是根据这些白点的多少判断是否为未切水果。图27 颜色对比排除示意图第五章 C+程序模拟鼠标操作接下来,笔者学习了如何通过编写程序来模拟鼠标11的一系列动作。包括鼠标的单击和左键按住滑动(切水果时的动作)。虽然笔者研究了很长时间的C+模拟鼠标的操作,也查找了很多的参考资料,但是,可能是由于笔者接触Windows编程较少,仅仅实现了鼠标的单击操作。未能实现鼠标的拖动操作。因此也导致最终本文未能完成预期的设计。图28 模拟鼠标操作函数第六章 总结本文,使用了多种图像处理的方法,对于游戏中的动画图像进行了大量的处理。最终成功的识别出了未切水果,当然其中包含少量的已经切过的水果。但是由于

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论