完整word版详细设计说明书_第1页
完整word版详细设计说明书_第2页
完整word版详细设计说明书_第3页
完整word版详细设计说明书_第4页
完整word版详细设计说明书_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

1、详细设计文档1疲劳驾驶检测系统2015年3月13日详细设计文档目录引言31.1编写目的31.2背景31.3定义31.4参考资料4程序系统的结构4详细设计63.1程序简单描述73.2整体结构73.3性能73.4输入输出项83.5算法83.5.1人脸检测算法83.5.2 OTUS最佳阈值图像分割法93.5.3 ROBERT CROSS 边缘检测93.6主要类的说明以及XML配置文件103.7存储分配163.8注释16测试计划3.9仃1.2.3.173.10尚未解决的问题2详细设计文档1. 引言1.1 编写目的此说明书在概要设计的基础上,对基于人眼的疲劳检测终端各个模 块,程序分别进行了实现层面上的

2、要求和说明。 在以下的详细设计报告中 将对在本阶段中队系统所做的所有详细设计进行说明。主要工作包括:根据软件需求说明书所描述的数据,功能,运行,性能,需求,并依照概要设计说明书所确定的处理流程、总体设计、软件系 统的结构设计,逐个模块的程序描述(包括各模块的功能、性能、输入、 输出、算法、程序逻辑、接口等)。软件开发小组的产品实现成员 应该阅读和参考此说明书,从而进行代码的编写,测试。1.2背景21说明:待开发系统的名称:不规范驾驶检测系统 开发者:孙艳强 陈浩 倪四飞用户:驾驶员或者是汽车厂商以及交通管理部门1.3C、项目开发背景:学生工程实践选题定义1、an droid-o pen cv这

3、是一个在an droid操作系统上的 Opencv开源库,本系统的开发中用到了该库,加快了开发的效率,降低了开发成本。2、系统:待开发的不规范驾驶检测系统1.4参考资料软件工程概论软件文档编写android应用程序设计java基础opencv教程an dorid-opencv手册一网页版2. 程序系统的结构本待开发的系统采用的软件层次框图如下图所示:在前期的方案确定的时候,采用的是基于an droid操作系统的OpencV开源库,因此只需要将编译好的 OpenCV库导入到开发环境中即可进行开发,因此本系统的主要开发工作集中在应用程序的设计部分。在项目的概要设计中,确定的具体的软件的主流程方案如

4、下图所示。开始*打开摄像头没达到有摄像头状态分析计数超出阈值Sr给予警示结束否=二在人眼状态的判断过程中具体的步骤如下图所示。人脸检测人脸定位二值化边缘检测闭合3. 详细设计为了完成系统所需要的功能,我们设计了一个类来实现:FdActivity说明如下:FdActivity:该类是作为程序的主界面类,在该类中,将surfaceview占据了整个界面,在该类中主要重写了On Created 、OnPause()、onCameraViewStopped() 、onDestroyO 、OnCameraViewStartedQOn CameraFrame()On Create Op tio nsMe

5、nu()OnOp ti on sltemSelected()函数具体的分析参见程序的具体描述部分;bnCameraFrame()函数:在系统实时监测驾驶员的头像数据的时候,需要显示当前的帧率,该类就是负责帧率的显示的类,该类中,主要是实现了以下的几个功能:从一帧图片中计算人眼的区域 绘制人眼的区域3.1 程序简单描述打开摄像头,实时采集脸部的帧数据,图像进行灰度变化,首先进行预处理,将背景噪声以及图像中的突刺变化去除, 防止影响后面的图形计 算精度;利用Opencv中的已有函数接口进行人脸和人眼的定位,在将人眼的轮廓提取出来,这里面的用的方法:Otus和Robert Cross边缘检测。利用最

6、大垂直距离进行是否闭合的判定, 组后再利用PERCLOS原理进行 疲劳状态的判断。3.2整体结构见概要设计说明书3.3 性能实时性:能基本实现实时性的要求对人脸的判断准确度:95%以上眼睛的判断准确度:90%以上疲劳识别:80%以上3.4输入输出项输入的数据是:摄像头采集的实时数据输出是:预警声音3.5 算法3.5.1人脸检测算法传统的检测人脸分方法有很多种:基于肤色的分离、基于统计模型、 或者是PCA方法,但是这些方法识别的时间较长,并且准确率不高,在 本文中,采用的是 OpenCV中非常成功的基于 Haar-Like特征的Adaboost算法。人脸检测分成两步:首先是训练过程产生分类器文件

7、,再是利用 分类器进行人脸检测过程 。训练过程:(1)准备正负样本,正样本是 需要检测的目标(正脸),负样本是不含正样本特征的任何目标 ;(2)利用CreatSample程序准备正样本集;(3)利用Haar-Training程序训练得到 分类器特征xml文件。检测过程:利用an droid-OpenCV中的分类器构建函数去加载该特征xml文件,利用分类器本身的成员函数4,5:detectMultiScale(Mat image, List objects, double scaleFactor, int mi nN eighbors, i nt flags, Size mi nSize)对指定

8、的 image 进行检测。其函数各 参数的意义:Image:需要进行目标检测的区域.Object:将检测到的目标标记在矩形框中.scaleFactor:代表图像的缩放因子.Minn eighbors :指定每个候选矩阵至少包含的邻近元素个数Flag:标志位,默认为0.Min size :最小的检测窗口,如果该值设置过小,将会导致图像的计 算量较大。3.5.2 Otus最佳阈值图像分割法当系统成功标记处人眼部的区域后, 需要进行二值化处理,从而实现 眼部提取。但是由于图像的灰度值对光线很敏感, 固定的阈值势必无法满 足要求,本文采用的是基于 Otsu算法的二值化处理。Otsu算法,又被称为最大类

9、间法,是一种自适应的图像分割技术, 它是根据最小二乘原理推导出来的,根据光线强度的不同,阈值会随之变 化,能得到最优的阈值,其基本原理如下:将直方图在某一阈值进行分 割成两组,称为“前景”和“背景”,当被分成的两组的方差最大时候, 该阈值就是最佳分割阈值。方差是灰度均匀分布的一种度量,值越大,说 明构成图像两部分的差别越大,当部分“前景”错分为“背景”或者“背 景”错分为“前景”的时候,都会导致方差变小,因此最大类间法意味着 错分的概率最小。对于图像直方图,不妨假设其灰度级为0m,像素点个数为N,针对某一个分割阈值t,那么整个图像被分割成两部分,0t 称为“前景”,而t+1m称为“背景”。“前

10、景”的权重为 Wf,均值设 为Mf,方差为Df,“背景”的权重为 Wb,均值设为Mb,方差为Db。 图像的整体的方差公式如式 3所式。D Wf*Df Wb* Db(3)Otsu的最终目的就是要求出D的最大值来,从而得到最优的分割阈值。3.5.3 Robert Cross 边缘检测边缘是图像灰度值变化剧烈的位置,因此包含了大量的有用信息,常 用的边缘检测包含很多,比如:Robert Cross边缘检测,Canny边缘检测, Prewitt边缘检测,Sobel检测。但是这些方法中唯有 Robert Cross计算方 便简单、快速,容易在实时系统中实现,本系统中采用的就是该检测方法, 根据任意一对互

11、相垂直方向上像素点的差分来计算梯度的原理8,9,采用对角线方向相邻像素灰度差。如式4所示:G(i, j)=|f(i, j)-f(i +1,j+1)| +|f(i +1,j)-f(i, j + 1)|G代表的是计算之后的灰度值,而 f代表的是原始图像的灰度值。虽然Robert检测速度很快,但是其缺点也是很明显的,对噪声敏感,并且边缘不是很光滑。3.6主要类的说明以及 xml配置文件在上面的概述中,我们初步说明了在该系统的实现过程中需要实现的几个类。在这里我们详细的说明。/思路:详细写出每个类的每个函数接口的作用以及用法FdActivity :继承Activity,实现了整个应用程序的界面,在该类

12、中主要是定义了两个菜单选项,分别是mltemFace5Q mltemFace40,这是选择图像的范围的两个选项,分别对应着 50%和40%。重写on Create函数,将fdview作为界面加载的部分。重写on Create Op tio nsMe nu ()函数,将两个菜单选项加入到菜单中;重写onOptionsItemSelected函数,当在屏幕上点击对应的item时,将会 自动进行item的选择;In it函数接口是用来进行帧率计算的初始化函数,在该函数中主要实现获取当前的时间-getTickFrequency,以及初始化绘制的文字的颜色信息(blue)以及大小(50)MeasureO

13、函数是计算帧率的主要函数,获得当前的时间,减去在in it函数中的初始时间,获得这段图像处理的时间,帧率的计算如下:double fps = ste p * freq / (time - p revFrameTime)再将其按照固定的格式进行输出:DecimalFormat(0.00);Draw函数:就是指在画布上进行绘制的函数: canv as.drawText(strfps, 20 + offsetx, 10 + 50 + offsety, paint)抽象基类MyCvViewBase的设计:这个类主要是为了下面的的具体的fdview类服务的,在该类中,我们 是实现了 surfacehol

14、der.callback的接口以及run able接口,这样该类就可以作为一个单独的线程去运行了,从而实现了多线程的功能。在该类的构造函数MyCvViewBase中,我们需要获得holder添加callback接口,进行FpsMeter的构建。因为是实现了 surfaceholder.callback的接口,因此需要重写三个函数,分另U是 surfacecreated surfacechanged surfacedestroyed三个函数中分别要实现的功能:Surfacecreated(这个是在surface刚建立的时候就调用回调函数,在这个函数中,我们需要打开摄像头,在 Android-Op

15、enCV中,打开摄像头的接口的函数为 mCamera二VideoCa pture(ighgui.CV_CAP_ANDROID),检查是否打开,如果已经打开了,那么如下安排:(new Thread(this).start();否则的话直接release掉camara。SurfacechagecK)函数,是在surfacecreated回调之后进行第一次调用,在这里我们主要是获得摄像头支持的size,然后我们不断选择最优的预览size,(这部分代码是在网上参考的)。将camara的设置成为: mCamera.set(Highgui.CV_CAP_ PROP_FRAME_WIDTH, mFrameW

16、idth);mCamera.set(Highgui.CV_CAP_ PROP_FRAME_HEIGHT, mFrameHeight);surfaceDestroyed(回调函数,就是当surface消失的时候进行回调的,因此,这里面我们需要做一些资源的释放的操作,比如说camera释放。作为抽象的基类,我们为子类提供的接口是:P rotected abstract Bitma p p rocessFrame(i nt flag, VideoCa pture cap ture);该接口在子类中进行图像处理时详细的设计。(参见Fdview设计)我们在该抽象基类中实现了 runnable接口,因此还

17、需要实现run函数;首先需要完成对计量帧率的对象的初始化工作。F面的就是不断的while循环,进行图像的处理工作:首先从摄像头中回去实时的数据帧,该部分的接口是:mCamera.grab(),mCameras是上面打开的摄像头然后进行图像的处理processFrame,返回bmp对象,进行帧率的计量,锁住画布 -mHolder.lockCanvas(),进行绘画,解锁画布。Bmp图像的回收。Fdview类的设计:该类主要是继承了抽象基类 MyCvViewBase,因此主要在这一部分中,需要实现的接口函数,P rotected Bitma p p rocessFrame(i nt flag, V

18、ideoCa pture cap ture)构造函数中需要实现的是:获取xml文件资源con text.getResources().o pen RawResource(R.raw.haarcascade_fr on talface_alt);进行xml文件的读写,利用该xml文件进行分类器对象的初始化,分类器对象在OpenCV中是实现目标检测的对象,是由特征文件xml进行构造的。在该软件中需要定位人脸,人嘴和人眼,因此需要以下几个xml分U 是 :haarcascade frontalface alt.xmlhaarcascade mcs mouth.xmlhaarcascade_right

19、eye_2s plits.xml ,haarcascade_lefteye_2splits.xml;件,识别率高达 95%以上,是 OpenCV 中自带的已经训练好的分类器特征文件。重写surfacechanged(函数,主要是初始化了 mat数据,mat可以看成是二维的保存图像的矩阵,是 OpenCV中自带的数据格式。实现ProcessFrame接口函数,在该部分主要是关于图像处理的接口函数,是整个软件的核心函数:首先是解析出摄像头的RGB以及灰度图像格式:cap ture.retrieve(mRgba,Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);cap

20、 ture.retrieve(mGray,Highgui.CV_CAP_ANDROID_GREY_FRAME);进行预处理过程:主要是进行直方图的均衡化过程,OpenCV自带接口:Imgp roc.equalizeHistO;利用 OpenCV中自带的目标识别的函数 mCascade.detectMultiScale说明:mCascade是人脸的分类器对象进行图像中目标的检测,我们首先需要定位到人脸部,并且将人脸在图像中标记出来。(绿色的标记)如果人脸不是空的,那么开始将人脸设置成为感兴趣区域,在该区域中进行人眼的检测,同样的还是有eyedectcade.detectMultiScale()说

21、明:eyedetectcade是人眼的分类器对象,如果眼睛找到了,我们将其中一只眼睛标记出来,用来进行图像处理,因为基本而言,人眼都是堆对称的,一只眼睛的状态可以代表人眼目前的状态,将该区域进行Otsu二值化处理,以及Robert Cross或者是canny边缘检测来提取人眼的轮廓,canny在OpenCV中已经有固定的接口,而 Otsu和Robert Cross检测需要自己去实现。子啊利用最大的垂直距离进行扫描,当最大的垂直距离小于40%的标记咼度的时候判断是闭合状态。附上关于Otsu以及Robert Cross边缘检测的代码:public Mat Robert(Mat mat) robbe

22、rtNum = 0; row = mat.rowsO; col = mat.cols();(int i = 1; i row - 1; i+) for ( int j = 1; j 50) mat .pu t(i, j, 255);/robert cross边缘检测代码intintintfor else mat. put(i, j, 0);return mat;public int Otsu(Mat mat) int for/Otsu算法实现: histData = new int 256;(int i = 0; i 256; i+) histDatai = 0;/ 初始化为 0值 inttotal = mat.cols() * mat.rows();for(int i = 0; i mat.rows(); i+) (int j = 0; j mat.cols(); j+) int temp = ( int ) mat.get(i, j)0;forhistDatate mp +;doublefor ( int t = 0; t 256; t+) sum

温馨提示

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

评论

0/150

提交评论