2016-03-08 69 views
6

關於官方消息來源沒有找到這些信息......有很多關於如何使用Camera API的例子,但是如何使用Camera2API來處理任何事情......在Stake和所有......上進行的一些討論......有一個類似的問題,但我有一個問題沒有解決。 ..誰有材料如何使用人臉檢測相機2 API?

鏈接到同一quetion: Android camera2 face recognition

我注意到Google's API for Camera 2的例子。

這就是我做什麼,但我沒有檢測到人臉:

我添加的事件

private void createCameraPreviewSession() { 
    try { 
     SurfaceTexture texture = mTextureView.getSurfaceTexture(); 
     assert texture != null; 

     // We configure the size of default buffer to be the size of camera preview we want. 
     texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 

     // This is the output Surface we need to start preview. 
     Surface surface = new Surface(texture); 

     // We set up a CaptureRequest.Builder with the output Surface. 
     mPreviewRequestBuilder 
       = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
     mPreviewRequestBuilder.addTarget(surface); 

     // Here, we create a CameraCaptureSession for camera preview. 
     mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), 
       new CameraCaptureSession.StateCallback() { 

        @Override 
        public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { 
         // The camera is already closed 
         if (null == mCameraDevice) { 
          return; 
         } 

         // When the session is ready, we start displaying the preview. 
         mCaptureSession = cameraCaptureSession; 
         try { 



//   ---->>   Установка модуля распознания лица 
          mPreviewRequestBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE, 
            CameraMetadata.STATISTICS_FACE_DETECT_MODE_FULL); 



          // Auto focus should be continuous for camera preview. 
          mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, 
            CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 

          // Flash is automatically enabled when necessary. 
          setAutoFlash(mPreviewRequestBuilder); 

          // Finally, we start displaying the camera preview. 
          mPreviewRequest = mPreviewRequestBuilder.build(); 

          mCaptureSession.setRepeatingRequest(mPreviewRequest, 
            mCaptureCallback, mBackgroundHandler); 
         } catch (CameraAccessException e) { 
          e.printStackTrace(); 
         } 
        } 

        @Override 
        public void onConfigureFailed(
          @NonNull CameraCaptureSession cameraCaptureSession) { 
         System.out.println("Failed строка 757"); 
        } 
       }, null 
     ); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

private CameraCaptureSession.CaptureCallback mCaptureCallback 
     = new CameraCaptureSession.CaptureCallback() { 

    @Override 
    public void onCaptureProgressed(@NonNull CameraCaptureSession session, 
            @NonNull CaptureRequest request, 
            @NonNull CaptureResult partialResult) { 
     process(partialResult); 
    } 

    @Override 
    public void onCaptureCompleted(@NonNull CameraCaptureSession session, 
            @NonNull CaptureRequest request, 
            @NonNull TotalCaptureResult result) { 
     process(result); 
    } 

    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) 
      System.out.println("tagDDDDDDDDDDDDDDDDDDDDDDDD" + "faces : " + 
        faces.length + " , mode : " + mode); 

     switch (mState) { 
      case STATE_PREVIEW: { 
       // We have nothing to do when the camera preview is working normally. 

//     Here i set Face Detection 
       mPreviewRequestBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE, 
         CameraMetadata.STATISTICS_FACE_DETECT_MODE_FULL); 
       break; 
      } 

我在這裏檢查面的最大計數該相機可以得到

private void setUpCameraOutputs(int width, int height) { 

    CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); 
    try { 
     for (String cameraId : manager.getCameraIdList()) { 
      CameraCharacteristics characteristics 
        = manager.getCameraCharacteristics(cameraId); 

      // We don't use a front facing camera in this sample. 
      Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING); 
      if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) { 
       continue; 
      } 

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

      System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! max_count " + max_count + " modes " + modes); 

**輸出爲:**

I/System.out: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! max_count 16 modes [[email protected] 

**這是一個什麼樣的打印日誌**

03-08 18:34:07.018 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1 
03-08 18:34:07.048 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1 
03-08 18:34:07.078 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1 
03-08 18:34:07.118 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1 
03-08 18:34:07.148 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1 
03-08 18:34:07.178 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1 
03-08 18:34:07.218 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1 
03-08 18:34:07.258 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1 
03-08 18:34:07.288 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1 
03-08 18:34:07.308 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1 
03-08 18:34:07.348 7405-7438/com.example.android.camera2basic I/System.out: tagDDDDDDDDDDDDDDDDDDDDDDDDfaces : 0 , mode : 1 

爲什麼它不reterning臉?如果有人有正確的工作範例,請給予鏈接。我如何使用camera2API進行人臉檢測。在整個星期內,我無法理解((

+0

你讀過這裏的android開發者信息:http://developer.android.com/reference/android/hardware/camera2/package-summary.html? –

+0

是的,但它只是一般的描述...它如何在人臉檢測相機2 API halp我? –

+0

這些幫助嗎? 1)https://developer.qualcomm.com/software/snapdragon-sdk-android/facial-recognition/user-guide(2)http://code.tutsplus.com/tutorials/an-introduction-to-face- detection-on-android - cms-25212(3)http://androidbite.blogspot.in/2012/11/android-face-detection-example.html – Stallion

回答

2

)隨着播放服務8.3,Google推出了Mobile Vision API,它包括一個易於使用的API,稱爲Face API,用於檢測圖像和視頻中的人臉,不要將其與臉部混淆識別如人臉API當前僅支持檢測。

Face API detecting human faces

檢測面部

當API檢測到人臉時,它被返回作爲面部對象。 Face對象提供面部的空間數據,因此您可以爲例如 示例繪製圍繞面部的邊界矩形,或者如果在面上使用 地標,則可以在正確的 位置添加要素到面部,如給一個人一頂新帽子。

Landmarks detected by Face API

它還配備了清涼的方法,如用戶是否在微笑:)或者是他眨眼;)等,僅舉幾例。

查閱文檔和參考瞭解更多信息。

  1. Mobile Vision: Find objects in photos and video, using real-time on-device vision technology.
  2. Face API- Google Developers
  3. Mobile Vision- Youtube
  4. Android developers- Face detection API

希望這有助於:)

+0

真的沒有,我已經閱讀了所有的資源,但是做錯了,我沒有得到臉......它總是返回0.這就是爲什麼我問例 –

+0

你嘗試過臉部API? –

+0

是的,我試過了......但據我瞭解,它不適用於相機2 API ...有照片上的臉部檢測樣本,但我需要預覽...並沒有代碼示例如何實現它 –

0

阿列克謝,

你Reques tBuilder看起來是正確的,但我認爲問題在於你如何選擇使用的攝像設備。我有和你一樣的設置,它正在工作。

private boolean setUpCameraOutputs() { 
    Activity activity = getActivity(); 
    CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); 
    if (manager == null) { 
     ErrorDialog.buildErrorDialog("This device doesn't support the Camera2 API."). 
      show(getFragmentManager(), "dialog"); 
     return false; 
    } 
    try { 
     // Find a CameraDevice that supports Face recognition, and configure state. 
     for (String cameraId : manager.getCameraIdList()) { 
      CameraCharacteristics characteristics 
        = manager.getCameraCharacteristics(cameraId); 

      // We only use a camera that supports Faces. 
      if (!contains(characteristics.get(
          CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES), 
        CameraCharacteristics.STATISTICS_FACE_DETECT_MODE_SIMPLE)) { 
       continue; 
      } 

      StreamConfigurationMap map = characteristics.get(
        CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); 

      synchronized (mCameraStateLock) { 
       mCharacteristics = characteristics; 
       mCameraId = cameraId; 
      } 
      return true; 
     } 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 

    // If we found no suitable cameras for capturing Faces, warn the user. 
    ErrorDialog.buildErrorDialog("This device doesn't support Face detection"). 
      show(getFragmentManager(), "dialog"); 
    return false; 
} 

希望上面的代碼至少可以幫助您確定問題出在您的設備還是您訪問攝像頭的方式。

+0

感謝您的回答!但我知道攝像頭工作正常,因爲我得到了這個輸出'max_count 16'這意味着我的設備可以計數16個面孔......第二個事實,在我的應用程序中,我只使用後視攝像頭,這意味着它應該檢測臉部,因爲它是主要的相機...但它仍然沒有檢測到...我真的是Android的新手。如果您的應用程序在臉部檢測方面取得了成功,您是否可以向我展示您的代碼中的這部分內容? –

+0

因爲我使用了與您的工作示例相同的googlesamples項目,所以唯一區別應該在此模塊中。你可以嘗試交換上面的代碼,看看哪些代碼路徑被激活?這可能暗示罪魁禍首。 –

+0

對不起,我已經嘗試爲自己解決這個問題,但又沒有成功......我並沒有確切地忽略你的意思,「看哪些代碼路徑被激活」? –