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

Я пытаюсь прочитать barcode128 и QR-код, используя автономный API firebase ML kit. Я умею читать как штрих-код, так и 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'  

Сканер

    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;
            });

person Sandip Armal Patil    schedule 16.09.2020    source источник
comment
Сканирование штрих-кода firebase ML бесплатное?   -  person Isuru Bandara    schedule 06.10.2020
comment
да, библиотека штрих-кодов Firebase ML бесплатна   -  person Sandip Armal Patil    schedule 07.10.2020


Ответы (1)


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

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

person Shiyu    schedule 18.09.2020