延迟谷歌视觉回调

时间:2016-03-02 06:54:36

标签: android google-vision

我正在使用Google Vision Api进行面部检测。我想在相机中检测到脸部时启用捕捉按钮,否则禁用。它的工作正常,只有问题是当启用了面部按钮时,但面部不可用时,按钮在1 / 1.5秒后禁用,因为在{1}之后调用onDone Tracker回调或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);
        }
    }
  

如何快速获得面部不在相机中的回调   禁用按钮。如何消除延迟?

1 个答案:

答案 0 :(得分:0)

我可以想到在这种情况下延迟的两个原因:使用&#34; post&#34;在上面的代码和vision API&#34; maxGapFrames&#34;设置。

使用&#34; post&#34;在上面的示例中是正确的,但这也会导致延迟。该按钮不会被更新,直到UI开始执行此排队的runnable。如果应用程序的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();

如果您在应用中使用MultiProcessor或LargestFaceFocingProcessor类,那么还有&#34; maxGapFrames&#34;您可以考虑调整的设置:

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)

例如,您可以像这样设置MultiProcessor:

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

默认情况下,这会在脸部不再可见的时间之间添加三帧延迟。&#34; onDone&#34;叫做。只有在面部​​已经消失三帧或更多帧之后才会被调用。但您可以将此设置为零以消除此延迟。

maxGapFrames的目的是避免在&#34;检测到&#34;之间快速振荡。并且&#34;未被发现&#34;状态,因为通常遇到来自未检测到面部的相机的中间模糊帧(即,特别是当没有足够地保持相机时)。但如果这对您的应用来说不是问题,那么将其设置为零应该会有所帮助。