2015-05-19 20 views
11

Không có đủ thông tin về cơ chế nhận diện khuôn mặt camera2. Tôi đã sử dụng mẫu Camera2 từ Google: android-Camera2BasicNhận diện khuôn mặt camera2 của Android

Tôi đã đặt chế độ nhận dạng khuôn mặt thành FULL.

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

Ngoài ra tôi đã kiểm tra

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

Output: MAXCOUNT: 5, chế độ: [0, 2]

CaptureCallback của tôi:

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: khuôn mặt: 0, chế độ: 2

public static final int STATISTICS_FACE_DETECT_MODE_FULL = 2; 

Faces chiều dài là không ngừng 0. Hình như nó không nhận ra một khuôn mặt đúng hay tôi bị mất cái gì.

Tôi biết cách tiếp cận với FaceDetector. Tôi chỉ muốn kiểm tra cách nó hoạt động với máy ảnh mới Face.

+0

Xin lỗi tôi có cùng một vấn đề ... Nhưng nó không giải quyết cách như bạn giúp ... Nếu bạn manege vấn đề này, bạn có thể cung cấp cho một liên kết trên github hoặc khác resourse? Cảm ơn rất nhiều! –

+0

Tôi có cùng một vấn đề. Tôi đang sử dụng API Camera2 độc quyền. Điều thú vị là tôi đã làm việc mã bằng cách sử dụng ví dụ ở đây: http://stackoverflow.com/questions/33748760/camera2-face-detection-call-back - nhưng một bộ mã tôi xây dựng theo một cách khác không hoạt động ! Và tôi không thể tìm ra sự khác biệt! Giống như bạn, tôi luôn luôn nhận được 0 Faces chiều dài. Tôi chắc chắn cuối cùng tôi sẽ khám phá ra nó, nhưng nó chắc chắn không phải là hiển nhiên. –

Trả lời

0

Nỗ lực của tôi là trên Android 5.0 (API 21). Sau khi cập nhật lên 5.1 (API 22) nó bắt đầu hoạt động mà không cần thay đổi mã.

+0

lol không phải là một kết quả rất cảm hứng cho L api là nó – Blundell

+0

Xin lỗi tôi có cùng một vấn đề ... Nhưng nó không giải quyết cách như bạn giúp ... Nếu bạn manege vấn đề này, bạn có thể cung cấp cho một liên kết trên github hoặc khác resourse? Cảm ơn rất nhiều! –

0

Tôi nghĩ rằng điện thoại của bạn không hoạt động tốt với việc phát hiện khuôn mặt của Google. Bạn có chắc chắn rằng nó sử dụng HAL3 và có thể sử dụng API2 ?.

Ví dụ, trong mã của tôi Tôi đang sử dụng nhận diện khuôn mặt mà không cần bất kỳ vấn đề như thế này:

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

Đây là checkFaces phương pháp:

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

tôi lớp tùy chỉnh khuôn mặt:

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

cuối cùng với phương pháp này bạn có thể vẽ các khuôn mặt chính xác (bạn có thể sử dụng một android mặc định, b ut hình chữ nhật không hoạt động tốt ở kích thước 4: 3 hoặc 16: 9 hoặc khi bạn xoay điện thoại:

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; 

    } 

Điều tôi đang làm là vẽ khuôn mặt dựa trên tỷ lệ màn hình và kích thước. Đó là một đoạn mã dễ thương, nhưng tôi hy vọng nó sẽ giúp bạn!

Chúc một ngày tốt đẹp, vui lòng hỏi xem bạn có cần điều gì khác về camera2API không.

0

Tôi thấy rằng chỉ trong trường hợp STATE_PREVIEW, bạn có thể xử lý kết quả để hiển thị khuôn mặt thứ mười.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; 
      } 
... 

để

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

Vui lòng thử này để xem nếu nó hoạt động.

Các vấn đề liên quan