Android-камера2 распознавание лица

Недостаточно информации о механизме распознавания лица камеры2. Я использовал образец Camera2 от Google: android-Camera2Basic

Я установил режим распознавания лиц в ПОЛНЫЙ.

mPreviewRequestBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE, CameraMetadata.STATISTICS_FACE_DETECT_MODE_FULL); 

Также я проверил

STATISTICS_INFO_MAX_FACE_COUNT и STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES :

 int max_count = characteristics.get( CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT); int modes [] = characteristics.get( CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES); 

Выход : maxCount: 5, режимы: [0, 2]

Мой 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); } 

Выход : грани: 0, режим: 2

  public static final int STATISTICS_FACE_DETECT_MODE_FULL = 2; 

Длина лица постоянно 0. Похоже, что она не распознает лицо должным образом или я что-то пропустил.

Я знаю подход с FaceDetector . Я просто хотел проверить, как это работает с новым Camera2 Face .

Solutions Collecting From Web of "Android-камера2 распознавание лица"

Мои попытки были на Android 5.0 (API 21). После обновления до версии 5.1 (API 22) он начал работать без изменений кода.

Я думаю, что ваш телефон не работает с обнаружением Google Face. Вы уверены, что он использует HAL3 и может использовать API2 ?.

Например, в моем коде я использую распознавание лиц без каких-либо проблем:

  private CameraCaptureSession.CaptureCallback mPhotoCaptureCallback = new CameraCaptureSession.CaptureCallback() { //more code... private void process(CaptureResult result) { switch (mState) { case STATE_PREVIEW: { checkFaces(result.get(CaptureResult.STATISTICS_FACES)); //more code.... break; } //more code... } 

Вот метод checkFaces:

  private void checkFaces(Face[] faces) { if (faces != null) { CameraUtil.CustomFace[] mMappedCustomFaces; mMappedCustomFaces = computeFacesFromCameraCoordinates(faces); if (faces != null && faces.length > 0) { mHandler.sendEmptyMessage(SHOW_FACES_MSG); mLastTimeRenderingFaces = System.currentTimeMillis(); } } else { if (System.currentTimeMillis() > (mLastTimeRenderingFaces + 100)) { mHandler.sendEmptyMessage(HIDE_FACES_MSG); } } } 

Мой пользовательский класс лица:

  // public static class CustomFace extends Camera.CustomFace{ public static class CustomFace { private int score = 0; private Rect rect = null; public CustomFace(Rect rect, int score) { this.score = score; this.rect = rect; } public int getScore() { return score; } public Rect getBounds() { return rect; } } 

Наконец, с помощью этого метода вы можете правильно рисовать лица (вы можете использовать андроид по умолчанию, но прямоугольники не работают так хорошо в размерах 4: 3 или 16: 9 или при повороте телефона:

  public static RectF rectToRectF(Rect r) { return new RectF(r.left, r.top, r.right, r.bottom); } private CameraFaceUtil.CustomFace[] computeFacesFromCameraCoordinates(Face[] faces) { CameraFaceUtil.CustomFace[] mappedFacesList = new CameraFaceUtil.CustomFace[faces.length]; mCameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); float toStandardAspectRatio = ((float) mPreviewRect.bottom / (float) mPreviewRect.right) / AutoFitTextureView.RATIO_STANDARD; // for (int i = 0; i < faces.length; i++) { RectF mappedRect = new RectF(); Log.i(TAG, "[computeFacesFromCameraCoordinates] toStandardAspectRatio: " + toStandardAspectRatio); Log.i(TAG, "[computeFacesFromCameraCoordinates] preview rect: " + mPreviewRect); Log.i(TAG, "[computeFacesFromCameraCoordinates] raw rect: " + faces[i].getBounds()); mCameraToPreviewMatrix.mapRect(mappedRect, CameraUtil.rectToRectF(faces[i].getBounds())); Log.i(TAG, "[computeFacesFromCameraCoordinates] mapped rect: " + mappedRect); Rect auxRect = new Rect(CameraUtil.rectFToRect(mappedRect)); Log.i(TAG, "[computeFacesFromCameraCoordinates] aux rect: " + auxRect); int cameraSensorOrientation = mCameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION); Log.i(TAG, "[computeFacesFromCameraCoordinates] cameraSensorOrientation: " + cameraSensorOrientation); switch (cameraSensorOrientation) { case 90: mappedRect.top = auxRect.left; mappedRect.bottom = auxRect.right; mappedRect.left = (mPreviewRect.right - auxRect.bottom); mappedRect.right = (mPreviewRect.right - auxRect.top); break; case 180: mappedRect.top = (mPreviewRect.bottom - auxRect.bottom) * toStandardAspectRatio; mappedRect.bottom = (mPreviewRect.bottom - auxRect.top) * toStandardAspectRatio; mappedRect.left = (mPreviewRect.right - auxRect.right) * toStandardAspectRatio; mappedRect.right = (mPreviewRect.right - auxRect.left) * toStandardAspectRatio; break; case 270: mappedRect.top = (mPreviewRect.bottom - auxRect.right) * toStandardAspectRatio; mappedRect.bottom = (mPreviewRect.bottom - auxRect.left) * toStandardAspectRatio; mappedRect.left = auxRect.top; mappedRect.right = auxRect.bottom; break; } Log.i(TAG, "[computeFacesFromCameraCoordinates] rotated by camera driver orientation rect without scale: " + mappedRect + ", with score: " + faces[i].getScore()); float topOffset = mappedRect.top; float leftOffset = mappedRect.left; mappedRect.top = mappedRect.top * toStandardAspectRatio; mappedRect.bottom = mappedRect.bottom * toStandardAspectRatio; mappedRect.left = mappedRect.left * toStandardAspectRatio; mappedRect.right = mappedRect.right * toStandardAspectRatio; Log.i(TAG, "[computeFacesFromCameraCoordinates] rotated by camera driver orientation rect with scale: " + mappedRect + ", with score: " + faces[i].getScore()); topOffset = mappedRect.top - topOffset; leftOffset = mappedRect.left - leftOffset; mappedRect.top -= topOffset /*- (mMirror ? mPreviewRect.height() : 0)*/; mappedRect.bottom -= topOffset /* - (mMirror ? mPreviewRect.height() : 0)*/; mappedRect.left -= leftOffset; mappedRect.right -= leftOffset; Log.i(TAG, "[computeFacesFromCameraCoordinates] rotated by camera driver orientation rect with offset: " + mappedRect + " topOffset " + topOffset + " leftOffset " + leftOffset); // set the new values to the mapping array to get rendered mappedFacesList[i] = new CameraFaceUtil.CustomFace(CameraUtil.rectFToRect(mappedRect), faces[i].getScore()); } return mappedFacesList; } 

То, что я делаю, – это рисование лиц на основе соотношения и размера экрана. Это классный код, но я надеюсь, что он вам поможет!

Приятного дня, не стесняйтесь спрашивать, нужно ли вам что-то еще о camera2API.

https://github.com/rajktariya/Android-Camera2-Front-with-Face-Detection

Нашел этот рабочий образец для передней камеры с обнаружением лица

Я обнаружил, что только в случае STATE_PREVIEW вы можете обработать результат, чтобы показать лица lenth. Меняться от

 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); } switch (mState) { case STATE_PREVIEW: { // We have nothing to do when the camera preview is working normally. break; } ... 

в

 private CameraCaptureSession.CaptureCallback mCaptureCallback = new CameraCaptureSession.CaptureCallback() { private void process(CaptureResult result) { switch (mState) { case STATE_PREVIEW: { Face[] faces = result.get(CaptureResult.STATISTICS_FACES); if (faces != null && faces.length > 0) { Log.e("tag", "faces : " + faces.length); } break; } 

Попробуйте это, чтобы узнать, работает ли он.