2016-03-02 54 views
1

我正在使用Google Vision Api进行人脸检测。我想在相机中检测到脸部时启用拍摄按钮,否则禁用。它的工作正常,只有问题是当启用了面部按钮时,但面部不可用时,按钮在1/1.5秒后禁用,因为onDone回调Tracker在1或1.5秒后被调用。谷歌视力回调延迟

private class GraphicFaceTracker extends Tracker<Face> { 
     private GraphicOverlay mOverlay; 
     private FaceGraphic mFaceGraphic; 

     GraphicFaceTracker(GraphicOverlay overlay) { 
      mOverlay = overlay; 
      mFaceGraphic = new FaceGraphic(overlay); 
     } 

     /** 
     * Start tracking the detected face instance within the face overlay. 
     */ 
     @Override 
     public void onNewItem(int faceId, Face item) { 
      mFaceGraphic.setId(faceId); 
     } 

     /** 
     * Update the position/characteristics of the face within the overlay. 
     */ 
     @Override 
     public void onUpdate(FaceDetector.Detections<Face> detectionResults, Face face) { 
      mOverlay.add(mFaceGraphic); 
      mFaceGraphic.updateFace(face); 
      iv.post(new Runnable() { 
       @Override 
       public void run() { 
        iv.setEnabled(true); 
       } 
      }); 
     } 

     /** 
     * Hide the graphic when the corresponding face was not detected. This can happen for 
     * intermediate frames temporarily (e.g., if the face was momentarily blocked from 
     * view). 
     */ 
     @Override 
     public void onMissing(FaceDetector.Detections<Face> detectionResults) { 
      mOverlay.remove(mFaceGraphic); 
     } 

     /** 
     * Called when the face is assumed to be gone for good. Remove the graphic annotation from 
     * the overlay. 
     */ 
     @Override 
     public void onDone() { 
      iv.post(new Runnable() { 
       @Override 
       public void run() { 
        iv.setEnabled(false); 
       } 
      }); 
      mOverlay.remove(mFaceGraphic); 
     } 
    } 

我怎么能很快发现,面对的是相机内没有回调使 禁用按钮。如何消除延迟?

回答

0

我可以想到在这种情况下延迟的两个原因:在上面的代码中使用“post”和视觉API的“maxGapFrames”设置。

在上例中使用“post”是正确的,但这也会导致延迟。在用户界面开始执行这个排队的可运行命令之前,该按钮不会被更新。如果应用的UI线程忙于做很多事情,那么这可能是一段时间。有一两件事,可能有助于将降低摄像机的帧速率或预览大小,因为这会降低该装置正在做和工作的速度或许更加适应:

https://developers.google.com/android/reference/com/google/android/gms/vision/CameraSource.Builder.html#setRequestedFps(float)

例如:

mCameraSource = new CameraSource.Builder(context, detector) 
    .setRequestedPreviewSize(640, 480) 
    .setFacing(CameraSource.CAMERA_FACING_BACK) 
    .setRequestedFps(15.0f) 
    .build(); 

如果您使用的是在您的应用程序的多处理器或LargestFaceFocingProcessor类,也有“maxGapFrames”的设置,你可能会考虑调整:

https://developers.google.com/android/reference/com/google/android/gms/vision/MultiProcessor.Builder.html#setMaxGapFrames(int)

https://developers.google.com/android/reference/com/google/android/gms/vision/face/LargestFaceFocusingProcessor.Builder.html#setMaxGapFrames(int)

例如,你可以设置你的多处理器这样的:

detector.setProcessor(
    new MultiProcessor.Builder<>(new GraphicFaceTrackerFactory()) 
     .setMaxGapFrames(0) 
     .build()); 

默认情况下,这将增加时,面对的是不再可见时之间的三帧延迟“ onDone“被调用。只有在脸部消失三帧或更长时间后,才会被调用。但是您可以将其设置为零以消除此延迟。

maxGapFrames的目的是为了避免在“检测到”和“未检测”状态之间快速振荡,因为通常遇到来自未检测到面部的相机的中间模糊帧(即,尤其是当不握住相机仍然够用)。但是,如果这对于您的应用来说不是问题,那么将其设置为零应该会有所帮助。

+0

我正在使用CameraSourcer.Builder,是否提供框架延迟发生在setMaxGapFrames的情况下,我认为MaxGapFrames是提供即时回调,该面孔不在相机中的东西。我对吗???如果是,那么如何使用CameraSource.Builder实现这个? –

+0

我在上面添加了一些代码示例。相机源上未设置maxGapFrames;它在面部检测完成后运行的“处理器”实例上设置。另请参阅此代码示例以了解相机源,检测器和处理器如何放在一起:https://github.com/googlesamples/android-vision/blob/master/visionSamples/FaceTracker/app/src/main/java/com /google/android/gms/samples/vision/face/facetracker/FaceTrackerActivity.java#L125 – pm0733464