详细设计说明书文档格式.docx

上传人:b****3 文档编号:16616297 上传时间:2022-11-24 格式:DOCX 页数:10 大小:25.79KB
下载 相关 举报
详细设计说明书文档格式.docx_第1页
第1页 / 共10页
详细设计说明书文档格式.docx_第2页
第2页 / 共10页
详细设计说明书文档格式.docx_第3页
第3页 / 共10页
详细设计说明书文档格式.docx_第4页
第4页 / 共10页
详细设计说明书文档格式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

详细设计说明书文档格式.docx

《详细设计说明书文档格式.docx》由会员分享,可在线阅读,更多相关《详细设计说明书文档格式.docx(10页珍藏版)》请在冰豆网上搜索。

详细设计说明书文档格式.docx

《软件工程概论》

《软件文档编写》

《android应用程序设计》

《java基础》

《opencv教程》

《andorid-opencv手册—网页版》

2.程序系统的结构

本待开发的系统采用的软件层次框图如下图所示:

Android应用程序

Android-OpenCV库

AndroidOS

硬件平台

 

在前期的方案确定的时候,采用的是基于android操作系统的OpencV开源库,因此只需要将编译好的OpenCV库导入到开发环境中即可进行开发,因此本系统的主要开发工作集中在应用程序的设计部分。

在项目的概要设计中,确定的具体的软件的主流程方案如下图所示。

状态分析

超出阈值

没达到

达到

获取一帧图像

图像预处理

人脸定位

人眼和嘴巴定位

给予警示

结束

计数

开始

有摄像头

打开摄像头

在人眼状态的判断过程中具体的步骤如下图所示。

人脸检测

二值化

边缘检测

闭合

3.详细设计

为了完成系统所需要的功能,我们设计了一个类来实现:

FdActivity

说明如下:

FdActivity:

该类是作为程序的主界面类,在该类中,将surfaceview占据了整个界面,在该类中主要重写了onCreate()、onPause()、onDestroy()、onCameraViewStarted()、onCameraViewStopped()、onCameraFrame()、onCreateOptionsMenu()、onOptionsItemSelected()、

函数具体的分析参见程序的具体描述部分;

onCameraFrame()函数:

在系统实时监测驾驶员的头像数据的时候,需要显示当前的帧率,该类就是负责帧率的显示的类,该类中,主要是实现了以下的几个功能:

从一帧图片中计算人眼的区域

绘制人眼的区域

3.1程序简单描述

打开摄像头,实时采集脸部的帧数据,图像进行灰度变化,首先进行预处理,将背景噪声以及图像中的突刺变化去除,防止影响后面的图形计算精度;

利用Opencv中的已有函数接口进行人脸和人眼的定位,在将人眼的轮廓提取出来,这里面的用的方法:

Otus和RobertCross边缘检测。

利用最大垂直距离进行是否闭合的判定,组后再利用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(Matimage,List<

Rect>

objects,doublescaleFactor,intminNeighbors,intflags,SizeminSize)对指定的image进行检测。

其函数各参数的意义:

Image:

需要进行目标检测的区域.

Object:

将检测到的目标标记在矩形框中.

scaleFactor:

代表图像的缩放因子.

Minneighbors:

指定每个候选矩阵至少包含的邻近元素个数.

Flag:

标志位,默认为0.

Minsize:

最小的检测窗口,如果该值设置过小,将会导致图像的计算量较大。

Otus最佳阈值图像分割法

当系统成功标记处人眼部的区域后,需要进行二值化处理,从而实现眼部提取。

但是由于图像的灰度值对光线很敏感,固定的阈值势必无法满足要求,本文采用的是基于Otsu算法的二值化处理。

Otsu算法,又被称为最大类间法,是一种自适应的图像分割技术,它是根据最小二乘原理推导出来的,根据光线强度的不同,阈值会随之变化,能得到最优的阈值[7],其基本原理如下:

将直方图在某一阈值进行分割成两组,称为“前景”和“背景”,当被分成的两组的方差最大时候,该阈值就是最佳分割阈值。

方差是灰度均匀分布的一种度量,值越大,说明构成图像两部分的差别越大,当部分“前景”错分为“背景”或者“背景”错分为“前景”的时候,都会导致方差变小,因此最大类间法意味着错分的概率最小。

对于图像直方图,不妨假设其灰度级为0~m,像素点个数为N,针对某一个分割阈值t,那么整个图像被分割成两部分,0~t称为“前景”,而t+1~m称为“背景”。

“前景”的权重为Wf,均值设为Mf,方差为Df,“背景”的权重为Wb,均值设为Mb,方差为Db。

图像的整体的方差公式如式3所式。

(3)

Otsu的最终目的就是要求出D的最大值来,从而得到最优的分割阈值。

RobertCross边缘检测

边缘是图像灰度值变化剧烈的位置,因此包含了大量的有用信息,常用的边缘检测包含很多,比如:

RobertCross边缘检测,Canny边缘检测,Prewitt边缘检测,Sobel检测。

但是这些方法中唯有RobertCross计算方便简单、快速,容易在实时系统中实现,本系统中采用的就是该检测方法,根据任意一对互相垂直方向上像素点的差分来计算梯度的原理[8,9],采用对角线方向相邻像素灰度差。

如式4所示:

(4)

G代表的是计算之后的灰度值,而f代表的是原始图像的灰度值。

虽然Robert检测速度很快,但是其缺点也是很明显的,对噪声敏感,并且边缘不是很光滑。

3.6主要类的说明以及xml配置文件

在上面的概述中,我们初步说明了在该系统的实现过程中需要实现的几个类。

在这里我们详细的说明。

tart();

否则的话直接release掉camara。

Surfacechaged()函数,是在surfacecreated回调之后进行第一次调用,在这里我们主要是获得摄像头支持的size,然后我们不断选择最优的预览size,(这部分代码是在网上参考的)。

将camara的设置成为:

mFrameWidth);

mFrameHeight);

surfaceDestroyed()回调函数,就是当surface消失的时候进行回调的,因此,这里面我们需要做一些资源的释放的操作,比如说camera释放。

作为抽象的基类,我们为子类提供的接口是:

protectedabstractBitmapprocessFrame(intflag,VideoCapturecapture);

该接口在子类中进行图像处理时详细的设计。

(参见Fdview设计)

我们在该抽象基类中实现了runnable接口,因此还需要实现run函数;

首先需要完成对计量帧率的对象的初始化工作。

下面的就是不断的while循环,进行图像的处理工作:

首先从摄像头中回去实时的数据帧,该部分的接口是:

(),[mCameras是上面打开的摄像头]然后进行图像的处理processFrame,返回bmp对象,进行帧率的计量,锁住画布(),进行绘画,解锁画布。

Bmp图像的回收。

Fdview类的设计:

该类主要是继承了抽象基类MyCvViewBase,因此主要在这一部分中,需要实现的接口函数,

protectedBitmapprocessFrame(intflag,VideoCapturecapture)

构造函数中需要实现的是:

获取xml文件资源().openRawResource进行xml文件的读写,利用该xml文件进行分类器对象的初始化,分类器对象在OpenCV中是实现目标检测的对象,是由特征文件xml进行构造的。

在该软件中需要定位人脸,人嘴和人眼,因此需要以下几个xml文件,分别是:

以及,,文件,识别率高达95%以上,是OpenCV中自带的已经训练好的分类器特征文件。

重写surfacechanged()函数,主要是初始化了mat数据,mat可以看成是二维的保存图像的矩阵,是OpenCV中自带的数据格式。

实现processFrame接口函数,在该部分主要是关于图像处理的接口函数,是整个软件的核心函数:

首先是解析出摄像头的RGB以及灰度图像格式:

(mRgba,;

(mGray,;

进行预处理过程:

主要是进行直方图的均衡化过程,OpenCV自带接口:

();

利用OpenCV中自带的目标识别的函数[说明:

mCascade是人脸的分类器对象]进行图像中目标的检测,我们首先需要定位到人脸部,并且将人脸在图像中标记出来。

(绿色的标记)

如果人脸不是空的,那么开始将人脸设置成为感兴趣区域,在该区域中进行人眼的检测,,同样的还是有()[说明:

eyedetectcade是人眼的分类器对象],如果眼睛找到了,我们将其中一只眼睛标记出来,用来进行图像处理,因为基本而言,人眼都是堆对称的,一只眼睛的状态可以代表人眼目前的状态,将该区域进行Otsu二值化处理,以及RobertCross或者是canny边缘检测来提取人眼的轮廓,canny在OpenCV中已经有固定的接口,而Otsu和RobertCross检测需要自己去实现。

子啊利用最大的垂直距离进行扫描,当最大的垂直距离小于40%的标记高度的时候判断是闭合状态。

附上关于Otsu以及RobertCross边缘检测的代码:

publicMatRobert(Matmat){//robertcross边缘检测代码

introbbertNum=0;

introw=();

intcol=();

for(inti=1;

i<

row-1;

i++){

for(intj=1;

j<

col-2;

j++){

robbertNum=(int)(i,j)[0]

-(i+1,j+1)[0])

+(int)(i+1,j)[0]

-(i,j+1)[0]);

if(robbertNum>

50){

(i,j,255);

}else{

(i,j,0);

}

}

}

returnmat;

}

publicintOtsu(Matmat){//Otsu算法实现:

int[]histData=newint[256];

for(inti=0;

256;

histData[i]=0;

//初始化为0值

inttotal=()*();

();

for(intj=0;

inttemp=(int)(i,j)[0];

histData[temp]++;

doublesum=0;

for(intt=0;

t<

t++){

sum+=t*histData[t];

doublesumF=0;

intWB=0;

intWF=0;

doublevarMax=0;

intthresh=0;

/*

*for(inti=0;

i<

i++){*"

:

"

+histData[i]);

*/

WF+=histData[t];

if(WF==0)

continue;

WB=total-WF;

if(WB==0)

break;

sumF+=(double)(t*histData[t]);

doublemF=sumF/WF;

doublemB=(sum-sumF)/WB;

doublevarBetween=WB*WF*(mB-mF)*(mB-mF);

if(varBetween>

varMax){

varMax=varBetween;

thresh=t;

returnthresh;

Xml文件的配置如下:

需要加入下面的权限:

<

uses-permissionandroid:

name="

/>

uses-featureandroid:

/>

<

3.7存储分配

本程序在高级语言JAVA进行编码,直接的内存分配由JAVA运行时分配。

3.8注释

在代码的适当出有中文代码注释。

3.9测试计划

测试日期、测试人员安排请参考测试计划,测试用例的具体内容,请参考测试说明。

3.10尚未解决的问题

1、目前实现的帧率较低,仅能达到6-7帧/s的水平,还远远达不到“实

时”的要求,需要对算法进行优化。

2、在对人眼进行定位的时候,精度不够高,带着眼镜的时候会将眼镜的

边框带入,影响最大的垂直距离的计算,从而影响到PERCLOS的计算精

度。

3、没能实现“自动跟踪”人眼,需要保持固定的距离才能进行人眼的定位。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 预防医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1