#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 пикселей. Этот грубый расчет игнорирует символы .
Возможно, вам потребуется увеличить разрешение изображения для этого формата.