2015-05-19 16 views
11

Es gibt nicht genug Informationen über camera2 Gesichtserkennung Mechanismus. Ich habe Camera2 Beispiel von Google verwendet: android-Camera2BasicAndroid camera2 gesichtserkennung

Ich Gesichtserkennung Modus auf VOLL eingestellt.

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

Auch überprüfte ich

STATISTICS_INFO_MAX_FACE_COUNT und 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); 

Ausgang: maxCount: 5, Modi: [0, 2]

Mein 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); 
    } 

Ausgabe: Gesichter: 0, Modus: 2

public static final int STATISTICS_FACE_DETECT_MODE_FULL = 2; 

Faces Länge konstant 0 ist Sieht aus wie ein Gesicht richtig nicht erkennt oder ich etwas verpasst.

Ich kenne Ansatz mit FaceDetector. Ich wollte nur überprüfen, wie es mit neuen Kamera2 Face funktioniert.

+0

Leider habe ich das gleiche Problem ... Aber es Art und Weise nicht lösen, wie Sie helfen ... Wenn Sie dieses Problem Manege, können Sie einen Link auf GitHub oder anderen resourse geben? Vielen Dank! –

+0

Ich habe das gleiche Problem. Ich verwende ausschließlich Camera2 API. Die lustige Sache ist, dass ich Arbeitscode mit dem Beispiel hier habe: http://StackOverflow.com/Questions/33748760/Camera2-Face-Detection-Call-Back - aber ein anderer Satz von Code, den ich auf eine andere Weise gebaut habe, funktioniert nicht ! Und ich kann den Unterschied nicht herausfinden! Wie du, bekomme ich immer 0 Faces Länge. Ich bin sicher, irgendwann werde ich es entdecken, aber es ist sicher nicht offensichtlich. –

Antwort

0

Meine Versuche waren auf Android 5.0 (API 21). Nach dem Update auf 5.1 (API 22) begann es ohne Code-Änderungen zu arbeiten.

+0

lol nicht ein sehr inspirierendes Ergebnis für die Lepi ist es – Blundell

+0

Sorry, ich habe das gleiche Problem ... Aber es löst nicht so, wie Sie helfen ... Wenn Sie dieses Problem managen, können Sie einen Link auf Github oder geben andere Zuflucht? Vielen Dank! –

0

Ich denke, Ihr Handy mit der Google-Gesichtserkennung funktioniert nicht gut ist. Sind Sie sicher, dass es HAL3 verwendet und API2 verwenden kann ?.

Zum Beispiel habe ich in meinem Code bin wie dies ohne Probleme Erfassungsfläche mit:

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... 
} 

ist die checkFaces Methode:

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); 
     } 
    } 
} 

meine individuelle Gesichtsklasse:

 // 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; 
    } 
} 

schließlich mit dieser Methode können Sie die Gesichter richtig zeichnen (Sie können die Standard-Android eins, b ut Rechtecken funktionieren nicht so gut in 4: 3 oder 16: 9 Größen oder beim Drehen des Telefons:

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; 

    } 

Was ich tue, um die Gesichter im Bildformat und Größe anhand zeichnen. Es ist ein bittlegierter Code, aber ich hoffe, dass es Ihnen helfen wird!

Einen schönen Tag, zögern Sie nicht zu fragen, ob Sie etwas anderes über camera2API benötigen.

0

Ich fand, dass nur in Fall STATE_PREVIEW, Sie das Ergebnis bearbeiten können, um faces lenth zu zeigen.Change from

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; 
      } 
... 

zu

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; 
      } 

Bitte versuchen Sie dies, um zu sehen, ob es funktioniert.