Estoy usando com.google.mlkit:barcode-scanning:17.0.2 para detectar códigos QR en las imágenes.
Después de obtener el URI de la galería, creo InputImage y luego proceso esta imagen con BarcodeScanner para encontrar códigos QR. Cuando selecciono una foto de códigos QR en papel, se encuentra el código. Pero cuando tomo una foto del código QR en la pantalla del monitor, nunca se encuentra el código. ¿Qué debo hacer para poder detectar un código QR en una foto de la pantalla de un monitor?
(Cuando uso el mismo escáner con CameraX para hacer una detección de código QR en vivo, encuentra el código en la pantalla del monitor)
val image = InputImage.fromFilePath(context, uri) val scanOptions = BarcodeScannerOptions.Builder() .setBarcodeFormats( Barcode.FORMAT_QR_CODE, ) .build() val scanner = BarcodeScanning.getClient(scanOptions) scanner.process(image) .addOnSuccessListener { val code = it.getOrNull(0)?.rawValue if (code == null) { // code NOT found } else { // code was found } }Lo más probable es que estés luchando contra el efecto Moiré . Dependiendo del algoritmo de detección QR, las altas frecuencias introducidas por el efecto Moiré pueden desviar el detector de su camino. De manera frustrante, a menudo son los mejores detectores de códigos QR los que son derrotados por los patrones de Moiré.
Una buena solución es:
Otra forma de hacer aproximadamente la misma operación es
El segundo método da peores resultados, pero normalmente se puede implementar con primitivas de dispositivo.
Otra fuente de problemas con los monitores (no en su imagen por lo que puedo ver) es la frecuencia de actualización. A veces, encontrará que el código QR es en realidad un código QR sobreexpuesto en la mitad superior de la imagen y un código QR subexpuesto en la mitad inferior de la imagen. Tampoco son reconocidos. Este efecto se debe a la estrategia y frecuencia de actualización del monitor y no es fácil de resolver: puede probar a bajar la luminosidad del monitor para aumentar el tiempo de exposición, hasta que supere 1/50 o 1/25 de segundo, o tomar la foto desde más lejos. de distancia y utilice el zoom digital. Los monitores modernos tienen frecuencias de actualización más altas y, de hecho, se actualizan más allá de su propio tiempo de permanencia, por lo que esto no debería suceder; con monitores analógicos antiguos, sin embargo, siempre sucederá .