Использование Google Mobile Vision FaceDetector для обнаружения лица при обратном вызове onPreviewFrame?

Я использовал com.google.android.gms.vision.face.FaceDetector для обнаружения лиц в обратном вызове предварительного просмотра камеры, как показано ниже:

faceDetector = new FaceDetector.Builder(this)
                .setTrackingEnabled(false)
                .setMode(FaceDetector.FAST_MODE)
                .setLandmarkType(FaceDetector.ALL_LANDMARKS)
                .build();

mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {
    @Override
    public void onPreviewFrame(final byte[] data, Camera camera) {
        if (faceDetector.isOperational()) {
            int format = camera.getParameters().getPreviewFormat();
            int width = camera.getParameters().getPreviewSize().width;
            int height = camera.getParameters().getPreviewSize().height;

            Frame frame = new Frame.Builder().setImageData(ByteBuffer.wrap(data), width, height, format).build();
            SparseArray<Face> faces = faceDetector.detect(frame);
            Log.d("TEST", "Num faces = " + faces.size());
        }

        mSurfaceView.requestRender();

        camera.addCallbackBuffer(mImageBuffer);
    }
});

Однако вывод всегда Num faces = 0. Как я могу это исправить?


person hoangdado    schedule 12.10.2017    source источник


Ответы (1)


Вы сделали одну ошибку. Ваш код должен выглядеть так:

faceDetector = new FaceDetector.Builder(this)
                .setTrackingEnabled(false)
                .setMode(FaceDetector.FAST_MODE)
                .setLandmarkType(FaceDetector.ALL_LANDMARKS)
                .build();

mCamera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {
    @Override
    public void onPreviewFrame(final byte[] data, Camera camera) {
        if(!faceDetector.isOperational()){
            Log.e("TEST", "Could not set up the face detector!");
        } else {
            int format = camera.getParameters().getPreviewFormat();
            int width = camera.getParameters().getPreviewSize().width;
            int height = camera.getParameters().getPreviewSize().height;

            Frame frame = new Frame.Builder().setImageData(ByteBuffer.wrap(data), width, height, format).build();
            SparseArray<Face> faces = faceDetector.detect(frame);
            Log.d("TEST", "Num faces = " + faces.size());
        }

        mSurfaceView.requestRender();

        camera.addCallbackBuffer(mImageBuffer);
    }
});
person user0001239128    schedule 21.09.2018