Lectura de bolas de bingo con microcontroladores

De vez en cuando, un proyecto viene con ese poder mágico de consumir su tiempo y atención durante muchos meses. Cuando finalmente lo completa, siente que no tiene que hacer nada más.

¿Qué tiene de especial este lector de bolas de bingo? Puede parecer una proyección OCR normal a primera vista; la cámara captura la imagen y el software OCR reconoce el número. Tan sencillo. Y funciona a la perfección, como debería hacerlo cualquier dispositivo simple.

Pero, de nuevo, tal vez no sea tan simple. Los números están esparcidos por la bola, por lo que deben colocarse primero y se debe elegir al mejor candidato para la lectura. Luego, los números se pintan en una esfera en lugar de en una superficie plana, lo que a veces hace que se deformen hasta el punto en que su forma debe recuperarse primero. Además, el ángulo de lectura no es fijo sino en algún lugar en una escala de 360 ​​°. Y luego tenemos el problema del brillo para empezar, porque las bolas de bingo son tan brillantes que cada fuente de luz se refleja como un punto brillante saturado.

Entonces, ¿eso es todo? Bueno, casi. Se supone que la tarea se debe realizar con un microcontrolador integrado, con velocidad y memoria limitadas, sin embargo, el proceso de reconocimiento de una bola debe ser rápido, al menos 500 ms. Pero esa es solo una parte del proceso. El proyecto incluye el mecanismo de canalización que acepta la pelota, la transporta para ser escaneada por el OCR y luego filmada por la cámara de transmisión pública antes de que sea descartada. Y finalmente, si la lectura no fue lo suficientemente confiable, la bola debe rotarse sutilmente para que los números se reposicionen para otra prueba de lectura.

A pesar de estos desafíos, logré construir este sistema. Es rápido y confiable, y he descubierto algunos trucos muy interesantes en el camino. Eche un vistazo a la demostración de velocidad a continuación para comprender la velocidad y lo que "ve" el sistema. Entonces únase a mí después del descanso para sumergirse en los detalles de este interesante edificio integrado.

Al principio, pensé que tendría que contratar una red neuronal para el proceso de reconocimiento, pero resultó que el reconocimiento es en realidad la parte más simple del proyecto, y que sería mucho más fácil y rápido hacerlo algorítmicamente. La parte difícil es determinar qué hay en la imagen completa, ubicar el mejor número, la línea debajo de él, y medir cuánto debe rotarse. Comenzando con nada más que una imagen de mapa de bits, el procesador tiene que hacer muchos cálculos matemáticos incluso antes de poder estar seguro de si el número consta de uno o dos dígitos.

Esquema simplificado de la sección OCR

VGA durante el desarrollo

Para facilitar el desarrollo, mantenimiento y ajustes, se utiliza la misma MCU para generar señales VGA además de agregar y procesar imágenes. No solo muestra la imagen escaneada, sino que también incluye algunos parámetros actuales y contenido de RAM. La placa del controlador tiene un conector VGA, pero no debe usarse durante el funcionamiento normal de la unidad. Una pantalla VGA no tiene nada en común con los monitores de transmisión en la sala de Bingo, ya que hay dos cámaras y sistemas de iluminación independientes.

La generación de señales VGA consume una gran cantidad de procesador, por lo que se apaga durante el procesamiento y el procesamiento de imágenes, que es de aproximadamente 500 ms durante cada ciclo de lectura de la bola. Las señales de sincronización son generadas de forma transparente por el periférico interno PWM y están activas todo el tiempo, por lo que la restauración de la imagen después de la creación de la señal RGB es rápida.

En este caso se utilizó un microcontrolador de 16 bits PIC24EP512GP806, con 586/52 K de memoria de programa / datos y velocidad de ejecución de 60 MIPS.

Tomando la foto

La cámara “cúbica” analógica barata se utilizó en la primera fase de desarrollo, pero luego fue reemplazada por una cámara cúbica digital. Ambos eran similares en precio y eficiencia, pero este último venía con la lente con una distancia focal más alta, por lo que la distancia podría ser mayor y la cámara podría ver el área más grande de la bola.

Para un objeto tan pequeño, la mejor fuente de luz serían los LED blancos, pero el brillo era bastante malo con la superficie brillante del globo. Hice algunos experimentos con altavoces, pero no tuve suerte. La solución final vino de un enfoque completamente diferente: un reflejo muy brillante y nítido, pero con una doble exposición que usa diferentes fuentes de luz. Durante el segundo proceso de captura de imágenes, la MCU selecciona el valor más bajo para cada píxel.

Debido a que los puntos de acceso nunca coinciden, se cancelarán y la imagen resultante (la tercera foto de la izquierda) estará igualmente iluminada y sin brillo. Como beneficio adicional, los reflejos de la luz de fondo también se cancelaron en el proceso.

Tenga en cuenta que el sistema está integrado, sin función de captura de pantalla, por lo que las imágenes provienen de una pantalla VGA filmada por una cámara.

La fuente de luz consta de 16 LED blancos, por lo que ocho LED están activos al mismo tiempo. La imagen de la derecha representa un diseño de LED desde el punto de vista de la cámara. Los LED son rojos y azules aquí para ayudar a diferenciar los grupos para la primera y segunda exposición.

Esto hace que el proceso sea significativamente más lento, ya que ahora no solo tenemos dos exposiciones, sino también el tiempo del marco de imitación entre dos exposiciones, para permitir la recuperación y el alojamiento del sensor CMOS después de los cambios de luz. Por lo tanto, todo el proceso de obtención de imágenes tarda casi 100 ms.

La resolución de la imagen escaneada es de 220 × 220 píxeles, con una profundidad de píxeles de 8 bits. La imagen analógica en escala de grises consta de solo seis bits, y los dos bits restantes se utilizan para la representación de los colores azul y rojo en la pantalla, porque la escala de grises es en realidad verde. Estos píxeles adicionales se utilizan como píxeles de bandera especiales entre los pasos de procesamiento, visibles en el modo de un paso, como áreas azules y rojas. Esto resultó ser muy útil durante el desarrollo y la depuración del programa.

Todo el proceso se divide en 17 pasos, que también se pueden realizar en un modo de un solo paso con fines de desarrollo y depuración. El número de paso se muestra en la parte superior izquierda de la pantalla (ver más abajo) y el estado actual del cronómetro con una resolución de 1 ms en la parte superior derecha. Esto facilitó el seguimiento del tiempo de ejecución y la optimización de cada paso.

Colocación y estiramiento de la pelota

Para ubicar la pelota con precisión, se calculan las coordenadas X, Y para un centroide (centro geométrico), usando fórmulas Cx = ∑CixAi / ∑Ai y Cy = ∑CiyAi / ∑Ai, donde Cx, Cy son las coordenadas X, Y y A es el valor de cada píxel. Debido a que el fondo es mayormente negro antes de este paso, Cx, Cy estarán aproximadamente en el centro de la bola. Luego, todo el búfer de cuadro se mueve como un bloque 2D, de modo que un centroide está en las coordenadas X = 110, Y = 110, que está en el centro del cuadro. El centro está marcado con 2 × 2 píxeles rojos (bit 7) solo para conveniencia del desarrollador, ya que el firmware de procesamiento ignora principalmente los bits 6 y 7.

Luego, el diámetro de la bola se mide calculando el valor promedio de píxeles en el perímetro para diferentes diámetros. Luego, el fondo (cada píxel fuera del diámetro) se establece en "blanco" o, más específicamente, en verde (valor 0x3F), para garantizar un mejor aislamiento de las áreas negras. El fondo será blanco o negro unas cuantas veces más durante el procesamiento, cada vez que se requiera una selección de áreas negras (tinta) o blancas (papel).

Es imposible transformar perfectamente una esfera en una superficie plana, pero la forma se puede mejorar si la imagen está distorsionada de forma no lineal, como en la imagen del paso 3. Los microcontroladores pequeños de 16 bits no tienen un microprocesador aritmético y el uso de bibliotecas trigonométricas estándar consumiría demasiado tiempo de procesador. Por eso se utilizaron tablas de búsqueda trigonométricas, y se puede ver en el cronómetro (dígitos azules arriba a la derecha) que, en este caso, el tiempo de ejecución del procedimiento tenso fue de solo 11 ms. También puede ver que la parte central de la bola no ha cambiado en gran medida, y los bordes están estirados de forma no lineal para minimizar las deformidades esféricas.

En el paso 4, similar a la función Máscara de enfoque en Photoshop, se crea una nueva imagen borrosa. Dado que no hay suficiente espacio RAM para otro búfer de cuadro completo, se hace en la imagen auxiliar reducida a la resolución 44 × 44. La función de la máscara roma es muy importante ya que asegura una mejor elección de píxeles de "tinta" en relación con a píxeles de "papel". Seleccionar significa "configuración de 7 bits", lo que dará como resultado áreas rojas en la pantalla VGA.

Ahora hay dos imágenes en el mismo búfer de cuadros, la escala de grises (bits 0-5) y la binaria (bit 7). Este último se utiliza en el paso 6 de preprocesamiento, donde se eliminan los pequeños agujeros y arañazos. La imagen seleccionada primero se expande y contrae, y luego el proceso se repite con el orden de las operaciones invertido, lo que da como resultado que los bordes se redondeen suavemente y sin arrugas.

Manipulación de componentes

Después de algunos pasos de procesamiento más, se llevan a cabo operaciones más serias. El primero se conoce como “componentes conectados”, donde se seleccionan las áreas aisladas y se obtienen los parámetros de cada una. Esto incluye las dimensiones XY, las coordenadas del centro XY, el número de píxeles seleccionados y la distancia de Euclides desde el centro del marco. Esto ayudará a clasificar cada elemento como un número, el círculo grande, el subrayado o el fondo. En esta etapa, también es evidente si el número contiene uno o dos dígitos.

Este paso requiere mucho procesamiento, alrededor de 200 ms. Otro problema fue que el algoritmo estándar para componentes conectados requiere un búfer de marco auxiliar del mismo tamaño, por lo que tuve que crear un nuevo algoritmo que usa el mismo búfer de marco, más una pequeña tabla para coordenadas temporales.

En este punto, es fácil para el procesador elegir el mejor candidato para el reconocimiento: es el círculo con la distancia más pequeña de Euclides desde el centro de la bola. Se consideran los componentes conectados dentro de este círculo y todo lo demás se elimina.

Las bolas en cuestión son bolas OCR especiales con números subrayados para que se pueda medir el ángulo de rotación. Ahora que se conoce el centro del círculo, el programa gira la forma virtual de "T", que corresponde a la forma subrayada, en 512 pasos alrededor del círculo de 360 ​​°, calculando cuántos píxeles de "tinta" contiene. El cálculo con la calificación más alta dicta el ángulo de rotación, luego el bloque 2D del búfer de fotogramas se mueve a la esquina inferior derecha de la imagen (paso 12 en la imagen más a la izquierda), y se realiza la rotación, moviendo el mapa de bits al ángulo opuesto del búfer de fotogramas. Gracias a las tablas de búsqueda logarítmica, este grupo de operaciones dura solo 50 ms.

Continúa mejorando con cada paso. Los dígitos se seleccionan con diferentes colores, luego se mueve un dígito a la distancia segura y luego cada dígito se escala a la resolución conocida de 30 × 46.

Reconocimiento

Dado que este lector era mi primer proyecto sobre OCR, pensé ingenuamente que el proceso de reconocimiento sería la solución más difícil. Después de que cada paso fue completamente depurado y verificado uno tras otro, llegué al decimoséptimo y último paso. Como ya he señalado, mi plan inicial era buscar una red neuronal, pero luego probé un algoritmo simple y jugué con él. ¡Lo probé con algunas bolas y no puedes imaginar lo sorprendido que estaba cuando lo vi funcionar perfectamente! Finalmente, el mapa de bits se representó adecuadamente en dos números ASCII.

El algoritmo es bastante simple. El mapa de bits de cada dígito estaba casi dividido en tres partes, primero horizontalmente y luego verticalmente. Luego, se contaron los píxeles activos en cada columna o fila y se crearon histogramas. También se agrega un séptimo histograma, que es oblicuo para ayudar a detectar mejor las líneas cruzadas en las figuras 4 y 7.

Solo tomó 3 ms crear siete histogramas para cada dígito y compararlos con tablas pregrabadas, calcular la suma de los errores cuadrados medios y ordenar los resultados. Para facilitar el desarrollo y la depuración, todos los histogramas se presentan en pantalla.

Una vez ordenados los resultados de la comparación, obtenemos el ganador para cada dígito (en este caso 8 y 5), pero nuestra tarea no se completa hasta que suceda una cosa más. La calidad de la lectura debe evaluarse para que el controlador pueda evaluar si el resultado es lo suficientemente confiable.

Si el número en la bola tiene solo un dígito, se organiza la tabla de errores para cada dígito (0 ... 9) y se compara el "ganador" con el segundo (casi el ganador). Si la proporción es alta, eso significa que el reconocimiento es exitoso. En nuestro caso fue del 147%, lo que significa que el segundo candidato calificado tiene un 147% más de errores que el mejor. Por ejemplo, el primero tenía 100 "unidades de error" y el segundo tenía 247. Esta es una buena estimación, aunque la mayoría de las estimaciones están por encima del 300%. En general, las tasas superiores al 80% deben considerarse bastante seguras.

Pero, ¿y si hay dos dígitos? Una cadena es tan fuerte como su eslabón más débil, por lo que el programa ignorará la figura reconocida con mayor éxito (la que tiene una proporción más alta) y utilizará la más débil para tomar la decisión final sobre el éxito.

El controlador tiene dos modos básicos de operación. En el modo rápido, solo hay una lectura que se repite (después de la rotación de la bola) solo si la primera lectura no se evaluó lo suficientemente bien. En el modo más lento ("más seguro"), hay dos lecturas cuyos resultados deben coincidir.

El lector fue probado en Belgrado, en Eleks-M una empresa que produce equipos para casinos. La prueba se realizó con una cámara fija adicional que registró automáticamente cada lectura de bola, luego las imágenes (con nombres de archivo que no contenían nada más que el número de bola reconocido) se ordenaron alfabéticamente y la verificación final se realizó manualmente.

La prueba completa duró 240 horas, lo que ayudaría a probar la durabilidad del soplador de Bingo además del lector. Después de 10 días y 115.000 bolas leídas, solo hubo una lectura errónea (la bola 37 se leyó como 7), con el lector en modo rápido. Probar en modo seguro no tendría sentido, ya que probablemente nunca se produciría un error.

Concepto Mecánico

La trayectoria física de las bolas de bingo es circular, con un motor paso a paso que gira el carrusel 90 ° para cada ciclo de bolas. Hay cuatro pasos de canalización: entrada de balón, lectura de OCR, grabación de transmisión y salida de balón. Los sopladores de bingo han seguido el mismo modelo funcional durante décadas. Anteriormente, las bolas eran leídas por humanos (probablemente desde la cámara de transmisión), luego obtuvimos el código de barras (izquierda), luego un lector RFID (medio) y, finalmente, un reconocimiento óptico de caracteres (derecha).

Hay otro motor paso a paso que hace girar la bola debajo de la cámara OCR después de escanear, para prepararla si se necesita otra lectura. El controlador contiene dos MCU iguales: uno escanea la imagen, reconoce el número, controla una luz LED y genera una señal VGA, y el otro opera motores paso a paso, se comunica con el servidor y controla todas las partes del soplador.

La caja y las partes mecánicas están hechas de FR4, utilizando el proceso descrito en mi guía anterior. La única excepción es el carrusel, que está hecho de acrílico cortado con láser. El motor paso a paso principal gira el carrusel directamente, y cuatro imanes con un sensor Hall son responsables de la posición inicial.

Si el controlador decide que se necesita otra lectura, el pequeño motor paso a paso gira la bola ligeramente para reposicionar los números. El controlador también puede controlar el tercer motor paso a paso, que se usa dentro del soplador, para abrir la puerta de entrada al comienzo del juego.

Para compactar aún más la unidad, la placa del controlador está conectada al gabinete, por lo que los únicos cables externos son el suministro de 12 VCC y RS232, para la comunicación con el servidor. Para distancias muy largas existe una corriente aislada galvánicamente. También hay una versión USB del controlador, pero la longitud limitada del cable dificulta la implementación en algunos casos.

Dos versiones anteriores del proyecto se describen en

  • https://la-tecnologia.io/project/5649-ocr-for-bingo-balls
  • https://la-tecnologia.io/project/11515-optical-bingo-ball-reader-assembly.
  • En última instancia, el firmware (solo para un microcontrolador OCR) tomó casi 80 K bytes de tablas de búsqueda y aproximadamente 6,000 líneas de código en lenguaje ensamblador, excluidos los comentarios. Escuchaste bien, todo es un lenguaje ensamblador. Soy hardware y me gusta tener todo bajo mi control.

    Olvidé agregar una cosa más, pero probablemente lo hayas adivinado ahora: hacer proyectos de este tipo es una maravilla.

    • Yann Guidon / YGDES dice:

      ¡Guau! ¡Aquí hay una buena colección de trucos!
      Felicitaciones y gracias Vía 🙂

    • Internet dice:

      "También hay una versión USB del controlador, pero la longitud limitada del cable dificulta la implementación en algunos casos".

      Un extensor USB activo o de fibra óptica puede solucionarlo.

      Hermosa construcción pulida.

    • JonW dice:

      Gran trabajo y gran lectura, pero probablemente modificaría las bolas perforando / insertando un pequeño chip NFC / conectando cada una

      • salec dice:

        Sí, pero para que el juego sea justo, debes poder demostrar que las bolas son idénticas y simétricas en el centro. Cualquier modificación arroja dudas sobre la uniformidad mecánica del sistema. El código de barras era una solución simple pero fea. Este encaja perfectamente.

      • Martín dice:

        Esta solución se menciona en el artículo casi al final.

    • Ren dice:

      Después de un tiempo las bolas se vuelven casi ilegibles debido a la suciedad, las manchas, el aceite de los dedos, el humo del cigarrillo ...

      • Mike Szczys dice:

        Este hardware es un producto que se vende a los casinos. Creo que siguen reemplazando las bolas a medida que llevan.

    • xorpunk dice:

      Esperaba que se tratara de sistemas dinámicos y diseños de lotería. Este sistema, sin embargo, tiene una tasa de fallas.

      • Galane dice:

        Y si falla a favor de los jugadores, los casinos se niegan a pagar.

        • xorpunk dice:

          ningún casino usa diseños de bolas. Lo más parecido son los giros de la ruleta y los cangrejos y, a veces, en los grandes casinos esos pequeños juegos experimentales

          La mayoría de la gente no sabe que existe una estrategia óptima para todo lo que cuesta. Loterías estatales, puedes comprar la mayoría de las combinaciones en carretes, etc.

          • xorpunk dice:

            Seguramente existe incluso un sistema dinámico que puede dar probabilidad a las bolas por peso de impresión, CFM, espacio del cañón, etc.

            Sin embargo, las probabilidades tendrán una tasa de fracaso.

    • Olsen dice:

      ¡Pensarías que esto se habría hecho hace años! ¡Y en un microcontrolador! ¡Guau!

    • Cierto dice:

      Me recuerda a los cubitos de hielo-O-Matic

      • Voja Antonic dice:

        ¡Máquina increíble y rápida!
        Hay otro lector de dados para el juego SicBo, lo construí hace unos 10 años

        • Yann Guidon / YGDES dice:

          Es un generador aleatorio de ancho de banda muy bajo ... pero los graves son geniales 😉

      • reproducción dice:

        Siempre me he preguntado cómo funcionan los generadores de números aleatorios ... ¡Gracias!

        • Cierto dice:

          No sé si estás bromeando o no, pero los H / W RNG recientes se basarían principalmente en efectos cuánticos.
          https://eo.wikipedia.org/wiki/Hardware_random_number_generator#Quantum_random_properties
          p.ej. decaimiento nuclear, - https://www.fourmilab.ch/hotbits/how3.html

    • Donald Papp dice:

      Como siempre, ¡el diablo está en los detalles! Qué gran explicación y paseo de los problemas que debían resolverse. Aprendí mucho leyendo esto.

    • RoGeorge dice:

      Compañía. ¡Muy impresionante!

    • Aniket Roy dice:

      El proyecto es grande pero 80 Kilobytes de tabla de búsqueda !!!!!!!! Es realmente sorprendente cómo pudiste sacar esto por tu cuenta. Suena casi imposible para mí.

    • Maravilloso dice:

      "La solución final provino de un enfoque completamente diferente: un reflejo muy brillante y nítido, pero con exposición dual que usa diferentes fuentes de luz. Durante el segundo proceso de toma de imágenes, la MCU elige el valor más bajo para cada píxel".
      ¡Una solución tan simple pero efectiva, muy genial!

    • Lucas Boucher dice:

      ¿Has probado un filtro polarizador para eliminar el deslumbramiento?
      Buena técnica en la doble exposición.

      • Voja Antonic dice:

        No, pero no creo que sea útil aquí. Los filtros polarizadores son adecuados para la eliminación de brillo solo si el ángulo de reflexión es bajo y si la dirección de polarización es uniforme, lo que no es el caso de un espejo esférico.

        • Galane dice:

          Este procedimiento podría tener usos en fotografía. Coloque dos flashes electrónicos en una cámara, en extremos opuestos. Utilice el flash y tome 2 fotos en una secuencia muy rápida, luego combine las dos con el procesamiento para eliminar el brillo.

          • Internet dice:

            Claro, pero corrígeme si me equivoco (tengo un poco, pero ningún fondo de análisis de imágenes completo), lo que supone que tienes suficiente potencia de CPU disponible para realizar análisis de imágenes en tiempo real en un lapso de milisegundos. Hay dispositivos integrados que ahora están disponibles comercialmente en este momento que tienen esa potencia bajo el capó, pero no tengo la impresión de que este hardware específico los tenga.

            • Galane dice:

              El procesamiento no debe realizarse rápidamente, solo tomar las fotografías rápidamente. El procesamiento se podría maniobrar en una RAM y un componente de procesamiento separados para liberar el sistema de grabación de imágenes para otra toma.

        • eclipse llameante dice:

          No, esto también funcionaría si tiene un filtro para la superficie y la cámara. Es cierto que el efecto es mucho menos pronunciado, pero aún así. Lo uso constantemente para OCR en hojas brillantes y demás, y ciertamente no son planas y el ángulo de reflexión está en todas partes. Lo importante es agregar un filtro polarizador también frente a la fuente de luz.

          La luz de techo también eliminaría efectivamente este problema, lo mismo ocurre con la luz coaxial. A las aplicaciones industriales no les gustan los flashes dobles, porque los objetos tienden a moverse. Para este caso, bueno, la velocidad no es un problema.

        • tri_d_dave dice:

          Lo que funciona bien es colocar un filtro polarizador sobre la fuente de luz y un repelente sobre la lente de la cámara. La reflexión especulativa conserva la polarización y los no especuladores tienden a crear una polarización aleatoria. En el caso de fotografiar vidrio a 90 grados, es posible la extinción casi total del rayo, permitiendo imágenes de objetos en vitrinas.

    • Congreso Nacional Africano dice:

      Excelente redacción. ¡Esta fue una gran lectura!

    • abad dice:

      Loca. Tanto en el sentido de “trabajo increíble” como también de “hay que estar loco para escribir todo esto juntos”.

      • Matt Venn dice:

        +1 gran artículo

    • djmips dice:

      Muy satisfactorio. ¡Gran trabajo!

    • Sólo me preguntaba dice:

      si usa una “bola especial de OCR” de todos modos, ¿por qué no imprimir códigos QR en ellos (intercalados con números arábigos para lectura humana)? Los lectores de productos básicos baratos pueden leer códigos QR desde una amplia gama de orientaciones.

      • Voja Antonic dice:

        Supongo que la razón principal es la misma que la de un código de barras. Si hay detalles demasiado pequeños que pueden afectar la lectura, el sistema es sensible a la suciedad y los arañazos.

        • eclipse llameante dice:

          Además, a los lectores baratos de códigos QR no les gustan en absoluto las distorsiones esféricas. La perspectiva es buena, esférica no tanto,

    • Mate dice:

      Muy bien hecho.

    • Gaston dice:

      Un proyecto interesante, ¿me dejarías saber qué cámara usaste? ¡Gracias!

Eva Jiménez
Eva Jiménez

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *