2016-03-02 53 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