我的List <firebasevisionface>面孔始终为空

时间:2019-02-12 16:02:42

标签: java firebase firebase-mlkit

我正在用一个简单的应用程序实现MLKit人脸检测库。该应用程序是一个面部监控系统,因此我正在设置前置摄像头的预览供稿,并尝试检测面部。我正在使用camera2Api。在我的ImageReader.onImageAvailableListener上,我想对图像中的每次读取实施firebase人脸检测。创建我的FirebaseVisionImage并运行FirebaseVisionFaceDetector后,我得到一个空的面孔列表,其中应该包含检测到的面孔,但是即使图像中有面孔,我也总是得到大小为0的面孔。

我尝试了其他方式来创建FirebaseVisionImage。目前,我正在通过使用我在MlKit文档之后创建的byteArray来创建它。我还尝试过使用媒体Image对象创建FirebaseVisionImage。

private final ImageReader.OnImageAvailableListener onPreviewImageAvailableListener = new ImageReader.OnImageAvailableListener() {

    /**Get Image convert to Byte Array **/
    @Override
    public void onImageAvailable(ImageReader reader) {

        //Get latest image
        Image mImage = reader.acquireNextImage();

        if(mImage == null){
            return;
        }
        else {

            byte[] newImg = convertYUV420888ToNV21(mImage);

            FirebaseApp.initializeApp(MonitoringFeedActivity.this);

            FirebaseVisionFaceDetectorOptions highAccuracyOpts =
                    new FirebaseVisionFaceDetectorOptions.Builder()
                            .setPerformanceMode(FirebaseVisionFaceDetectorOptions.ACCURATE)
                            .setLandmarkMode(FirebaseVisionFaceDetectorOptions.ALL_LANDMARKS)
                            .setClassificationMode(FirebaseVisionFaceDetectorOptions.ALL_CLASSIFICATIONS)
                            .build();

            int rotation = getRotationCompensation(frontCameraId,MonitoringFeedActivity.this, getApplicationContext() );

            FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
                    .setWidth(480)   // 480x360 is typically sufficient for
                    .setHeight(360)  // image recognition
                    .setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
                    .setRotation(rotation)
                    .build();

            FirebaseVisionImage image = FirebaseVisionImage.fromByteArray(newImg, metadata);

            FirebaseVisionFaceDetector detector = FirebaseVision.getInstance()
                    .getVisionFaceDetector(highAccuracyOpts);

            Task<List<FirebaseVisionFace>> result =
                    detector.detectInImage(image)
                            .addOnSuccessListener(
                                    new OnSuccessListener<List<FirebaseVisionFace>>() {
                                        @Override
                                        public void onSuccess(List<FirebaseVisionFace> faces) {
                                            // Task completed successfully
                                            if (faces.size() != 0) {
                                                Log.i(TAG, String.valueOf(faces.get(0).getSmilingProbability()));
                                            }
                                        }

                                    })
                            .addOnFailureListener(
                                    new OnFailureListener() {
                                        @Override
                                        public void onFailure(@NonNull Exception e) {
                                            // Task failed with an exception
                                            // ...
                                        }
                                    });

            mImage.close();

目的是使生成的面部列表包含每个已处理图像中检测到的面部。

1 个答案:

答案 0 :(得分:0)

byte [] newImg = convertYUV420888ToNV21(mImage); FirebaseVisionImage图片= FirebaseVisionImage.fromByteArray(newImg,元数据);

这两行很重要。确保其创建正确的VisionImage。

检出我的项目的所有功能

MLKIT demo