Códigos QR en Qt

fukuchiQRHace unos días estuve en el Ficzone de Granada; aunque resulte difícil de creer, no fui como asistente sino para enseñar a la gente a jugar a juegos de mesa. Tenemos una asociación con una cantidad obscena de juegos, y las editoriales también nos envían cada año algunos para que les ayudemos a hacer publicidad… Y el caso es, que tenemos muchos. Tantos como para llenar dos baúles y un arcón, y aún sobrarnos juegos fuera de ellos.

Y no los tenemos catalogados salvo por una pequeña hoja de cálculo. Así que, ¿qué se me ha ocurrido, aparte de inventariarlos? Pues diseñar un sistema para poder reconocerlos rápidamente. Y ahí es donde entran los códigos QR.

Qué es un código QR.

Para todos aquellos que no estén familiarizados con ellos, la imagen de la entrada debería de ser suficiente como para saber de qué estamos hablando. Un código QR es un código de identificación parecido al código de barras, con la salvedad de que mientras el primero es unidimensional, el segundo es bidimensional, esto es, una imagen en dos dimensiones.Estos códigos son redundantes y tienen hasta cuatro niveles de corrección de errores, permitiendo que la imagen se degrade hasta cierto punto (p.e, imágenes borrosas, mal impresas, o con deterioro de algún tipo).

Codificar QR

Para generar un código QR, he utilizado libqrencode. Es de Kentaru Fukuchi, escrita en C y con licencia LGPL. Hay que decir que el formato QR aparece por primera vez en la industria automotiva japonesa, simplemente como curiosidad. Existen distintos ports de esa librería a Qt, pero yo he hecho mi propia versión, BQREncode separando el mecanismo para generar los códigos, el propio código y una factoría de imagen. ¿Por qué? Bueno, distintos constructores de imagen me permiten crear códigos simples, o bien de diferentes colores e incluso con un logo interno… los códigos QR permiten bastante flexibilidad debido a sus niveles de corrección de errores.

Decodificar QR

Esta parte ha sido más problemática. Existen muchas librerías para leer un código QR, pero necesitaba que:

  • Estuvieran escritas en C / C++
  • Tuvieran pocas dependencias externas
  • Pudiera compilar con el NDK de Android

Al final, la ganadora ha siddplanellaQZXingo ZXing, de Google. Más concrétamente, su port a Qt llamado QZXing, la versión de David Planella. No obstante, este repositorio está pensado para dar soporte a los plugins del Ubuntu SDK y también para poder generar binarios en las versiones de escritorio. Así que he tenido que hacer un par de pequeños cambios en la forma de compilar y limpiarlo un poquito para poder compilarlo en Android. Los cambios los podéis encontrar en este repositorio.

Consejos

En primer lugar, recuerda que debes de reflejar la imagen si vas a testear tu programa directamente. Las imagenes QR están pensadas para fotografiarse, y parece que por característica de la lente fotográfica la imagen queda reflejada antes de ser procesada. Si ves que falla la decodificación, prueba a reflejar la imagen.

Segundo, los códigos QR necesitan, al igual que los códigos de barras, una zona de seguridad a su alrededor, que es un cinturón de pieles blancos alrededor de ellos para ayudar al procesamiento de la imagen. El tamaño de dicho cinturón está especificado en base al número de caracteres que estés codificando, pero también depende de la librería que se esté utilizando para decodificar. Ten cuidado con eso.

Compilar para Android

Y por último, si quieres incluir el código de mis dos librerías dentro de tu proyecto, puedes hacerlo generando las librerías o, si quieres hacerlo para Android, Y ESTO ES IMPORTANTE, debes de incluir el archivo .PRI dentro del archivo de tu proyecto. Cuando intenté lanzar un proyecto de prueba en mi móvil y en mi tablet, me encontré con errores terribles por incompatibilidad. Resumiendo: mis librerías compiladas eran de 64 bits y mis dispositivos son de 32 bits. Por lo que tengo entendido, puedes subir tus librerías compiladas a tu proyecto aunque hayan sido compiladas con el GCC de Linux y no con el compilador cruzado para ARM (ojo, no estoy seguro), pero si tu máquina (entendiendo por máquina distribución, librerías y compilador) es de 64 bits, no vas a poder usarlas en una máquina de 32, por mucha compatibilidad que te proporcione el NDK.

La solución es compilar TODO en ARM, y lanzarlo en la tablet o móvil. Y para ello, debes de incluir el código fuente de las librerías dentro de tu proyecto. Como eso es bastante coñazo, el mecanismo de inclusión de los archivos .pri viene en tu ayuda.

Para incluir ese archivo, simplemente tienes que añadir esta línea en un archivo .PRO

include (<ruta del codigo>/<archivo.pri>)

De esta maneras, podrás compilar todo el proyecto en Android y funcionará sin problemas. Al menos, a mí me funcionó.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s