面部识别用户指导


本篇指南旨在帮助开发者熟悉如何从零开始使用骁龙脸部处理开发套件编写应用程序。 这是一个简单的安卓摄像头应用程序,以摄像头预览开始实现两个功能:
1.在摄像头预览视图中通过描点和方框追踪眼部、嘴和脸部运动;
2.根据被拍摄人脸部的微笑程度改变摄像头预览画面中人脸方框的颜色。 我们将使用Eclipse作为开发平台,一些步骤会因为工具集的不同而存在差异,但不影响开发。


开始



 新建一个安卓项目,选择 File -> New -> Other -> Android Application Project。给应用程序和项目命名(比如,FacialProcessingSample).根据需要的设置完成余下的步骤。

 向导结束后,在工程目录你应该可以找到一个命名为"libs"的新文件夹(如下图所示),如果没有找到,请新建一个相同的文件夹。

 下载好的Snapdragon SDK包应该包括了一下的文件和目录:
 Docs
 Libs
 Samples
 Testapp
 SDKLicense (pdf)
 SnapdragonSDK_ReleaseNotes_2_0 

 从SDK包中,拷贝" sd-sdk-facial-processing .jar"和以armeabi命名的文件夹到新建的"libs"文件夹。

 鼠标右键工程,选择 -> Properties -> Java Build Path -> "Go to Libraries tab" -> Add JARs -> 从工程目录下的"libs"文件夹中添加"sd-sdk-facial-processing.jar"。

 到"Order and Exports"下检查刚刚添加的后缀为".jar"的文以及安卓私有库。  在继续其它步骤前清理工程目录。

流程图

 以下是创建脸部识别应用步骤的流程图。

确定用户界面

 你可以按照自己的想法和需要设计并美化你的应用界面,这里我们仅仅是满足演示应用目的而简化界面的设计。

 在布局中添加一个简单的按键,代码如下:

创建一个摄像头显示视图界面

 为了预览摄像头画面,制作一个视图来显示摄像头画面
。  选择res/layout文件夹查看所有的layout文件,打开后缀为".xml"对应为"MainActivity"的文件,然后添加框架布局,代码如下:

 在工程下创建一个类,命名为"CameraSurfacePreview",这个类将负责管理摄像头预览的设置。它将在新的视图创建时被调用,它有一个和摄像头对象对应的构造函数。三种重载方法:"SurfaceChanged","SurfaceCreated"和"SurfaceDestroyed"能帮助你实现创建、改变和清除摄像头预览视图。

当你创建了"CameraSurfacePreview"的类后,回溯到"MainActivity".开始摄像头预览前需要声明和初始化对象,声明以下的对象和变量:

• startCamera( );
• This method will open the camera and display it on the available surface:
这个方法将打开摄像头并在用户界面中显示出来:

启动摄像头就应该立即调用StartCamera(),你需要注意的是"Cameraobj.setPreviewCallback(..)"会产生一个错误,为了解决这个问题,需要用到类"implement Camera.PreviewCallback"并添加到未实现的方法。

在运行这个应用程序前,需要在安卓描述文件也就是manifest文件中添加必要的许可:

在设备上运行应用程序,此时你应该可以看到摄像头预览应用,你将发现摄像头预览画面会转动几度,这是因为摄像头在不同设备上存在安装误差,我们将在以后阶段关注这个问题。

接下来需要注意的事情
 在开始使用脸部处理框架前,你必须:
• 编写方法 StopCamera(),这个方法作用是当摄像头图像预览完成后,释放摄像头以让其它应用可以使用它。

为接下来的活动执行onPause(),onResume()和onDestroy功能,代码如下:

通过我们已创建的switchCamera开关来执行事件监听器:

Use Facial Processing

• 骁龙脸部处理套件是的脸部数据的获得变得非常简单,并且可以创造特殊的体验。
• 最重要事情是起先需要验证设备支持骁龙脸部处理功能。
• 在启动摄像头前验证刚才提到的两点。

当摄像头停止或关闭后,及时释放摄像头很重要,我们通过方法StopCamera()来实现的,代码如下:

现在,我们准备调用方法FacialProcessing.setFrame(..),并得到脸部数据,这个是通过先前的方法 onPreviewFrame(byte[] data,Camera camera)来实现的。

如上所述,摄像头预览窗口似乎会旋转一定的角度(如本例子中的270度),原因是摄像头存在安装误差,同样的,如果我们试图从骁龙脸部处理套件获得脸部数据,那么所获的数据会对齐摄像头,因此,摄像头预览窗口和脸部数据都需要做一定的旋转。最好的方式是检查设备屏幕方向,然后相应的对旋转的角度值做反馈调整。

• 屏幕旋转的问题现在应该得到了解决
• 调用脸部处理方法 setFrame(..),该方法包含了一下的参数:
• byte[] 帧数据 : YUV 帧数据从方法onPreviewFrame(data, camera)获得;
• int 帧宽度: 这是摄像头预览窗口的宽度;
• int 帧高度: 这是摄像头预览窗口的高度;
• boolean 镜像: 值为真代表摄像头前置摄像头,值为假代表摄像头是后置摄像头;
• PREVIEW_ROTATION_ANGLE 旋转角: 最后一步确定的旋转角度值取决于屏幕方向。

• 如果摄像头预览窗口抓取的人脸数量大于零,就需要通过调用方法faceProc.getFaceData()获取脸部数据,此时通过检测到每一个人脸所得到并存储的脸部数据返回一个脸部矩阵:

显示脸部数据
• 现在我们可以取得脸部数据,并在摄像头预览窗口中显示,为此我们还需要创建一个新的类,命名为"DrawView"
• 类"DrawView"的构造函数需要包含以下参数
• context 抽象类;
• FaceData[] faceArry:脸部矩阵从 "getFaceData()"获得;
• boolean inFrame: 检测摄像头图像视图中是否有人脸。
• 摄像头视图开启时将创建重载方法"onDraw"

• 现在我们通过操作"onDraw"函数来描绘视图窗口。

• setRectColor()函数的功能是通过微笑程度设置人脸方框的颜色:

• 现在类"DrawView"已经就绪,可以使用类"onRewviewFrame"来查看结果:

• 在设备上运行应用程序,如果前面所罗列按照的步骤执行,这是你应该可以看到一个方框,也就是脸部对应的方框,方框内部的左眼附近显示有一个红点,右眼附近显示一个绿点,嘴巴附近显示白点。

• 需要注意的是摄像头预览视图中中上述的点并不完全和人脸的眼睛和嘴巴的位置吻合,这是因为骁龙脸部处理套件通过摄像头预览的图像会赋予人脸中眼睛和嘴巴坐标,而视图显示的画面尺寸和摄像头预览视图尺寸不一致,最后一个重要的步骤是通过正式的视图显示尺寸来标准化预览图像中的眼睛和嘴巴的坐标。

• 下面是使用"normalizeCoordinates(surfaceWidth,surfaceheight)"也就是脸部处理框架的应用程序接口:

下次运行应用程序时,脸部数据应该按照期望的显示出来,改变微笑程度将改变脸部方框的颜色。

*点击接受Snapdragon SDK条款可以获得示例代码。

Qualcomm 解决方案

 

高通软件中心

通过集中式门户站无缝管理您的高通®软件和工具

下载软件中心