本指导致力于帮助开发者使用骁龙脸部识别软件开发工具包来编写安卓应用。
在编写应用前,建议您熟悉编写使用的Snapdragon™SDK的应用程序---脸部识别框架,因为面部识别是脸部识别软件工具包扩展附加的功能。
本指导参考借鉴:
· FacialProcessing
User Guide
· FacialProcessing
FAQs
本指南将逐步创建一个简单的安卓应用程序,首先从一个摄像头预览开始并执行以下操作
· 添加人物
· 更新人物
· 识别人物
· 删除人物
· 序列化集
· 反序列化集
· 重置集
我们将使用Eclipse作为我们的开发平台。根据你的工具的不同,有几个步骤可能也会有所不同
确认环境
· 确保您有一个支持人脸识别功能的Snapdragon的设备
· 为了确认你的设备是兼容的,你必须运行附带的SDK包的测试应用程序。
· 确保您已正确安装安卓开发工具。
安装
首先创建一个Android项目,步骤是:File -> New -> Other ->AndroidApplication
Project。填写一个应用程序名称和项目名称(例如,Facial Recognition Sample App)。完成的步骤的其余部分与你所需的设置。
向导结束后,你应该看到在项目目录中名为“libs”的新建文件夹,如下图所示;如果没有,则自行创建一个。
下载的SDK的Snapdragon包应包括以下文件和目录:
· Docs
· Libs
· Samples
· Testapp
· SDKLicense (pdf)
· SnapdragonSDK_ReleaseNotes_2_1
· 从SDK包,复制全部“libs
(Facial_Recognition)”下的内容到新创建的“libs”文件夹中。
· 右击project -> Properties -> JavaBuild Path -> “Go to Libraries tab” -> Add JARs ->从项目的libs文件夹添加sd-sdk-facial-processing.jar。
· 转到“Order and Exports”,并检查您刚才添加的.jar文件和Android自己的库。
· 继续之前先把项目清理
设置脸部识别
· 一旦活动被创建了,你必须要执行以下:
· 检查设备上是否支持面部识别功能
· 创建面部识别对象的实例
示例代码
· 如果你能够成功获得面部处理对象的实体,然后做下面的步骤是非常重要的
· 设置识别置信度
· 识别置信度是面部识别引擎识别给定的面部的置信度。
· 设置识别置信的方式,能使脸部引擎忽略任何匹配低于设定置信度阈值的脸型数据。
· 设置处理模式
· 如果使用的是静态图像,使用FP_MODE_STILL。
· 如果要使用实时摄像机预览并不断帧处理,使用FP_MODE_VIDEO
实施用于处理的图像源
· 有两种方法可以获得图像
· 使用摄像头获取图片
· 从设备图片库里选择一张图片
· 对于实现Android相机的方式请参见面部处理用户指南里“使用面部处理”一节。
· 要拍照,只需要实现一个按钮,点击后能拍摄一张照片。
· 一旦安卓相机设置为按上述指引,便可以在活动中执行以下代码
拍照的示例代码:
· 一旦拍照完成时,便可以使用图像数据来执行各种面部识别功能。
· 您可以参考面部识别示例应用程序来看图像数据的处理方式。
面部识别功能
· 到目前为止,我们已经介绍了如何操作一下事项:
· 初始化面部识别目标
· 设置相机拍照
· 现在你可以使用图像数据和各项面部识别方法来实现面部识别。以下各节包括代码段和说明来帮助您了解如何进行面部识别。
添加人物
· 我们使用该API把“添加一位新人物”到面部识别集里
· 请勿使用此API添加同一个人。如果您尝试添加同一个人那么添加人物将反馈错误代码(查看面部处理常量)。
· 此API需要添加人物的脸部指数。
· 当应用程序调用获取面部数据时,面部引擎将索引值分配给处理过的帧中来检测每一面部,一个索引值对应于由获得人脸数据方法返回的人脸数据数组中的索引值。
· 例子1
上面的图片中只有一个脸。因此,该图像获取面部数据将返回1位。数组下标(0)会分配该面部。
· 例子2
上面的图片中有两个脸。因此该图像获取面部数据将返回2位,数组下标(0)会对应于面部1,数组下标(1)对应于面部2。
· 如果已成功添加脸部后,添加人物会根据这个脸返回一个独特的个人ID。
· 注:面部引擎处理的面部的顺序取决于他们与摄像头传感器的距离。这个排序可以根据面部到传感器距离的变化而逐帧地变化。如果你不希望操作所有的数组,你的应用将需要一个外部的方法来确定数组里哪一个人脸是需要操作的。
· 各种方式来获取用户输入(这完全取决于你的应用程序设计):
绘制一个面部矩形和周围每个面对应的索引(文本),并让用户输入他们想要使用的面部索引。
· 采取从屏幕里触摸输入坐标,并检查它是否位于面部矩形内
· 在框架里添加所有的面部
从上面例子2里添加人脸2到认识集里的示例代码:
更新人物
· 我们使用该API来“更新一个现有的人物”到面部识别集里
· 该API有两个参数
· 个人ID:这个是在执行添加人脸前,成功添加人物后会返回一个唯一的ID。
· 人脸索引:跟上面提到的“添加人物”的概念一样
例子:
· 我们将把一个不同的女性脸更新到之前已经加到例子2里的人脸2。
· 如果人物成功更新,个人API会返回值0(成功)。
· 注意:每个人最多能更新十个脸。否则会导致内部错误。
在面部识别集里,样品开始用新的人脸更新一个现有的人物(面部2)的示例代码:
识别人物
· 我们将使用该API来识别一个人物,无论该人物有没有添加到面部识别集中
· 为了识别一个人,将会:
· 可以在指定FACE_IDENTIFICATION枚举中获取面部数据。
· 也可以在没参数情况下获取面部数据,这样将在所有面部数据里让面部引擎去处理图像
· 例子:
· 该例子中,我们假设面部2是先前添加的,面部1还没有添加到面部识别集中。
在给定图像里识别面部的示例代码:
删除人物
· 使用该方法从面部识别集里删除特定人物。
· 删除一个人物会清除所有该人物先前储存图像数据。
· 该API获取一个该删除人物的有效ID。
删除先前添加的脸部2的示例代码:
· 当删除任务操作承购后将返回TRUE,否则将返回FALSE。
重置集
· 使用该方法去删除或清空全部的识别集
· 注意:这个是不可逆的过程
重置全部集的示例代码:
· 如果重置集成功后将会返回TRUE,否则返回FALSE。
序列化和反序列化集
· 在一个实体面部处理对象是在范围内,则面部识别集将通过面部引擎来存储到临时存储器缓冲器里。要重新使用面部识别集就需要序列化集,并保存到永久内存存储。
· 一旦面部处理的对象是早在范围内,您可以通过调用反序列化识别集API来加载现有的(保存)专辑到内存中。
· 序列化识别集API返回到可存储到永久存储器的字节数组。
· 有许多方法可以存储该字节数组。其中一种方法是使用安卓共享参数。
· 提示:在集中做任何改变时,序列化和存储集总会是一个好办法。这将有助于在应用程序从前端意外删除时,防止用户的数据丢失。
序列化集并使用共享参数存储的示例代码:
一旦应用程序返回的时候,我们可以反序列化再利用集。
进行反序列化再利用集的示例代码:
示例代码的使用将服从Snapdragon SDK协议条款。
|