READING BINGO balls WITH MICROCONTROLLERS

author
13 minutes, 21 seconds Read

Every once in a while a project comes along with that magical power to consume your time and attention for numerous months. When you finally complete it, you feel sorry that you don’t have to do anything more.

What is so special about this Bingo ball reader? It may seem like an ordinary OCR project at first glance; a video camera captures the image and OCR software recognizes the number. easy as that. And it works without problems, like every easy gadget should.

But then again, maybe it’s not that simple. Numbers are scattered all over the ball, so they have to be located first, and the best candidate for reading should be selected. Then, numbers are painted onto a sphere rather than a flat surface, in some cases making them deformed to the point where their shape has to be recovered first. Also, the angle of reading is not fixed but somewhere on a 360° scale. and then we have the glare problem to boot, as Bingo balls are so shiny that every light source reflects as a saturated bright spot.

So, is that all of it? Bueno, casi. The task is expected to be carried out by an embedded microcontroller, with limited speed and memory, yet the recognition process for one ball has to be fast — 500 ms at worst. but that’s just one part of the process. The project includes the pipelined mechanism which accepts the ball, transports it to be scanned by the OCR and then shot by the public broadcast video camera before it gets dumped. and finally, if the reading was not reliable enough, the ball has to be subtly rotated so that the numbers would be repositioned for another reading attempt.

Despite these challenges I did manage to build this system. It’s fast and reliable, and I discovered some very interesting tricks along the way. Take a look at the quick demo video below to get a feel for the speed, and what the system “sees”. then join me after the break to dive into the details of this interesting embedded build.

Initially, I thought I would have to employ a neural network for the recognition process, but it turned out the recognition is actually the simplest part of the project, and that it would be much simpler and faster to do it algorithmically. The difficult part is identifying what’s what on the whole image, locating the best number, the line under it, and measuring how much it ought to be rotated. starting with nothing much more than a bitmap image, the processor has to do a lot of math even before it can be sure if the number consists of one or two digits.

Simplified schematic of OCR section
VGA during Development

To make the development, maintenance and adjustments easier, the same MCU is used for VGA signal generation in addition to image fetching and processing. It doesn’t only display the scanned image, but also includes some current parameters and RAM contents. The controller board has a VGA connector, but it ought to not be used during the normal operation of the unit. VGA monitor has nothing in common with broadcast monitors in the Bingo hall, as there are two independent cameras and lighting systems.

VGA signal generation consumes a lot of processor time, so it is switched off during image fetch and processing, which is about 500 ms during each ball reading cycle. Sync signals are transparently generated by the internal PWM peripherals and they are active all the time, so that picture restore after RGB signal establishing is fast.

In this case, 16-bit microcontroller PIC24EP512GP806 was used, with 586/52 K of program/data memory and 60 MIPS execution speed.

Fetching the Image

The inexpensive analog “cube” video camera was used in the first phase of development, but was later substituted by a digital cube camera. Both were similar in price and performance, but the latter one came with the lens which has higher focal length, so the distance could be higher and the video camera could see the larger area of the ball.

For such a small object, the best light source ought to be white LEDs, but the glare was quite bad with the shiny ball surface. I carried out some experiments with diffusers, but with no luck. The eventual service came from a quite different approach: very bright and sharp reflection, but with double exposure which uses different light sources. during the second image fetch process, the MCU selects the lower value for every pixel.

As the hotspots never match, they will be canceled and the resulting image (the third photo from the left) is evenly lit and glare-free. As an added bonus, the background light reflections were canceled in the process as well.

Please note that the system is embedded, without a screenshot function, so the images come from a VGA monitor being shot with a camera.

The light source is composed of 16 white LEDs, so that eight LEDs are active at a time. The image on the far right-hand side represents LED arrangement from the camera’s point of view. LEDs are colored red and blue here to help differentiate betweenGrupos 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 de marco ficticio entre dos exposiciones, para permitir la recuperación y alojamiento del sensor CMOS después de la iluminación. Es por eso que todo el proceso de imágenes lleva prácticamente 100 ms.

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

Todo el proceso se divide en 17 pasos, que también se puede realizar en modo de un solo paso para fines de desarrollo y depuración. El número de paso se muestra en la esquina superior izquierda de la pantalla (ver más abajo), y el estado actual del cronómetro con 1 resolución de ms en la parte superior derecha. De esta manera, fue fácil seguir el tiempo de ejecución y optimizar cada paso.

Ubicación y estiramiento de la bola

Para ubicar la bola con precisión, se calculan las coordenadas para Centroide (Centro Geométrico), utilizando Formulas CX = Σcixai / ΣAI y CY = ΣCIYAI / ΣAI, donde CX, CY son las coordenadas X, Y y A son las Valor de cada píxel. Como el fondo es predominantemente negro antes de este paso, CX, CY estará aproximadamente en el centro de la pelota. Luego, el tampón de marco entero se mueve como un bloque 2D, de modo que el centroide está en coordenadas x = 110, y = 110, que está en el centro del marco. El centro está marcado con 2 × 2 píxeles rojos (bit77) solo para la conveniencia del desarrollador, ya que el firmware de procesamiento en muchos casos ignora los bits 6 y 7.

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

La transformación perfecta de una esfera a una superficie plana es imposible, pero la forma puede mejorarse si la imagen no se deforma linealmente, como en la imagen PASO 3. Los microcontroladores pequeños de 16 bits no tienen un coprocesador aritmético, y el uso de bibliotecas trigonométricas estándar consumiría demasiado tiempo de procesador. Es por eso que se utilizaron tablas de búsqueda trigonométricas, y puede ver en el cronómetro (mejores dígitos azules de los mejores) que, en este caso, el tiempo de ejecución para el procedimiento de estiramiento fue de solo 11 ms. También puede ver que la parte central de la bola se mantiene sin cambios, y los bordes no están estirados linealmente de modo que se minimizan las deformaciones esféricas.

En el Paso 4, de manera similar a la función de máscara de UNSHARP en Photoshop, se crea una imagen nueva y borrosa. Como no hay suficiente espacio de RAM para otro tampón de marco completo, se lleva a cabo en la imagen auxiliar que se reduce a la resolución 44 × 44. La función de la máscara UNHARPP es muy importante, ya que garantiza una mejor selección de píxeles de “tinta” en relación con los píxeles “papel”. La selección implica “Configuración de bit 7”, que resultará en á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 el binario (bit7 7). Este último se usa en el Paso 6 de preprocesamiento, donde se eliminan los pequeños agujeros y arañazos. La imagen seleccionada se expande y se contrae primero, y luego el proceso se repite con la compra de operaciones invertidas, lo que resulta que los bordes se redondean suavemente y sin basura.

Manipulación de componentes

Después de un par de pasos mucho más preprocesos, tienen lugar muchas más operaciones importantes. El primero se conoce como “componentes conectados”, donde se seleccionan las áreas aisladas y los parámetros para cada uno se adquieren. Esto incluye dimensiones X e Y Dimensiones, coordenadas del centro X e Y, número de píxeles seleccionados y la distancia de Euclides desde el centro del marco. Esto ayudará a ordenar cada componente como un dígito, el gran círculo, el subrayado o el fondo. En esta etapa, también se aclara si el número incluye uno o dos dígitos.

Este paso requiere mucho tiempo de procesamiento, unos 200 ms. Otro problema fue que el algoritmo estándar para los componentes conectados requiere un búfer de marco auxiliar del mismo tamaño, por lo que tuve que crear un nuevo algoritmo que utiliza el mismo búfer de marco, más una mesa pequeña para las coordenadas a corto plazo.

En este punto, es fácil para el procesador elegir al mejor candidato para el reconocimiento: es el círculo con la distancia más pequeña de Euclid desde el centro de la pelota. Los componentes conectados dentro de este círculo se tienen en cuenta, y todo lo demás está expursionado.

Las bolas en cuestión son bolas especiales de OCR con números subrayados, So que se puede medir el ángulo de rotación. Ahora que se conoce el centro del círculo, el programa gira el formulario “T” virtual, que corresponde a la forma de subrayado, en 512 pasos alrededor del círculo de 360 ​​°, contando cómo contiene numerosos píxeles de “tinta”. El conteo calificado más alto dicta el ángulo de rotación, luego el bloque 2D del tampón de marco se mueve a la mejor esquina inferior de la imagen (paso 12 en la imagen más a la izquierda), y se realiza la rotación, moviendo el mapa de bits a la esquina opuesta del búfer de marco. Gracias a las tablas de búsqueda logarítmica, este grupo de operaciones solo toma 50 ms.

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

Reconocimiento

Como este lector fue mi primer proyecto de OCR, pensé ingenuamente el proceso de reconocimiento sería la parte más difícil de resolver. Después de cada paso, se depuró totalmente y revisó uno por uno, llegué al 17º y último paso. Como ya señalé, mi plan inicial era optar por una red neuronal, pero luego probé un algoritmo fácil y jugué con él. Lo evalué con unas pocas bolas y no puedes imaginar lo sorprendida que era cuando lo vi funciona perfectamente. Por fin, el mapa de bits se prestó correctamente a dos números ASCII.

El algoritmo es bastante simple. El mapa de bits para cada dígito se dividió prácticamente en tres partes, primero horizontalmente, y luego verticalmente. Luego se contaron los píxeles activos en cada columna o fila, y los histogramas creados. También hay un 7º histograma agregado, que se inclina para ayudar a la detección mejor de las líneas transversales en los dígitos 4 y 7.

Solo tomó 3 ms de construir siete histogramas para cada dígito y compararlos con tablas pregrabadas, calcule la suma de implicar errores cuadrados y ordenar los resultados. Para facilitar el desarrollo y la depuración, todos los histogramas se trazan a la pantalla.

Una vez ordenados los resultados de la comparación, obtenemos el ganador para cada dígito (en este caso 8 y 5), pero nuestro trabajo no se hace hasta que se realiza una mucho más cosa. La calidad de la lectura tiene que ser calificada, de modo que el controlador pueda estimar si el resultado es lo suficientemente confiable.

Si el número en la bola tiene un solo dígito, la tabla de errores para cada dígito (0 … 9) está ordenada y el “ganador” se compara con el segundo (casi el ganador). Si la relación es alta, eso implica que el reconocimiento es exitoso. En nuestro caso, fue del 147%, lo que implica que el segundo candidato calificado tiene un 147% mucho más errores que el mejor. Por ejemplo, el primero tenía 100 “unidades de error” y el segundo tenía 247. Esta es una buena calificación, aunque muchas calificaciones están al norte del 300%. En general, las calificaciones superiores al 80% deben considerarse lo suficientemente seguras.

¿Pero qué pasa si hay dos dígitos? Una cadena es tan fuerte como su vínculo más débil, por lo que el programa ignorará el dígito reconocido con éxito (el que tiene una relación más alta) y usará a 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 fue mejor calificada. En el modo más lento (“seguro”), hay dos lecturas cuyos resultados deben coincidir.

El lector fue evaluado en Belgrado, en Eleks-M Company, que produce equipos de casino. La prueba se llevó a cabo con una cámara de video aún adicional que grabó automáticamente cada lectura de bolas, 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.

The entire test lasted for 240 hours, which would help stress-test the durability of the Bingo blower in addition to the reader. After 10 days and 115,000 balls read, there was only one erroneous reading (ball 37 was read as 7), with the reader being set to fast mode. testing in safe mode would be meaningless, as an error would probably never occur.

Mechanical Concept

The physical path for Bingo balls is c

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *