简体   繁体   English

无法使用 Firebase ML Kit 读取更多 30 个字符的条形码

[英]Not able to read more 30 chars barcode using Firebase ML Kit

I am trying to read barcode128 and QR code using firebase ML kit standalone API.我正在尝试使用 firebase ML kit 独立 API 读取条形码 128 和二维码。 I am able to read both the barcode and QR code.我能够读取条形码和二维码。 But if my barcode length exceeds more than 30-35 chars then the barcode scanner not able to detect the barcode.但如果我的条码长度超过 30-35 个字符,则条码扫描器无法检测到条码。 I am able to detect QR code but not a barcode.我能够检测二维码,但不能检测条形码。

Here is my code :这是我的代码:

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

I am also trying to add more focus by clicking but no luck :我也试图通过点击来增加更多的焦点,但没有运气:

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

ML Kit barcode requires thinnest bar to be minimum 3 pixels wide. ML Kit 条码要求最细条的宽度至少为 3 像素。 Code-128 each character is 11 bar wide, so in terms of pixels it is 33 pixels wide and for 35 such character it requires 1155 pixels in terms of width. Code-128 每个字符是 11 条宽,所以就像素而言,它是 33 像素宽,对于 35 个这样的字符,它需要 1155 像素的宽度。 So barcode needs to be at least 1155 pixels wide in the image.因此,条码在图像中至少需要 1155 像素宽。 This rough calculation ignores + + characters.这种粗略的计算忽略了 + + 字符。

You may need to increase the image resolution for this format.您可能需要增加此格式的图像分辨率。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用Firebase ML Kit创建用于条形码扫描的模块化类 - How to create a modular class for barcode scanning using Firebase ML Kit 条码扫描器使用 ML Kit 仅读取 QR 码 - Barcode scanner is reading only QR codes using ML Kit 如何使用Firebase ML套件识别地标? - How to recognize landmarks using Firebase ML kit? ML Kit条形码扫描:无效的图像数据大小 - ML Kit Barcode scanning: Invalid image data size ML Kit 条码扫描器有时会拾取错误的扫描结果 - ML Kit Barcode scanner picks up wrong scans sometimes ML Kit Vision - barcode detection using a camerax in memory image results in null pointer exception due to 'int android.graphics.Bitmap.getWidth()' - ML Kit Vision - barcode detection using a camerax in memory image results in null pointer exception due to 'int android.graphics.Bitmap.getWidth()' Firebase ML KIT 无法识别古吉拉特语 - Firebase ML KIT cannot recognize gujarati language ML Kit Firebase textDetection 检测不清晰 - ML Kit Firebase textDetection does not detect clearly 使用 python 脚本转换输入以输入 tensorflow lite ML Kit,用于连接到 Android 应用程序的 firebase - Transforming the inputs using python scripts to feed into the tensorflow lite ML Kit for firebase connected to android app Firebase Android ML Kit:在 QR 码上隐藏显示值的方法 - Firebase Android ML Kit: Way to hide display values on QR code
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM