2016-03-08 66 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

对不起,我已经尝试为自己解决这个问题,但又没有成功......我并没有确切地忽略你的意思,“看哪些代码路径被激活”? –