基于OpenCV在Android平台下实现人脸识别资料下载.pdf
《基于OpenCV在Android平台下实现人脸识别资料下载.pdf》由会员分享,可在线阅读,更多相关《基于OpenCV在Android平台下实现人脸识别资料下载.pdf(6页珍藏版)》请在冰豆网上搜索。
首先,本文介绍了OpenCV2.4的人脸识别算法类FaceRecognizer的使用以及在Windows平台下的实现,接着详细的阐述了利用Android下的JNI(JavaNativeInterface),并结合AndroidNDK(NativeDevelopmentKit)调用和编译OpenCV下的相关函数,生成共享函数库。
经过实验的在Android下人脸识别效果良好。
关键词:
人脸识别,人脸归一化;
Android;
OpenCV;
NDK;
JNIFaceRecognitionBasedonOpenCVinAndroidSystemNIEPeng-peng1,WANGEr-Wei2,LIUMin-feng1,ZHANGHao-kun1(XidianUniversity,Xian,710071)Abstract:
ThispaperproposesawayoffacerecognitionbasedonOpenCVinAndroidSystem.Firstly,thispaperintroducestheuseoffacerecognitionstructFaceRecognizerandimplementsthisstructinWindowsSystem.ThentheinvokingandcompilingofOpenCVfunctionswithJNI(JavaNativeInterface)andAndroidNDK(NativeDevelopmentKit)isintroducedindetailandsharedlibraryisgot.Finally,facerecognitioninAndroidworkswellintheexperiment.Keywords:
facerecognition,facenormalization;
Android;
OpenCV;
NDK;
JNI83图3AT&
T人脸数据库一部分图2人脸归一化处理效果了FaceRecognizer类,实现了三种人脸识别方法Eigenfaces、Fisherfaces和LocalBinaryPatternsHistograms。
1在Windows平台下实现人脸识别功能在Android平台开发前,需要先在Windows下将所需要算法的C/C+函数先进行开发并测试好。
这是因为结合VisualStudio开发工具,可以能够很好的调试C/C+代码。
需要实现的功能模块包括人脸归一化处理和识别功能。
1.1人脸归一化处理在新来了一张图片后,首先需要做的是检测出是否有人脸,并做归一化处理。
归一化处理的原因是为了尽可能减小光照和姿势对人脸识别的影响。
新来一张图片后,需要的处理流程如图1所示。
人脸检测和人眼定位是使用OpenCV自带的库函数进行实现的,关于具体如何配置VisualStudio环境下的OpenCV的开发,不再赘述。
在OpenCV的中文官网“http:
/scale_factorCV_DEFAULT(1.1),intmin_neighborsCV_DEFAULT(3),intflagsCV_DEFAULT(0),CvSizemin_sizeCV_DEFAULT(cvSize(0,0),CvSizemax_sizeCV_DEFAULT(cvSize(0,0);
人脸旋转的目的是把有旋转角度的人脸变换成正立的人脸。
实现手段是计算左右眼的中心连成线与水平线所成的角度,然后将图片中所有的像素点的坐标进行旋转。
人脸尺寸归一化是需要将人脸从原始图片中截取出来,制作成统一大小的图片。
假定所需要的人脸图片的宽度是w,则两个人眼中心的距离为w/2。
因此得到一张人脸图片后,计算其人眼中心的距离与要求的距离的比值,即为整个图片的缩放比例系数如下图2所示。
2.2人脸识别实现在利用OpenCV进行人脸识别算法前,需要从网上下载libfacerec库,该库已经给出了实例。
我们需要做的是理解三种算法Eigenfaces,Fisherfaces和LBPH(LocalBinarypatternsHistograms),以及如何调用底层库来实现。
这里以Eigenfaces为例,对其实现的过程做出解释。
首先需要准备好需要测试的人脸图片库。
函数库推荐的是AT&
T人脸数据库,从网络下载下来后,还需制作一个文件路径的文本文档,命名为csv.txt,每一行的格式如下为/path/to/image.ext;
label,其中/path/to/image.ext是图片的绝对路径或相对路径,label必须是整数,同一个人的label是一样的如下图3所示。
现解释其中重要的函数:
图1人脸归一化流程84PtrcreateEigenFaceRecognizer(intnum_components,doublethreshold)num_components是特征值的个数,也就是说在做PCA分析时,选取的主成分向量的个数,也可以不设定,直接使用默认值。
Threshold是人脸识别的阈值,当设定为0值,人脸预测时返回的标号为-1时,则表明人脸库没有相应的人脸。
训练的图片,也就是你想训练的人脸,数据格式为vectorlabels:
对应图片的标号,数据格式为:
vector;
intEigenfaces:
predictsrc:
需要进行识别的图片。
返回值是对应的标号。
3搭建Android下的JNI开发环境3.1环境设置Android在的开发语言是JAVA,所使用的集成开发环境是Eclipse。
在标准的Android开发环境下开发OpenCV,还需要准备AndroidNDK,Cygwin和OpenCVAndroid。
首先从网上下载准备好三个库文件,下载网址分别为:
http:
/配置好系统环境变量,需要对/cygwin/home/username/bash_profil文件进行修改,在文件的末尾加上“NDK=/cygdrive/”和“exportNDK”。
第一句是配置AndroidNDK的路径。
假如下载并解压缩的AndroidNDK路径为“D:
/android-ndk-r8b”,则第一句应该为:
“NDK=/cygdrive/d/android-ndk-r8b”。
接着需要配置OpenCV的开发环境,在Eclipse中导入OpenCVAndroid-2.4文件里所有的Android工程,导入后会发现有几个OpenCVsample和OpenCVTutorial几个例程,最重要的是还有一个OpenCVLibrary2.4.2的工程。
这时候,开始建立一个空的标准Android工程,并在工程目录下新建一个文件夹,取名为jni,所有的C/C+文件都放在该目录。
在这个工程中,进行如下操作Project-Properties-Android-Library-Add,这时候就会看需要导入的OpenCVLibrary2.4.2。
然后是配置jni文件下的C/C+文件自动编译的问题,Project-Properties-Builders-New-Program,这是进入了编译器的配置选项卡。
选择Main选项页,在Location框中输入cygwinbinbash.exe的绝对路径,在WorkingDirectory框中输入cygwinbin的绝对路径,在Arguments输入“-login-ccd/cygdrive/&
$NDK/ndk-build”,其中是要输入该工程的路径,至于后半部分是调用ndk-build命令;
选择Buildoptions选项页下将Runthebuilder下的都选中,这是表示在制定的情况下调用编译命令,在specifyworkingsetofrelevantresources下指定jni文件的路径即可。
这样就配置完了jni下文件的编译器。
编译文件的规则是根据jni目录下的Android.mk和Application.mk文件,这将在后面介绍编写。
4实现程序过程在建立好了编译环境后,需要进行源代码开发,主要有两部分需要开发,一部分是Android程序的JAVA平台的开发,主要涉及到UI界面和程序的逻辑流程;
另一部分是Jni接口的开发,也就是用来链接JAVA与C/C+的部分如下图4所示。
4.1建立UI界面在界面上需要两个布局,一个是用于人脸识别的界面,另一个是用于人脸注册的界面。
在res/图4Android应用程序构成图585layout文件夹,新建两个xml布局文件,分别命名为main.xml和register.xml。
在main.xml中主要两个Button,分别是“识别”和“注册”按键,以及一个imageview组件。
在register.xml中有两个Button,分别是“拍照”和“注册结束”按键,一个Edittext输入框,用于接收姓名,以及一个imageview组件。
4.2JAVA平台程序开发为上述两个UI界面编写两个Activity,分别命名为FacerecActivity.java和register.java,对应着FacerecActivity和register两个Activity。
为此需要在AndroidManifest.xml里组成这两个Activity,同时需要加入允许程序读写SD卡,因此加入权限语句:
在两个Activity里面都需要实现照相功能,获取图片。
实现照相机功能,一般是有两种方法:
一种是使用内置的摄像头应用程序;
另一种是自定义照相Activity。
在这里使用一种简单的方法,既使用内置的摄像头程序。
步骤如下:
构建摄像头Intent:
ntentcameraIntent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
启动摄像头的Intent:
startActivityForResult(cameraIntent,0);
接受Intent结果:
在应用程序中设置onActivityResult()方法,用于接受摄像头intent返回的数据。
首先实现FacerecActivity.java文件,它作为主界面,主要是响应上述的main.xml中各个组件。
分别实现对“识别”和“注册”两个按钮的监听,在“识别”按键的响应为调用JNI的识别算法。
该人脸识别函数的原型应该接受的参数是一张照片,返回值应该是该照片中人脸对应的姓名或者找不到该人。
故