人脸识别技术已经很广泛了,那么我们如何在我们的应用中集成人脸识别呢?Google平台自带有人脸识别功能,下面我们看看如何实现:
//人脸识别当然得打开摄像头
cManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
//open camera
cManager.openCamera(cId, getCDeviceOpenCallback(), getCHandler());
/**
* 初始化并获取相机开启回调对象。当准备就绪后,发起预览请求
*/
@SuppressLint("NewApi")
private CameraDevice.StateCallback getCDeviceOpenCallback() {
if (cDeviceOpenCallback == null) {
cDeviceOpenCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
cDevice = camera;
try {
//创建Session,需先完成画面呈现目标(此处为预览和拍照Surface)的初始化
camera.createCaptureSession(Arrays.asList(getPreviewSurface(), getCaptureSurface()), new
CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
cSession = session;
//构建预览请求,并发起请求
try {
session.setRepeatingRequest(getPreviewRequest(), getPreviewCallback(),
getCHandler());
} catch (CameraAccessException e) {
YlLogger.i(TAG, Log.getStackTraceString(e));
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
session.close();
}
}, getCHandler());
} catch (CameraAccessException e) {
YlLogger.i(TAG, Log.getStackTraceString(e));
}
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {
camera.close();
}
@Override
public void onError(@NonNull CameraDevice camera, int error) {
camera.close();
}
};
}
return cDeviceOpenCallback;
}
/**
* 初始化并获取相机线程处理
*
* @return
*/
private Handler getCHandler() {
if (cHandler == null) {
//单独开一个线程给相机使用
cHandlerThread = new HandlerThread("cHandlerThread");
cHandlerThread.start();
cHandler = new Handler(cHandlerThread.getLooper());
}
return cHandler;
}
上面的代码中有这么一段:
session.setRepeatingRequest(getPreviewRequest(), getPreviewCallback(),getCHandler());
如果之前有点底子的童鞋,应该知道这里的操作就是开启预览,让预览可以实时预览,注意这里有一个CallBack
/**
* 初始化并获取预览回调对象
*
* @return
*/
@SuppressLint("NewApi")
private CameraCaptureSession.CaptureCallback getPreviewCallback() {
if (previewCallback == null) {
previewCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest
request, @NonNull TotalCaptureResult result) {
Face faces[] = result.get(CaptureResult.STATISTICS_FACES);
Log.i(TAG, "检测到有人脸,进行拍照操作:faceLength=" + faces.length);
}
};
}
return previewCallback;
}
上面的代码中可以看出来,Face faces[] = result.get(CaptureResult.STATISTICS_FACES);就是获取人脸坐标,拿到坐标就可以绘制人脸框,也可以做一些关于人脸相关的算法处理。
关于人脸识别就讲到这里,谢谢!