Не удается прочитать более 30 символов штрих-кода с помощью Firebase ML Kit

#java #android #barcode-scanner #firebase-mlkit #google-mlkit

#java #Android #сканер штрих-кода #база данных firebase-mlkit #google-mlkit #firebase-mlkit

Вопрос:

Я пытаюсь прочитать barcode128 и QR-код с помощью firebase ML kit standalone API. Я могу считывать как штрих-код, так и QR-код. Но если длина моего штрих-кода превышает более 30-35 символов, сканер штрих-кода не может обнаружить штрих-код. Я могу обнаружить QR-код, но не штрих-код.

Вот мой код :

 // Use this dependency to use the dynamically downloaded model in Google Play Services
implementation 'com.google.android.gms:play-services-mlkit-barcode-scanning:16.1.2'
implementation 'com.google.mlkit:barcode-scanning:16.0.3'  
  

ScannerActivity :

     executor = Executors.newSingleThreadExecutor();
    PreviewView previewView = findViewById(R.id.cameraPreviewView);
    cameraProviderFuture = ProcessCameraProvider.getInstance(this);
    cameraProviderFuture.addListener(() -> {
        try {
            ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
            Preview preview = new Preview.Builder().build();
            CameraSelector cameraSelector = new CameraSelector.Builder()
                    .requireLensFacing(CameraSelector.LENS_FACING_BACK)
                    .build();

            preview.setSurfaceProvider(
                    previewView.createSurfaceProvider());

            ImageCapture imageCapture = new ImageCapture.Builder()
                    .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
                    .build();

            ImageAnalysis imageAnalysis =
                    new ImageAnalysis.Builder()
                            .build();

            imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(this), new ImageAnalysis.Analyzer() {

                private BarcodeScanner scanner = buildBarCodeScanner();

                @Override
                public void analyze(ImageProxy imageProxy) {
                    @SuppressLint("UnsafeExperimentalUsageError") Image mediaImage = imageProxy.getImage();
                    if (mediaImage != null) {
                        InputImage image =
                                InputImage.fromMediaImage(mediaImage, imageProxy.getImageInfo().getRotationDegrees());
                        Task<List<Barcode>> result = scanner.process(image);

                        result.addOnSuccessListener(new OnSuccessListener<List<Barcode>>() {
                            @Override
                            public void onSuccess(List<Barcode> barcodes) {
                                processBarCodes(barcodes);
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                // Task failed with an exception
                                Log.i("CameraXApp3", "scanner task failed. Error:"   e);

                            }
                        }).addOnCompleteListener(new OnCompleteListener<List<Barcode>>() {
                            @Override
                            public void onComplete(@NonNull Task<List<Barcode>> task) {
                                mediaImage.close();
                                imageProxy.close();
                            }
                        });
                    }
                }

                private BarcodeScanner buildBarCodeScanner() {
                    BarcodeScannerOptions options =
                            new BarcodeScannerOptions.Builder()
                                    .setBarcodeFormats(
                                            Barcode.FORMAT_QR_CODE,
                                            Barcode.FORMAT_CODE_128)
                                    .build();
                    return BarcodeScanning.getClient(options);
                }

                private void processBarCodes(List<Barcode> barcodes) {
                    for (Barcode barcode : barcodes) {
                        confirmCounter  ;
                        if (confirmCounter >= CONFIRM_VALUE) {
                            confirmCounter = 0;
                            final Rect boundingBox = barcode.getBoundingBox();
                            final Point[] cornerPoints = barcode.getCornerPoints();
                            String rawValue = barcode.getRawValue();
                            int valueType = barcode.getValueType();
                            if (valueType == Barcode.TYPE_TEXT) {
                                toast(MainActivity.this, "Received Message:"   rawValue);
                            }
                        }
                    }
                }

                public void toast(final Context context, final String text) {
                    Handler handler = new Handler(Looper.getMainLooper());
                    handler.post(() -> Toast.makeText(context, text, Toast.LENGTH_LONG).show());
                }
            });

            Camera camera = cameraProvider.bindToLifecycle(
                    ((LifecycleOwner) this),
                    cameraSelector,
                    preview,
                    imageCapture,
                    imageAnalysis);

        } catch (InterruptedException | ExecutionException e) {

        }
    }, ContextCompat.getMainExecutor(this));
  

Я также пытаюсь добавить больше внимания, нажав, но безуспешно :

  previewView.setOnTouchListener((v, event) -> {
                v.performClick();
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    final MeteringPointFactory factory = previewView.getMeteringPointFactory();
                    final MeteringPoint point = factory.createPoint(event.getX(), event.getY());
                    final FocusMeteringAction action = new FocusMeteringAction.Builder(point).build();
                    camera.getCameraControl().startFocusAndMetering(action);
                    return false;
                }
                return true;
            });
  

Комментарии:

1. Бесплатное ли сканирование штрих-кода firebase ML?

2. да, библиотека штрих-кодов Firebase ML бесплатна

Ответ №1:

Для штрих-кода ML Kit требуется, чтобы ширина самой тонкой полосы составляла не менее 3 пикселей. Код-128 каждый символ имеет ширину 11 строк, поэтому в пересчете на пиксели он равен 33 пикселям в ширину, а для 35 таких символов требуется 1155 пикселей в пересчете на ширину. Таким образом, ширина штрих-кода на изображении должна быть не менее 1155 пикселей. Этот грубый расчет игнорирует символы .

Возможно, вам потребуется увеличить разрешение изображения для этого формата.