1

Google Vision Api顔検出に使用しています。カメラで顔が検出されたときにキャプチャボタンを有効にしたいのですが、それ以外の場合は無効にします。正常に動作します。問題は、フェイス ボタンが有効になっている場合のみですが、フェイス ボタンが使用できない場合、onDoneコールバックがTracker1 または 1.5 秒後に呼び出されるため、ボタンは 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);
        }
    }

顔がカメラにないというコールバックをすばやく取得するにはどうすればよいので、ボタンを無効にしますか。遅延を取り除く方法は?

4

1 に答える 1

0

この場合の遅延には 2 つの理由が考えられます。上記のコードでの「post」の使用と、Vision API の「maxGapFrames」設定です。

上記の例の「post」の使用は正しいですが、これも遅延の原因になります。UI がこのキューに入れられたランナブルを実行するようになるまで、ボタンは更新されません。アプリの UI スレッドが多くの処理でビジー状態になっている場合は、しばらく時間がかかることがあります。カメラのフレーム レートまたはプレビュー サイズを小さくすると、デバイスが実行する作業の速度が低下し、応答性が向上する可能性があります。

https://developers.google.com/android/reference/com/google/android/gms/vision/CameraSource.Builder.html#setRequestedFps(フロート)

例えば:

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」が呼び出されるまでの間に 3 フレームの遅延が追加されます。onDone が呼び出されるのは、顔が 3 フレーム以上離れた後でのみです。ただし、これをゼロに設定して、この遅延をなくすことができます。

maxGapFrames の目的は、「検出」状態と「非検出」状態の間で急速に変動するのを避けることです。これは、顔が検出されないカメラからのぼやけた中間フレームに遭遇することがよくあるためです (つまり、特にカメラを十分に保持していない場合)。 . ただし、それがアプリにとって問題でない場合は、これをゼロに設定すると役立ちます。

于 2016-03-02T16:12:41.170 に答える