1

Google Vision Api用于人脸检测。我想在相机中检测到面部时启用捕获按钮,否则禁用。它工作正常,唯一的问题是当启用了面部按钮,但面部不可用时,按钮在 1/1.5 秒后禁用,因为在 1 或 1.5 秒后onDone调用回调Tracker

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);
        }
    }

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

4

1 回答 1

0

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

上例中“post”的使用是正确的,但这也会导致延迟。在 UI 开始执行此排队的可运行文件之前,该按钮不会更新。如果应用程序的 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 类,您还可以考虑调整“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)

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

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

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

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

于 2016-03-02T16:12:41.170 回答