使用 android.hardware.Camera2 进行人脸检测
Face detection with android.hardware.Camera2
我正在使用 https://github.com/googlesamples/android-Camera2Basic。
我把人脸识别模式设置为FULL
´mPreviewRequestBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE,
CameraMetadata.STATISTICS_FACE_DETECT_MODE_FULL);
我的 CaptureCallback:
private CameraCaptureSession.CaptureCallback mCaptureCallback
= new CameraCaptureSession.CaptureCallback() {
private void process(CaptureResult result) {
Integer mode = result.get(CaptureResult.STATISTICS_FACE_DETECT_MODE);
Face [] faces = result.get(CaptureResult.STATISTICS_FACES);
if(faces != null && mode != null)
Log.e("tag", "faces : " + faces.length + " , mode : " + mode );
}
@Override
public void onCaptureProgressed(CameraCaptureSession session, CaptureRequest request,
CaptureResult partialResult) {
process(partialResult);
}
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
TotalCaptureResult result) {
process(result);
}
Output: faces : 0 , mode : 2
人脸长度始终为 0。看起来它没有正确识别人脸,或者我遗漏了什么。
您应该阅读设备可用的面部检测模式,方法是:
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
for (String cameraId : manager.getCameraIdList()) {
CameraCharacteristics characteristics
= manager.getCameraCharacteristics(cameraId);
int[] faceDetectModes = characteristics.get(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES);
}
使用该 int 数组中具有最大值的索引,因为 0
表示 STATISTICS_FACE_DETECT_MODE_OFF
,1
表示 STATISTICS_FACE_DETECT_MODE_SIMPLE
而 2
是 STATISTICS_FACE_DETECT_MODE_FULL
.
您的设备可能返回 0 或 1。如果是这种情况,"simple face detection" 将只需要这样做,而不是 "full"。
如果仍然没有帮助,请检查您使用的是前置摄像头还是后置摄像头,然后尝试使用相反的摄像头(您提到的示例源代码在如何实现这一点上非常简单)。
我正在使用 https://github.com/googlesamples/android-Camera2Basic。
我把人脸识别模式设置为FULL
´mPreviewRequestBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE,
CameraMetadata.STATISTICS_FACE_DETECT_MODE_FULL);
我的 CaptureCallback:
private CameraCaptureSession.CaptureCallback mCaptureCallback
= new CameraCaptureSession.CaptureCallback() {
private void process(CaptureResult result) {
Integer mode = result.get(CaptureResult.STATISTICS_FACE_DETECT_MODE);
Face [] faces = result.get(CaptureResult.STATISTICS_FACES);
if(faces != null && mode != null)
Log.e("tag", "faces : " + faces.length + " , mode : " + mode );
}
@Override
public void onCaptureProgressed(CameraCaptureSession session, CaptureRequest request,
CaptureResult partialResult) {
process(partialResult);
}
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
TotalCaptureResult result) {
process(result);
}
Output: faces : 0 , mode : 2
人脸长度始终为 0。看起来它没有正确识别人脸,或者我遗漏了什么。
您应该阅读设备可用的面部检测模式,方法是:
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
for (String cameraId : manager.getCameraIdList()) {
CameraCharacteristics characteristics
= manager.getCameraCharacteristics(cameraId);
int[] faceDetectModes = characteristics.get(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES);
}
使用该 int 数组中具有最大值的索引,因为 0
表示 STATISTICS_FACE_DETECT_MODE_OFF
,1
表示 STATISTICS_FACE_DETECT_MODE_SIMPLE
而 2
是 STATISTICS_FACE_DETECT_MODE_FULL
.
您的设备可能返回 0 或 1。如果是这种情况,"simple face detection" 将只需要这样做,而不是 "full"。
如果仍然没有帮助,请检查您使用的是前置摄像头还是后置摄像头,然后尝试使用相反的摄像头(您提到的示例源代码在如何实现这一点上非常简单)。