即从摄像头预览中检测到人脸的存在,并且使用一个矩形框出人脸的范围。
人脸注册 (RegisterActivity)
即将一张图片中的人脸信息,提取出特征值,将该特征值与人员信息建立联系。
人脸识别 (FR引擎)
2. 人脸注册
人脸注册是整个识别流程的基础,Demo中人脸注册的流程是在 RegsiterActivity 文件中处理的,该页面启动的时候接受 Intent 中传来的 imagePath 信息(图片地址);
第一步是获取待注册的照片,我们可以可以使用摄像头,也可以使用照片。
获取图片后,将获得的图片转为 Bitmap,然后将其转化成 NV21 格式的 Byte 数组,因为我们使用的sdk只能处理 NV21 格式的数据,NV21 格式限制高度不能为奇数;
mBitmap = Application.decodeImage(mFilePath);
src.set(0,0,mBitmap.getWidth(),mBitmap.getHeight());
mSurfaceView = (SurfaceView)this.findViewById(R.id.surfaceView);
mSurfaceView.getHolder().addCallback(this);
view = new Thread(new Runnable() {
@Override
public void run() {
//等待holder创建
while (mSurfaceHolder == null) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//创建字节数组 大小由拍照传来的图片尺寸决定
byte[] data = new byte[mBitmap.getWidth() * mBitmap.getHeight() * 3 / 2];
try {
//将bitmap转换成nv21,结果保存到data数组中
ImageConverter convert = new ImageConverter();
convert.initial(mBitmap.getWidth(), mBitmap.getHeight(), ImageConverter.CP_PAF_NV21);
if (convert.convert(mBitmap, data)) {
Log.d(TAG, “convert ok!”);
}
convert.destroy();
} catch (Exception e) {
e.printStackTrace();
}
第二步:
AFD_FSDKFace是人脸识别的结果,定义如下:
public class AFD_FSDKFace {
android.graphics.Rect mRect;
int mDegree;
}
调用AFD_FSDK_StillImageFaceDetection返回检测到的人脸信息
//创建FD人脸检测引擎
AFD_FSDKEngine engine = new AFD_FSDKEngine();
AFD_FSDKVersion version = new AFD_FSDKVersion();
List<AFD_FSDKFace> result = new ArrayList<AFD_FSDKFace>(); //注册结果? 人脸探测结果
//初始化引擎
AFD_FSDKError err = engine.AFD_FSDK_InitialFaceEngine(
FaceDB.appid, FaceDB.fd_key, AFD_FSDKEngine.AFD_OPF_0_HIGHER_EXT, 16, 300);
//错误码
Log.d(TAG, "AFD_FSDK_InitialFaceEngine = " + err.getCode());
if (err.getCode() != AFD_FSDKError.MOK) {
//引擎初始化失败
Message reg = Mes