青岛大学本科生毕业论文(设计)
(1) Active/Running状态,一个新 Activity 启动入栈后就会自动处于栈的最顶端,它被显示在屏幕的最前端,此时它处于能被用户交互和用户可见的激活状态[15]。
(2) Paused状态,当 Activity 处于后台运行时或被其他的覆盖时,他并没有被退出程序实质上还是在运行态,此时它依然与处在窗口管理器中,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点只是不能与用户交互。
(3) Stopped状态就是 Activity 被另外一个 Activity 覆盖、失去焦点并不可见时的状态。
(4) Killed 状态,Activity 被系统回收或者没有被启动时。
Android管理 Activity 的方式是通过一种 Activity 栈来实现的,一个Activity的实际的状态定义了它在堆栈中的位置。处在栈的顶端的是处于前台的 Activity,当前台的 Activity 因异常或其它原因被Killed时,处于栈第二层的 Activity 将被激活顺序移动到栈顶。当新Activity 启动入栈时,新 Activity 会取代当前Activity,原来处于栈顶的Activity被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换[3]。如图4.2所示是Activity 的状态转换图:
图4.2 Activity 的状态转换图
Android 程序员只可以决定启动一个新的 Activity,但不能手动的,借助外部因素的结束一个 Actity。每个Activity都有自己的生命周期,而Activity的生命周期统一交给系统管理。如图4-3:Activity生命周期示意图。
15
青岛大学本科生毕业论文(设计)
图4.3 Activity生命周期示意图
Android平台定义了一种称为Intent(意向)的异步消息,该消息用于激活Activity、Service和Broadcast Receiver组件。具体用法如下:
Intent intent=new Intent();
Intent.setClass(FaceDetectorActivity.this,Resgistered.class); startActivity(intent);
16
青岛大学本科生毕业论文(设计)
4.2.2 Bitmap和Drawable和Canvas
Drawable就是一个可以在上面作画的对象,可能是BitmapDrawable(一张位图),也可能是ShapeDrawable(一个图形),还有可能是LayerDrawable(一个图层),创建的可画对象要根据画图的需求来确定。
Bitmap位图,用于图的处理。它是android系统中图像处理的最重要类之一。用它可以显示图像文件的信息,进行图像的剪切、旋转、缩放等操作,并可以指定格式保存图像文件。从资源中获得bitmap对象,两个方法:通过bitmapfactory,来完成或者通过BitmapDrawable(inputStream i).getBitmap() 来完成。
1、从资源中获取Bitmap Java代码
Resources res = getResources();
Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.icon); 2. 获取位图的信息
要获取常常要先获取Bitmap,位图信息包括:位图大小、像素、density、透明度、颜色格式等,在Bitmap中使用Bitmap.Config定义RGB颜色格式,仅包括4种格式:ALPHA_8、ARGB_4444、ARGB_8888、RGB_565。;
Bitmap通过提供compress( )接口来压缩图片,但是在AndroidSAK只支持两种格式的图片压缩:PNG、JPG格式。
3. 显示位图
可以使用核心类Canvas显示位图,通过Canvas类的drawBirmap()显示位图,或者借助于BitmapDrawable来将Bitmap绘制到Canvas。当然,也可以通过BitmapDrawable将位图显示到View中。
常用显示代码如下:
ImageView iv = (ImageView) findViewById(R.id.img); Iv.setImageBitmap(bitmap);
基于第3点,显示位图时可以使用核心类Canvas。Canvas类代表画布,通过该类提供的构造方法,可以绘制各种图形。绘制图像时同样在Android使用的是画笔Paint类。Paint 中包含了很多方法对其属性进行设置,主要方法如下: setAntiAlias: 设置画笔的锯齿效果。 setColor: 设置画笔颜色
setARGB: 设置画笔的a,r,p,g值。 setAlpha: 设置Alpha值 setTextSize: 设置字体尺寸。
setStyle: 设置画笔风格,空心或者实心。
17
青岛大学本科生毕业论文(设计)
setStrokeWidth: 设置空心的边框宽度。 getColor: 得到画笔的颜色 getAlpha: 得到画笔的Alpha值。
4.3 PCA算法原理分析
PCA算法将图像定义为具有一定分布的随机向量。但是由于人脸总体构型的相似性,人脸图像在其中的分布并不是随机的,PCA算法可以获得人脸图像分布的主成分方向,从而使用人脸图像的主成分来表达人脸。它使得图像数据在一个低维的空间进行处理,在保持了原有大部分信息量的基础上,大大的减少了运算量,这样有利于在移动设备上的开发使用。从本质上而言,这是一种基于统计分析的信息压缩算法。
PCA算法运用于人脸识别主要分为连个阶段:训练阶段和识别阶段。
4.3.1 训练阶段
设人脸图像f(x,y)用N=width*height维向量,人脸图像训练集可以看作是M?N维的随机向量X??X1,X2,X3,像的向量表示为:
,Xm?,其中m是训练样本图像数目。则这m幅图像的平均图
1mX??Xi (4-1)
mi?1每个人脸Xi与平均人脸图像X的差值定义为?i:
?i?Xi?X这样训练图像的协方差矩阵表示为:
(i?1,2,3,,m) (4-2)
1m1mT???(Xi?X)(Xi?X)???i?iT (4-3)
mi?1mi?1式中X是N维向量,则?就是N?N维向量。
设?i和Vi分别是协方差矩阵?的特征值和特征向量,其中i?1,2,3,小到大顺序排列:?1??2??3?征向量?i为:
将特征值按从,m,
??m。这样就很容易计算出协方差矩阵?的正交归一特1?Vi?i?i?i?1,2,3,,m (4-4)
进一步我们获得特征脸????1,?2,?3,,?m?
为了进一步减少计算量,我们提出特征值的贡献率(选取的特征值在总的特征值的和比),选取前P个最大特征值以及对应的特征向量[7]。
18
青岛大学本科生毕业论文(设计)
??????i?1i?1i?mi?pi?aa?90% (4-5)
i这样我们就将每一幅人脸图像投影到由Vi组成的子空间中,使得每一幅人脸图像对应于子空间中的一个点。也可以理解为每个子空间中的一个点对应着一个人脸图像,由于这些点很像人脸图像,故我们称之为“特征脸”。这样对于任意一个样本X,它的主成分特征为:
y?(?1,?2,,?m)TX (4-6)
4.3.2 识别阶段
我们采用三阶邻近算法来进行识别阶段,对待测样本的主成分和每一训练样本的主成分求距离,将待测样本归类于最小距离的训练样本类别。具体算法过程如下:
(1)将每幅人脸图像与平均脸的的值做差,其得到的差值脸矢量投影到“特征脸”空间,即:
?i??T(Xi?X)(i?1,2,3,,m) (4-7)
(2)将待识别的人脸图像X与平均脸的差值脸投影到特征脸空间,得到其特征向量?x
?x??T(X?X) (4-8)
(3)定义识别阈值?
??1max?i??j2i,ji,j?1,2,3,?,m (4-9)
(4)采用欧氏距离来计算?x与每个人脸的距离?i
???i??之间的距离
2ix2i?1,2,3,,m (4-10)
为了能区分人脸与非人脸,我们还需要计算待识别图像X与由特征脸空间重建的图像
??X?Tf其中 Tf???x?X最后根据以下规则进行判断:
若:(1)???,则输入图像不是人脸图像
(4-11)
(2)???, 1)且对?i,?i??,则输入图像包含未知人脸
2)且对?i,?i??,则输入人脸图像为人脸库中第i个人脸
4.3.3 PCA算法实现流程
由上文对PCA算法原理的阐述,几个重要的因素:待训练图像数据、平均图像、训练图像协方差矩阵、协方差矩阵的特征值特征向量、特征向量子空间、待识别图像的子空间
19