Список FirebaseVisionBarcode пуст после захвата штрих-кода изображения - PullRequest
0 голосов
/ 26 октября 2019

В настоящее время для тестирования используется устройство Nexus 5.
После захвата изображения, содержащего штрих-код UPC-A, вызывается метод onSuccess для FirebaseVisionBarcodeDetector. Тем не менее, список пуст. Не уверен, что может вызвать эту проблему.



      CameraManager camera_manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);

      try{

          CameraCharacteristics camera_characteristics = camera_manager.getCameraCharacteristics(camera_device.getId());

          Size [] yuvSizes = null;
          if (camera_characteristics != null) {
              yuvSizes = camera_characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputSizes(ImageFormat.YUV_420_888);
          }
          int width = 640;
          int height = 480;
          if (yuvSizes != null && 0 < yuvSizes.length) {
              width = yuvSizes[0].getWidth();
              height = yuvSizes[0].getHeight();
          }

          image_reader = ImageReader.newInstance(width, height, ImageFormat.YUV_420_888, 1);
          List<Surface> output_surface = new ArrayList<Surface>(2);
          output_surface.add(image_reader.getSurface());
          output_surface.add(new Surface(texture_view.getSurfaceTexture()));

          final CaptureRequest.Builder capture_builder = camera_device.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
          capture_builder.addTarget(image_reader.getSurface());
          capture_builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
          capture_builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
          ImageReader.OnImageAvailableListener reader_listener = new ImageReader.OnImageAvailableListener() {
              @Override
              public void onImageAvailable(ImageReader reader) {

                  Image image = reader.acquireLatestImage();
                  upc_image = image;

                  if(image != null){

                      upc_image = image;

                      Scan scan = new Scan(Camera.this, Camera.this, upc_image);
                      scan.scanning();

                  }

              }
          };

          image_reader.setOnImageAvailableListener(reader_listener, background_handler);
          final CameraCaptureSession.CaptureCallback capture_callback = new CameraCaptureSession.CaptureCallback() {
              @Override
              public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
                  super.onCaptureCompleted(session, request, result);
                  create_camera_preview();
              }
          };

          camera_device.createCaptureSession(output_surface, new CameraCaptureSession.StateCallback() {
              @Override
              public void onConfigured(@NonNull CameraCaptureSession session) {

                  try{
                      session.capture(capture_builder.build(), capture_callback, background_handler);

                  }catch (CameraAccessException camera_access_error){
                      camera_access_error.printStackTrace();
                  }

              }

              @Override
              public void onConfigureFailed(@NonNull CameraCaptureSession session) {

              }
          }, background_handler);

      }catch(CameraAccessException camera_access_error){
          camera_access_error.printStackTrace();
      }


      camera_open_close_lock.release();

  }


Когда изображение захвачено и вызывается onImageAvailable, ширина и высота составляют 3264 и 2448 пикселей соответственно.

image_reader = ImageReader.newInstance(width, height, ImageFormat.YUV_420_888, 1); 

Где выполняется обнаружение штрих-кода

public void scanning(){

        FirebaseVisionImage image = null;

        try {
            image = FirebaseVisionImage.fromMediaImage(upc_image, Rotation_Compenstation());
        }catch(CameraAccessException camera_access_error){
            camera_access_error.printStackTrace();
        }

        try {
            Task<List<FirebaseVisionBarcode>> result = firebase_barcode_detector.detectInImage(image)
                    .addOnSuccessListener(new OnSuccessListener<List<FirebaseVisionBarcode>>() {
                        @Override
                        public void onSuccess(List<FirebaseVisionBarcode> firebase_vision_barcodes) {
                            // Task was successful
                            for (FirebaseVisionBarcode firebase_vision_barcode : firebase_vision_barcodes) {


                            }


                        }
                    }).addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception error) {
                            // Task was a failure

                            error.printStackTrace();


                        }
                    }).addOnCanceledListener(new OnCanceledListener() {
                        @Override
                        public void onCanceled() {

                        }
                    }).addOnCompleteListener(new OnCompleteListener<List<FirebaseVisionBarcode>>() {
                        @Override
                        public void onComplete(@NonNull Task<List<FirebaseVisionBarcode>> task) {

                            Log.d(TAG, "Result: " + task.getResult().toString());
                        }
                    });
        }catch (Exception error){
            error.printStackTrace();
            Log.d(TAG, "Error, read fail");
        }


  }

При создании объекта FirebaseVisionImage должна быть рассчитана компенсация вращения.

public int Rotation_Compenstation(){

        int current_device_rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
        // current_device_rotation is 0
        int rotation_compensation = ORIENTATION.get(current_device_rotation);
        // rotation_compensation is 90
        CameraManager camera_manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
        String cameraId = camera_manager.getCameraIdList()[0];

        int device_sensor_orientation = camera_manager.getCameraCharacteristics(cameraId).get(CameraCharacteristics.SENSOR_ORIENTATION);
        // device_sensor_oreintation is 90

        rotation_compensation = (rotation_compensation + device_sensor_orientation + 270) % 360;
        // rotation_compensation here is 90

        int result_rotation;
        switch(rotation_compensation){

            case 0:
                result_rotation = FirebaseVisionImageMetadata.ROTATION_0;
                break;

            case 90:
                result_rotation = FirebaseVisionImageMetadata.ROTATION_90;
                break;

            case 180:
                result_rotation = FirebaseVisionImageMetadata.ROTATION_180;
                break;

            case 270:
                result_rotation = FirebaseVisionImageMetadata.ROTATION_270;
                break;

                default:
                    result_rotation = FirebaseVisionImageMetadata.ROTATION_0;
                    Log.d(TAG, "Bad Rotation Value: " + result_rotation);
                    break;

        }

        return result_rotation;
        // result_rotation is 1


}

Информация о компенсации вращения во время выполнения

current_device_rotation: 0
device_sensor_orientation: 90
rotation_compensation: 90
result_rotation: 1

Телефонное устройство всегда находится в вертикальном положении (портрет). Штрих-код в вертикальном положении (способен читать его слева направо). Не уверен, что проблема может быть. Сначала я думал, что изображение слишком велико, так как когда я звонил

upc_image.getWidth() and upc_image.getHeight() 

, значения были 3264 и 2448 пикселей соответственно. Я попытался дистанцировать upc от телефонного устройства, и это также не оказало влияния. Список по-прежнему пуст.

Кто-нибудь знает, что может вызвать эту проблему.

...