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

下载本文档

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

文档简介

疲劳驾驶检测系统 详细设计详细设计说明书说明书 2015 年 3 月 13 日 目录目录 1. 引言.2 1.1 编写目的.2 1.2 背景.3 1.3 定义.3 1.4 参考资料.3 2. 程序系统的结构.4 3. 详细设计.6 3.1 程序简单描述.6 3.2 整体结构.7 3.3 性能.7 3.4 输入输出项.7 3.5 算法.7 3.5.1 人脸检测算法.7 3.5.2 OTUS 最佳阈值图像分割法.8 3.5.3 ROBERT CROSS 边缘检测.9 3.6 主要类的说明以及 XML 配置文件.9 3.7 存储分配.14 3.8 注释.14 3.9 测试计划.14 3.10 尚未解决的问题.14 1. 引言引言 1.1编写目的编写目的 此说明书在概要设计的基础上,对基于人眼的疲劳检测终端各个模 块,程序分别进行了实现层面上的要求和说明。在以下的详细设计报告 中将对在本阶段中队系统所做的所有详细设计进行说明。 主要工作包括:根据软件需求说明书所描述的数据,功能,运行,性 能,需求,并依照概要设计说明书所确定的处理流程、总体设计、软件 系统的结构设计,逐个模块的程序描述(包括各模块的功能、性能、输 入、输出、算法、程序逻辑、接口等) 。 软件开发小组的产品实现成员 应该阅读和参考此说明书,从而进行 代码的编写,测试。 1.2背景背景 说明: A、 待开发系统的名称:不规范驾驶检测系统 B、 开发者:孙艳强 陈浩 倪四飞 用户:驾驶员或者是汽车厂商以及交通管理部门 C、项目开发背景:学生工程实践选题 定义定义 1、 android-opencv:这是一个在 android 操作系统上的 Opencv 开源库, 本系统的开发中用到了该库,加快了开发的效率,降低了开发成本。 2、 系统:待开发的不规范驾驶检测系统 参考资料参考资料 软件工程概论 软件文档编写 android 应用程序设计 java 基础 opencv 教程 andorid-opencv 手册网页版 2. 程序系统的结构程序系统的结构 本待开发的系统采用的软件层次框图如下图所示: 在前期的方案确定的时候,采用的是基于 android 操作系统的 OpencV 开源库,因此只需要将编译好的 OpenCV 库导入到开发环境中 即可进行开发,因此本系统的主要开发工作集中在应用程序的设计部分。 Android 应用程序 Android-OpenCV 库 Android OS 硬件平台 在项目的概要设计中,确定的具体的软件的主流程方案如下图所示。 状态分析 有 超出阈值 没达到 达到 是 否 获取一帧图像 图像预处理 人脸定位 人眼和嘴巴定位 给予警示 结束 计数 开始 有摄像头 打开摄像头 在人眼状态的判断过程中具体的步骤如下图所示。 3. 详细设计详细设计 为了完成系统所需要的功能,我们设计了一个类来实现: FdActivity 说明如下: FdActivity:该类是作为程序的主界面类,在该类中,将 surfaceview 占据了整个界面,在该类中主要重写了 onCreate()、 onPause()、onDestroy()、onCameraViewStarted()、 onCameraViewStopped()、onCameraFrame()、 onCreateOptionsMenu()、onOptionsItemSelected()、 函数具体的分析参见程序的具体描述部分; onCameraFrame()函数:在系统实时监测驾驶员的头像数据的时候,需 人脸检测 人脸定位 二值化 边缘检测 闭合 要显示当前的帧率,该类就是负责帧率的显示的类,该类中,主要是实 现了以下的几个功能: 从一帧图片中计算人眼的区域 绘制人眼的区域 3.1程序程序简单简单描述描述 打开摄像头,实时采集脸部的帧数据,图像进行灰度变化,首先进行 预处理,将背景噪声以及图像中的突刺变化去除,防止影响后面的图形 计算精度;利用 Opencv 中的已有函数接口进行人脸和人眼的定位,在 将人眼的轮廓提取出来,这里面的用的方法:Otus 和 Robert Cross 边缘 检测。利用最大垂直距离进行是否闭合的判定,组后再利用 PERCLOS 原理进行疲劳状态的判断。 3.2整体结构整体结构 见概要设计说明书 3.3性能性能 实时性:能基本实现实时性的要求 对人脸的判断准确度:95%以上 眼睛的判断准确度:90%以上 疲劳识别:80%以上 3.4输入输出项输入输出项 输入的数据是:摄像头采集的实时数据 输出是:预警声音 3.5算法算法 人脸检测算法人脸检测算法 传统的检测人脸分方法有很多种:基于肤色的分离、基于统计模型、 或者是 PCA 方法,但是这些方法识别的时间较长,并且准确率不高,在 本文中,采用的是 OpenCV 中非常成功的基于 Haar-Like 特征的 Adaboost 算法。人脸检测分成两步:首先是训练过程产生分类器文件, 再是利用分类器进行人脸检测过程4。训练过程:(1)准备正负样本, 正样本是需要检测的目标(正脸) ,负样本是不含正样本特征的任何目标; (2)利用 CreatSample 程序准备正样本集;(3)利用 Haar-Training 程序 训练得到分类器特征 xml 文件。检测过程:利用 android-OpenCV 中的分 类器构建函数去加载该特征 xml 文件,利用分类器本身的成员函数4,5: detectMultiScale(Mat image,List objects, double scaleFactor, int minNeighbors, int flags, Size minSize)对指定的 image 进行检测。其函数各 参数的意义: Image:需要进行目标检测的区域. Object:将检测到的目标标记在矩形框中. scaleFactor:代表图像的缩放因子. Minneighbors:指定每个候选矩阵至少包含的邻近元素个数. Flag:标志位,默认为 0. Minsize:最小的检测窗口,如果该值设置过小,将会导致图像的计 算量较大。 Otus 最佳阈值图像分割法最佳阈值图像分割法 当系统成功标记处人眼部的区域后,需要进行二值化处理,从而实 现眼部提取。但是由于图像的灰度值对光线很敏感,固定的阈值势必无 法满足要求,本文采用的是基于 Otsu 算法的二值化处理。 Otsu 算法,又被称为最大类间法,是一种自适应的图像分割技术, 它是根据最小二乘原理推导出来的,根据光线强度的不同,阈值会随之 变化,能得到最优的阈值7,其基本原理如下:将直方图在某一阈值进 行分割成两组,称为“前景”和“背景”,当被分成的两组的方差最大 时候,该阈值就是最佳分割阈值。方差是灰度均匀分布的一种度量,值 越大,说明构成图像两部分的差别越大,当部分“前景”错分为“背景” 或者“背景”错分为“前景”的时候,都会导致方差变小,因此最大类 间法意味着错分的概率最小。对于图像直方图,不妨假设其灰度级为 0m,像素点个数为 N,针对某一个分割阈值 t,那么整个图像被分割成 两部分,0t 称为“前景”,而 t+1m 称为“背景”。“前景”的权重 为 Wf,均值设为 Mf,方差为 Df,“背景”的权重为 Wb,均值设为 Mb,方差为 Db。图像的整体的方差公式如式 3 所式。 (3) bbff DWDWD* Otsu 的最终目的就是要求出 D 的最大值来,从而得到最优的分割阈 值。 Robert Cross 边缘检测边缘检测 边缘是图像灰度值变化剧烈的位置,因此包含了大量的有用信息, 常用的边缘检测包含很多,比如:Robert Cross 边缘检测,Canny 边缘检 测,Prewitt 边缘检测,Sobel 检测。但是这些方法中唯有 Robert Cross 计 算方便简单、快速,容易在实时系统中实现,本系统中采用的就是该检 测方法,根据任意一对互相垂直方向上像素点的差分来计算梯度的原理 8,9,采用对角线方向相邻像素灰度差。如式 4 所示: (4) |1)+jf(i, - j)1,+f(i| + |1)+j1,+f(i - j)f(i,| = j)G(i, G 代表的是计算之后的灰度值,而 f 代表的是原始图像的灰度值。虽然 Robert 检测速度很快,但是其缺点也是很明显的,对噪声敏感,并且边 缘不是很光滑。 3.6主要类的主要类的说明以及说明以及 xml 配置文件配置文件 在上面的概述中,我们初步说明了在该系统的实现过程中需要实现的 几个类。在这里我们详细的说明。 /思路:详细写出每个类的每个函数接口的作用以及用法 FdActivity:继承 Activity,实现了整个应用程序的界面,在该类中主要 是定义了两个菜单选项,分别是 mItemFace50,mItemFace40,这是选择 图像的范围的两个选项,分别对应着 50%和 40%。 重写 onCreate 函数,将 fdview 作为界面加载的部分。 重写 onCreateOptionsMenu()函数,将两个菜单选项加入到菜单中; 重写 onOptionsItemSelected 函数,当在屏幕上点击对应的 item 时,将会 自动进行 item 的选择; Init 函数接口是用来进行帧率计算的初始化函数,在该函数中主要实 现获取当前的时间-getTickFrequency,以及初始化绘制的文字的颜色信 息(blue)以及大小(50) Measure()函数是计算帧率的主要函数,获得当前的时间,减去在 init 函 数中的初始时间,获得这段图像处理的时间,帧率的计算如下: double fps = step * freq / (time - prevFrameTime) 再将其按照固定的格式进行输出:DecimalFormat(0.00); Draw 函数:就是指在画布上进行绘制的函数: canvas.drawText(strfps, 20 + offsetx, 10 + 50 + offsety, paint) 抽象基类 MyCvViewBase 的设计: 这个类主要是为了下面的的具体的 fdview 类服务的,在该类中,我 们是实现了 surfaceholder.callback 的接口以及 runable 接口,这样该类就 可以作为一个单独的线程去运行了,从而实现了多线程的功能。 在该类的构造函数 MyCvViewBase 中,我们需要获得 holder,添加 callback 接口,进行 FpsMeter 的构建。 因为是实现了 surfaceholder.callback 的接口,因此需要重写三个函数, 分别是 surfacecreated,surfacechanged,surfacedestroyed。 三个函数中分别要实现的功能: Surfacecreated()这个是在 surface 刚建立的时候就调用回调函数,在这 个函数中,我们需要打开摄像头,在 Android-OpenCV 中,打开摄像头 的接口的函数为 mCamera=VideoCapture(ighgui.CV_CAP_ANDROID),检 查是否打开,如果已经打开了,那么如下安排: (new Thread(this).start(); 否则的话直接 release 掉 camara。 Surfacechaged()函数,是在 surfacecreated 回调之后进行第一次调 用,在这里我们主要是获得摄像头支持的 size,然后我们不断选择最优 的预览 size, (这部分代码是在网上参考的) 。将 camara 的设置成为: mCamera.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, mFrameWidth); mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight); surfaceDestroyed()回调函数,就是当 surface 消失的时候进行回调的, 因此,这里面我们需要做一些资源的释放的操作,比如说 camera 释放。 作为抽象的基类,我们为子类提供的接口是: protected abstract Bitmap processFrame(int flag, VideoCapture capture); 该接口在子类中进行图像处理时详细的设计。 (参见 Fdview 设计) 我们在该抽象基类中实现了 runnable 接口,因此还需要实现 run 函数; 首先需要完成对计量帧率的对象的初始化工作。 下面的就是不断的 while 循环,进行图像的处理工作: 首先从摄像头中回去实时的数据帧,该部分的接口是:mCamera.grab(), mCameras 是上面打开的摄像头然后进行图像的处理 processFrame,返 回 bmp 对象,进行帧率的计量,锁住画布-mHolder.lockCanvas(),进行 绘画,解锁画布。Bmp 图像的回收。 Fdview 类的设计: 该类主要是继承了抽象基类 MyCvViewBase,因此主要在这一部分中, 需要实现的接口函数, protected Bitmap processFrame(int flag, VideoCapture capture) 构造函数中需要实现的是:获取 xml 文件资源 context.getResources(). openRawResource(R.raw.haarcascade_frontalface_alt);进行 xml 文件的读写, 利用该 xml 文件进行分类器对象的初始化,分类器对象在 OpenCV 中是 实现目标检测的对象,是由特征文件 xml 进行构造的。在该软件中需要 定位人脸,人嘴和人眼,因此需要以下几个 xml 文件,分别是: haarcascade_frontalface_alt.xml 以及 haarcascade_mcs_mouth.xml,haarcascade_righteye_2splits.xml,haarcasca de_lefteye_2splits.xml 文件,识别率高达 95%以上,是 OpenCV 中自带的 已经训练好的分类器特征文件。 重写 surfacechanged()函数,主要是初始化了 mat 数据,mat 可以看成是 二维的保存图像的矩阵,是 OpenCV 中自带的数据格式。 实现 processFrame 接口函数,在该部分主要是关于图像处理的接口函数, 是整个软件的核心函数: 首先是解析出摄像头的 RGB 以及灰度图像格式: capture.retrieve(mRgba,Highgui.CV_CAP_ANDROID_COLOR_FRAM E_RGBA); capture.retrieve(mGray,Highgui.CV_CAP_ANDROID_GREY_FRAME); 进行预处理过程:主要是进行直方图的均衡化过程,OpenCV 自带接口: Imgproc.equalizeHist(); 利用 OpenCV 中自带的目标识别的函数 mCascade.detectMultiScale说 明:mCascade 是人脸的分类器对象进行图像中目标的检测,我们首先 需要定位到人脸部,并且将人脸在图像中标记出来。 (绿色的标记) 如果人脸不是空的,那么开始将人脸设置成为感兴趣区域,在该区域 中进行人眼的检测, ,同样的还是有 eyedectcade.detectMultiScale()说 明:eyedetectcade 是人眼的分类器对象,如果眼睛找到了,我们将其中 一只眼睛标记出来,用来进行图像处理,因为基本而言,人眼都是堆对 称的,一只眼睛的状态可以代表人眼目前的状态,将该区域进行 Otsu 二 值化处理,以及 Robert Cross 或者是 canny 边缘检测来提取人眼的轮廓, canny 在 OpenCV 中已经有固定的接口,而 Otsu 和 Robert Cross 检测需 要自己去实现。子啊利用最大的垂直距离进行扫描,当最大的垂直距离 小于 40%的标记高度的时候判断是闭合状态。 附上关于 Otsu 以及 Robert Cross 边缘检测的代码: public Mat Robert(Mat mat) /robert cross边缘检测代码 int robbertNum = 0; int row = mat.rows(); int col = mat.cols(); for (int i = 1; i row - 1; i+) for (int j = 1; j 50) mat.put(i, j, 255); else mat.put(i, j, 0); return mat; public int Otsu(Mat mat) /Otsu算法实现: int histData = new int256; for (int i = 0; i 256; i+) histDatai = 0;/ 初始化为0值 int total = mat.cols() * mat.rows(); for (int i = 0; i mat.rows(); i+) for (int j = 0; j mat.cols(); j+) int temp = (int) mat.get(i, j)0; histDatatemp+; double sum = 0; for (int t = 0; t 256; t+) sum += t * histDatat; double sumF = 0; int WB = 0; int WF = 0; double varMax = 0; int thresh = 0; /* * for (int i = 0;i 256;i+) System.out.print(i); * System.out.println(: + histDatai); */ for (int t = 0; t varMax) varMax = varBetween; thresh = t; return thresh; Xml 文件的配置如下: 需要加入下面的权限: 3.7存储分配存储分配 本程序在高级语言 JAVA 进行编码,直接的内存分配由 JAVA 运行 时分配。 3.8注释注释 在代码的适当出有中文代码注释。 3.9测试计划测试计划 测试日期、测试人员安排请参考测试计划,测试用例的具体内容,请 参考测试说明。 3.10 尚未解决的问题尚未解决的问题 1、目前实现的帧率较低,仅能达到 6-7 帧/s 的水平,还远远达不到“实 时”的要求,需要对算法进行优化。 2、在对人眼进行定位的时候,精度不够高,带着眼镜的时候会将眼镜的 边框带入,影响最大的垂直距离的计算,从而影响到 PERCLOS 的计算 精 度。 3、没能实现“自动跟踪”人眼,需要保持固定的距离才能进行人眼的定位。 爱人者,人恒爱之;敬人者,人恒敬之;宽以济猛,猛以济宽,政是以和。将军额上能跑马,宰相肚里能撑船。 最高贵的复仇是宽容。有时宽容引起的道德震动比惩罚更强烈。 君子贤而能容罢,知而能容愚,博而能容浅,粹而能容杂。 宽容就是忘却,人人都有痛苦,都有伤疤,动辄去揭,便添新创,旧痕新伤难愈合,忘记昨日的是非,忘记别人先前对自己的指责和谩骂,时间是良好的止痛剂,学会忘却,生活才有阳光,才有欢乐。 不要轻易放弃感情,谁都会心疼;不要冲动下做决定,会后悔一生。也许只一句分手,就再也不见;也许只一次主动,就能挽回遗憾。 世界上没有不争吵的感情,只有不肯包容的心灵;生活中没有不会生气的人,只有不知原谅的心。 感情不是游戏,谁也伤不起;人心不是钢铁,谁也疼不起。好缘分,凭的就是真心真意;真感情,要的就是不离不弃。 爱你的人,舍不得伤你;伤你的人,并不爱你。你在别人心里重不重要,自己可以感觉到。所谓华丽的转身,都有旁人看不懂的情深。 人在旅途,肯陪你一程的人很多,能陪你一生的人却很少。谁在默默的等待,谁又从未走远,谁能为你一直都在? 这世上,别指望人人都对你好,对你好的人一辈子也不会遇到几个。人心只有一颗,能放在心上的人毕竟不多;感情就那么一块,心里一直装着你其实是难得。 动了真情,情才会最难割;付出真心,心才会最难舍。 你在谁面前最蠢,就是最爱谁。其实恋爱就这么简单,会让你智商下降,完全变了性格,越来越不果断。 所以啊,

温馨提示

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

评论

0/150

提交评论