ES2817652B2 - Codigo visual, procedimiento para generar un codigo visual y procedimiento para decodificar un codigo visual - Google Patents
Codigo visual, procedimiento para generar un codigo visual y procedimiento para decodificar un codigo visual Download PDFInfo
- Publication number
- ES2817652B2 ES2817652B2 ES201930860A ES201930860A ES2817652B2 ES 2817652 B2 ES2817652 B2 ES 2817652B2 ES 201930860 A ES201930860 A ES 201930860A ES 201930860 A ES201930860 A ES 201930860A ES 2817652 B2 ES2817652 B2 ES 2817652B2
- Authority
- ES
- Spain
- Prior art keywords
- cells
- color
- code
- colors
- cell
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06K—GRAPHICAL DATA READING; PRESENTATION OF DATA; RECORD CARRIERS; HANDLING RECORD CARRIERS
- G06K19/00—Record carriers for use with machines and with at least a part designed to carry digital markings
- G06K19/06—Record carriers for use with machines and with at least a part designed to carry digital markings characterised by the kind of the digital marking, e.g. shape, nature, code
Landscapes
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Image Processing (AREA)
Description
DESCRIPCIÓN
Código visual, procedimiento para generar un código visual y procedimiento para decodificar un código visual
La presente descripción se refiere a un código visual para, por ejemplo, identificar elementos o localizar personas u otros activos, que comprende una matriz bidimensional de celdas de colores rodeada por un marco de color oscuro.
La descripción se refiere también a un procedimiento para generar un código visual tal como el descrito, y a un procedimiento para decodificar este código visual. También se refiere a un producto de programa informático para ejecutar el procedimiento de generación de un código visual, así como a un producto de programa informático para ejecutar el procedimiento de decodificación.
La invención se encuadra dentro de las tecnologías para reconocimiento y el soporte de datos, más concretamente soportes de registro para utilización con máquinas.
ESTADO DE LA TÉCNICA ANTERIOR
Un código visual es una representación, por ejemplo, impresa o en formato digital, de una determinada información que es susceptible de ser leída automáticamente por algún tipo de dispositivo de adquisición o captura de imagen conectado a un sistema informático o electrónico (el dispositivo de adquisición o captura de imagen puede ser el propio sistema informático o electrónico). Como portador de una determinada cantidad de información, su capacidad se mide en el número de combinaciones distintas que pueden almacenarse y, posteriormente decodificarse. Por lo tanto, su capacidad puede cuantificarse simplemente con un número concreto N de bits almacenados.
En general, estos códigos son utilizados en una amplia variedad de aplicaciones tanto en la industria como en el comercio, es decir, allí donde se requiera la identificación sencilla de un elemento cualquiera sobre el que se quiera realizar un determinado tipo de seguimiento. Con el amplio rango de aplicaciones potenciales que ofrece la posibilidad de tener un acceso rápido a información vinculada con cada código, que cubren desde los ámbitos del comercio (control de stock, cálculo rápido del importe de una compra, etc.) hasta la sanidad (acceso inmediato a expedientes médicos, control de material médico, etc.), pasando por la seguridad (control de accesos, identificación de personal, etc.), el entretenimiento (videojuegos, realidad
aumentada), o las aplicaciones industriales (control de procesos de fabricación, trazabilidad, etc.), se puede decir que los códigos visuales son ya ubicuos en casi cualquier ámbito de la economía y la sociedad.
Históricamente, los primeros códigos visuales eran unidimensionales (los populares códigos de barras, introducidos originalmente en [US Patent 2,612,994 (1952) “Classifying apparatus and method"]), y estaban diseñados para su lectura mediante dispositivos basados en una tecnología óptica específica que, en su momento, permitía fabricar sensores más sencillos y baratos que las cámaras. Dichos códigos fueron rápidamente adoptados por los servicios postales en sus inicios, si bien se extendieron posteriormente con rapidez en el ámbito del etiquetado e identificación de productos, tanto en entornos comerciales como industriales, generalizándose la gama de sensores disponibles, que en la actualidad suelen estar ya basados en láser o en cámaras convencionales.
A partir de la década de los 90, y precisamente a partir de la disponibilidad cada vez mayor de dispositivos de adquisición digital de imágenes conectables a, por ejemplo, un sistema informático, comenzaron a desarrollarse los códigos bidimensionales. Un código bidimensional, también llamado matricial, representa igualmente la información de una forma fácilmente detectable y decodificable visualmente de forma automática, pero tiene la ventaja de poder almacenar más información en una misma área. El código visual de este tipo más conocido es sin duda el código QR [US Patent 5,726,435 (1998) “Optically readable twodimensional code and method and apparatus using the same"].
La característica principal de estos códigos QR es que comprenden matrices binarias bidimensionales, en las que cada celda puede tomar un color blanco o negro, y que permiten diversos tamaños (en número de celdas) de cara a ofrecer una amplia gama de capacidades distintas, pudiéndose, en los de mayor resolución, incluso llegar a codificar hasta URLs completos, con varios centenares de bytes.
A partir de los códigos QR descritos, se han propuesto otros códigos bidimensionales similares. Algunos de los ejemplos más populares son los AztecCodes, AR Codes, DataMatrix, EZ codes, usados en los ámbitos comerciales, industriales, transportes, videojuegos o realidad aumentada, entre otros muchos. Todos estos diseños son estrictamente binarios, basándose los respectivos códigos en el uso exclusivo del blanco y el negro, habitualmente en forma de matriz dividida en celdas cuadradas, sin faltar tampoco
diseños alternativos, como el circular en el que está basado ShotCode. De todos ellos puede obtenerse información muy completa en, por ejemplo, [https://en.wikipedia.org/wiki/Barcode#Matrix_(2D)_barcodes)].
Una idea adicional, explotada por propuestas posteriores, es la extensión de la idea original de los códigos bidimensionales matriciales binarios para incluir colores diferentes al blanco y negro puros (por ejemplo, los colores primarios rojo, verde y azul, o sus complementarios cian, magenta y amarillo) para aumentar la capacidad de los códigos, manteniendo acotado el número de celdas de los mismos. Uno de los primeros ejemplos a este respecto sería [US Patent 2004/0182930 (2004) “Two dimensional code, methods and apparatuses for generating, displaying and reading the same"]. Posteriormente, [ “High Capacity Color Barcode (HCCB)", G. Janke (2007)], diseñado por Microsoft, fue otro de los pioneros en incorporar el color con el objetivo fundamental de aumentar la capacidad. Más recientemente, esta misma idea ha sido explotada también por los denominados JAB codes [ “JAB Code: Colorful barcode against counter feiting", Fraunhofer SIT (2018)], en este caso en el ámbito específico de la seguridad y las medidas antifraude.
En general, la mayoría de los códigos que usan el color para aumentar la capacidad suelen incluir una paleta de colores predeterminada, y cuentan con una cierta área incluida en el propio código habilitada a efectos de auto-calibración cromática de los mismos. En este sentido, por ejemplo, la patente [US Patent 2014 / 0,270,511 A1, “Image fragmentation for distortion correction of color space encoded image" (2014)], que fundamentalmente aporta la idea de poder almacenar cantidades de información mucho mayores que unas pocas decenas de bits, incluyendo la posibilidad de fragmentar la misma en múltiples marcos, habilita en cada uno de los fragmentos una zona ad-hoc para incluir la paleta de celdas con todos los colores usados, para disponer en todo momento de ella como referencia en el momento de la decodificación. Esta realización de usar ciertas celdas de posiciones fijas para incluir la información de calibración de color es la misma utilizada en la patente española [ES 2,616,146 B2, “Método de detección y reconocimiento de marcadores visuales de largo alcance y alta densidad", (2018)], que usa sólo los cuatro colores básicos negro, magenta, cian y amarillo, colocándolos sistemáticamente en un orden predeterminado en las correspondientes celdas de las cuatro esquinas de cada código visual, en una implementación concreta de códigos bidimensionales a color diseñados específicamente para ser leídos a distancia por teléfonos inteligentes, tabletas u otros dispositivos móviles, con el objetivo de guiar a discapacitados visuales.
Esta última patente pone el énfasis en la posibilidad de decodificación a larga distancia, más que en el aumento de la capacidad. Además, el ámbito principal de aplicación de esta patente es el de las aplicaciones para invidentes, y en particular, por tanto, la detección y decodificación de códigos estáticos, situados en diferentes lugares del entorno mediante teléfonos inteligentes u otro tipo de dispositivos móviles (por ejemplo, lugares de interés en una ciudad, paradas de transporte, ubicaciones específicas en el interior de edificios, etc.).
Por otro lado, la gran mayoría de los códigos visuales comentados hasta este punto introducen alguna forma de redundancia con el objetivo de detectar (y en algunos casos incluso autocorregir) posibles errores en el proceso de decodificación (bits de paridad, checksums, CRCs, códigos polinomiales, Reed Solomon, etc.).
Otros documentos relacionados con la invención son los que se comentan a continuación.
El documento EP2105868A1 divulga (párrafos 0018-0035) un código compuesto por una pluralidad de celdas dispuestas en forma de matriz, que se distingue del fondo usando un borde cuadrado. Las celdas pueden tener diferentes colores, densidades o luminancias. Las celdas se distribuyen en bloques (agregado de una pluralidad de celdas) con unos patrones específicos de inicio (facilita la orientación del código) y fin, bloques específicos de corrección de errores (en las celdas exteriores, junto al borde) y bloques de datos (formando un cuadrado con las celdas interiores).
El documento EP1443452A2 divulga (párrafos 0030-0051) un código (figura 1A) que contiene cinco patrones en ubicaciones específicas para facilitar la orientación del mismo. Asociados a estos patrones se sitúan también las cinco referencias de color necesarias para decodificar el código. Igualmente, (párrafos 0074, 0092, 0109) la distinta ubicación predeterminada de los colores de referencia permite reconocer el tamaño de la matriz del código. El resto de la matriz (párrafos 0113-0148) se asigna completamente a bloques de datos compuestos por conjuntos predeterminados de celdas. La agrupación entre celdas de un mismo bloque se indica por un valor constante "86”, y se incorpora un código de detección de errores en cada bloque de datos.
El documento US2009310874A1 divulga (párrafos 0008-0016) un código en el que se definen celdas específicas para facilitar tanto la orientación del código, como la paleta de colores
(figuras 1 y 2). Por ejemplo en la figura 1, en las celdas de esquinas diagonalmente opuestas se utiliza un mismo color base, y en las tres celdas adyacentes de cada esquina se utiliza el resto de colores, en una posición predeterminada, como paleta de referencia (seis colores adicionales). El resto de celdas se utiliza para datos. No se realizan referencias a la incorporación de códigos de detección de errores. Se centra únicamente en la orientación y en la identificación efectiva de la paleta de colores.
El documento US2014270511A1 divulga (párrafos 0048-0050, 0064-0070) un código que se enmarca en un borde blanco y negro para facilitar la orientación, también dispone de un marco especial (cebra) que posibilita determinar el tamaño de las celdas. En alguna posición predeterminada (dentro o fuera de dicho marco), también se incluyen unas celdas especiales de referencia de color para calibración. El resto de las celdas se utiliza para datos. Existe un cierto control de errores al transmitir en una cabecera (no ubicada en el código) el CRC original, con objeto de poder compararlo con el CRC de la información decodificada.
El documento US2007278303A1 divulga (párrafos 0016, 0019) un código que incorpora un bloque de configuración en blanco y negro en una ubicación predeterminada. El resto de las celdas se consideran bloques de datos, son de igual tamaño que el bloque de configuración, y pueden utilizar cualquier color. Se dispone de un marco blanco, en cuyo interior se encuentran unos marcadores de esquinas (de configuración predeterminada) que delimitan el código. Para delimitar las celdas que componen cada bloque de datos se incorporan elementos separadores. Aunque indica (párrafos 0024-0030) que el bloque de configuración incorpora como metadatos información del tipo corrección de errores, no detalla esta configuración.
El documento US2013092738A1 divulga (párrafos 0019-0020) un código que quiere ser una alternativa a los códigos en blanco y negro. En este caso se utiliza la superposición de tres niveles superpuestos con distintos colores, utilizando información de control de errores en cada capa.
El documento EP2806377A2 divulga (párrafos 0015-0031) un código que comprende diversas celdas: celdas con la paleta de referencia que se encuentran ubicadas en la periferia en un orden predeterminado, celdas alternativas en blanco y negro para posicionar el código, y celdas de datos. No referencia ningún tipo de detección o control de errores.
El documento EP2068117A2 divulga (párrafos 0027-0031) un código que dispone de secciones diferenciadas para facilitar la orientación, referencia de colores, datos y una sección adicional que pudiera usarse para detección de errores.
En los documentos analizados, se han encontrado diversos documentos en los que el código se circunscribe dentro de un marco blanco y negro. Igualmente, existen documentos en los que el conjunto de celdas disponibles se divide en bloques; y en los que ciertos bloques se utilizan para facilitar el posicionamiento utilizando patrones específicos (formas, colores) en ubicaciones predeterminadas. En todos los casos estos bloques o celdas particulares tienen una disposición (forma y/o color) predeterminado y su única función es indicar la orientación del código. Únicamente, en un documento (EP1443452) se utiliza una combinación diferente de colores para incorporar información sobre la paleta y adicionalmente informar sobre el tamaño de la matriz. Respecto a la capacidad de corrección de errores de los códigos analizados, algunos disponen de ubicaciones específicas para mostrar esta información, otros los incorporan junto con la información de datos, e incluso en algún caso la información de error es transmitida previamente en una cabecera. Esto significa que, en caso de incorporar dicha información, requiere celdas adicionales.
Respecto al bloque de orientación del código, los documentos analizados describen diferentes bloques para realizar diferentes funcionalidades. Así, por ejemplo, describen uno o más bloques que tienen la capacidad de proporcionar información sobre la orientación del código y otro bloque diferente (o más) para proporcionar información adicional relacionada con la corrección de errores.
Respecto a los bloques de datos, algunos documentos analizados no detallan su estructura, otros utilizan elementos separadores especiales, y otros una secuencia específica que se incorpora en el código.
En consecuencia, hay una necesidad de un código visual que resuelva al menos parcialmente los problemas mencionados anteriormente.
EXPLICACIÓN DE LA INVENCIÓN
En un primer aspecto, se proporciona un código visual. El código visual comprende una matriz bidimensional de celdas y un marco de un color oscuro que rodea la matriz de celdas. El código se caracteriza por el hecho de que la matriz de celdas comprende al menos uno de:
• uno o más grupos de cuatro celdas en los que:
o las celdas están dispuestas en dos filas y dos columnas,
o en la posición de lectura del código visual, dos de las celdas de cada grupo de cuatro celdas, de las tres que forman la primera fila y la primera columna, son cada una de un color claro y/o un color oscuro, y las dos restantes son de colores diferentes entre sí, de una pluralidad de colores que no incluye el color claro y el color oscuro;
• uno o más grupos de tres celdas en los que:
o cada grupo comprende tres celdas conectadas alineadas o en forma de L, o cada grupo de tres celdas tiene una única celda de un color claro o de un color oscuro y el resto de las celdas son de colores diferentes entre sí, de la pluralidad de colores;
en el que los grupos de celdas codifican información y/o implementan un sistema de redundancia para la detección de errores en la decodificación del código visual.
De este modo, se consigue un código visual multicolor que puede ser decodificado, a partir de imágenes tomadas con un dispositivo de captura adecuado, de forma robusta en condiciones de captura potencialmente problemáticas, tales como las degradaciones cromáticas y pérdidas de resolución crecientes que se producen al alejar el código a identificar del sensor óptico y/o variar significativamente las condiciones lumínicas.
El código obtiene un compromiso entre la capacidad de codificación de información y la robustez a ser detectado a potenciales largas distancias. Este compromiso se obtiene representando tres valores numéricos diferentes, cada uno de los cuales puede ser reconocido usando procedimientos de interpretación diferentes sobre el código visual. Así, el primer valor numérico ofrece una mayor expresividad (mayor número de combinaciones posibles) que el segundo valor numérico y, a su vez, el segundo valor numérico ofrece un valor más informativo que el tercer valor numérico. En contrapartida, la robustez en la determinación de los códigos es inversamente proporcional a la capacidad, con el segundo valor numérico y el tercer valor numérico soportando incrementalmente mejor cierto tipo de degradaciones de color y otros tipos de ruido de imagen. Más adelante, los tres valores numéricos serán descritos con más detalle.
El código puede estar especialmente diseñado para su uso industrial; en particular su ámbito principal de aplicación puede ser la identificación de elementos tales como productos, cajas o palets en control de trazabilidad, si bien tampoco se descartan otras aplicaciones alternativas, como, por ejemplo, la localización de personas, vehículos o cualquier otro tipo de activos móviles. Usando esta tecnología, resulta viable realizar la lectura de códigos a varios metros de distancia, incluso para tamaños de impresión de etiquetas relativamente pequeños (por ejemplo, de entre 5 y 10 cm de lado), requiriéndose únicamente una línea visual directa entre el código y el dispositivo de captura de imagen (por ejemplo, una cámara conectada con un dispositivo informático, usando cualquier medio de comunicación inalámbrico o cableado). Además, permite la lectura simultánea y computacionalmente eficiente de varios códigos en cada imagen capturada, permitiendo así cubrir un espacio visual y de trabajo amplio con una sola captura. Resulta, por tanto, una solución más económica y flexible que otros sistemas de identificación, como soluciones inalámbricas (por ejemplo, RFID), que además de más costosas pueden tener menos garantías en entornos poco controlados, donde pueda haber interferencias causadas por elementos como agua o metal.
El código comparte ciertas similitudes de diseño con otros códigos visuales previos. En particular, el uso de una matriz bidimensional de celdas, la asignación de diferentes colores a éstas para aumentar la capacidad de codificación, el marco oscuro (por ejemplo, negro) sobre fondo claro (por ejemplo, blanco) para facilitar la detección inicial, junto con el empleo de algún tipo de redundancia para la detección de errores en el proceso de decodificación, son características particularmente comunes en este tipo de códigos. Sin embargo, las principales características aportadas son la eliminación de celdas de calibración de color, para aumentar la capacidad de código manteniendo fijo el número de celdas disponibles; la existencia de una consistencia interna en la distribución de colores por grupos de celdas, que añade un mecanismo de control de errores adicional (y por tanto complementario) al clásico checksum; y el uso separado de la información cromática/monocromática para obtener los tres valores numéricos simultáneos (al menos uno de ellos), con los previamente mencionados compromisos entre capacidad y robustez.
Los códigos descritos pueden estar diseñados para ser impresos sobre una etiqueta, papel, adhesivo, plástico, tejido, o cualquier otro tipo de soporte que pueda ser adherido por algún medio a cualquier tipo de activo potencialmente móvil (productos, materiales, personas, etc.) sobre el que interese realizar un seguimiento o trazabilidad. Una característica fundamental
de los mismos, pues, es que deben ser extremadamente robustos a variaciones grandes de iluminación en el escenario de decodificación: típicamente, son fundamentalmente las cámaras las que se encuentran situadas de forma estática en puntos clave del escenario de aplicación, aunque no existe tampoco ninguna limitación en que éstos puedan ser igualmente detectados por cámaras móviles, como por ejemplo cámaras montadas en carretillas motorizadas, pero los códigos estarán situados indefectiblemente en activos móviles, y pueden sufrir, por lo tanto, grandes variaciones en la iluminación que reciben. Ello afecta en gran medida a cómo son sensorizados por los correspondientes dispositivos de captura de imagen. Las consideraciones principales de diseño de los códigos visuales propuestos pueden basarse fundamentalmente, pues, en la idea de hacer los procedimientos de localización y posterior decodificación lo más robustos posible a las degradaciones de imagen producidas habitualmente en dichas condiciones de movilidad y cambios de iluminación constantes.
En algunos ejemplos, la codificación de la información puede realizarse mediante al menos un grupo de tres celdas, mientras que la implementación del sistema de redundancia para la detección de errores puede conseguirse a través de al menos un grupo de cuatro celdas, aunque otras variantes son posibles. Por ejemplo, se podrían usar las cuaternas para la codificación de información, sin que el código implemente un sistema de redundancia para la detección de errores, o se podrían utilizar ternas para implementar un sistema de redundancia o formar parte de él (por ejemplo, junto con alguna cuaterna).
En algunos ejemplos, el código visual puede comprender un fondo de un color claro externo al marco de un color oscuro, lo que facilita la detección inicial del código en la imagen capturada, para ser posteriormente decodificado.
Por otro lado, el ancho del marco de un color oscuro puede ser, por ejemplo, igual al ancho de una celda o puede ser la mitad del ancho de una celda.
De acuerdo con algunos ejemplos, el código visual puede comprender, en la posición de lectura del código visual, un grupo de cuatro celdas dispuesto en la esquina superior izquierda de la matriz de celdas. Además, el código visual puede comprender un grupo de tres celdas conectadas en forma de L en cada una de las esquinas restantes de la matriz de celdas.
1
De este modo, se consigue un código visual que es invariante a rotaciones, dado que se puede determinar correctamente cuál de sus esquinas es la correspondiente a la superior izquierda, teniendo en cuenta el hecho de que, de los cuatro grupos de tres celdas correspondientes a las cuatro esquinas, solo el grupo de tres celdas que forma parte del grupo de cuatro celdas puede comprender forzosamente dos colores claro y/u oscuro, frente a las tres esquinas restantes que solo pueden contener una celda de color claro u oscuro.
Por lo tanto, este bloque de orientación del código en base al grupo de cuatro celdas descrito puede combinar en un único bloque la capacidad de proporcionar información sobre la orientación del código e información adicional relacionada con la corrección de errores (esta última funcionalidad se describirá más adelante). La utilización de un grupo de cuatro celdas (cuaterna) diferente del tamaño de los bloques de datos (grupos de tres celdas o ternas), junto con la distribución y restricciones particulares de colores de las cuatro celdas de dicho bloque, proporciona esta doble funcionalidad. Esta duplicidad de funciones realizada por un mismo conjunto de celdas permite reducir el número de celdas requeridas.
Respecto a los bloques de datos, la posible utilización de bloques formados por tres celdas (ternas), sin tener que predefinir su forma específica, aparte de ser útiles para determinar la orientación adecuada o posición de lectura del código, permite identificar qué conjunto de celdas pertenecen a cada bloque únicamente por la distribución específica de los colores asignados. Además, la restricción exigida para que una celda de cada terna únicamente pueda tener los colores blanco o negro (claro u oscuro), y su posible determinación de los mismos mediante la comparación con el marco de un color oscuro y el fondo de un color claro, posibilita la utilización del código en situaciones complicadas de iluminación. Con la utilización adicional en las otras dos celdas de cada terna de la combinación de dos colores (con sus restricciones particulares), se amplía la capacidad de almacenamiento de información para situaciones más favorables de iluminación. Además la utilización de colores, con las restricciones exigidas, elimina la necesidad de incorporar una paleta de referencia en el código, permitiendo de nuevo ampliar la información contenida en el código sin necesidad de ampliar el tamaño del mismo.
En consecuencia, la configuración particular del bloque de control de orientación que incorpora los códigos de redundancia (cuaterna) y la configuración específica de colores de los bloques de datos (ternas) proporcionan, entre otros, los efectos de incrementar la capacidad de información almacenada en el código para un número fijo de celdas disponibles.
No se requiere la reserva de celdas específicas para control de errores, o para introducir una paleta de colores de referencia. Además, la posibilidad de usar de forma independiente pero complementaria la información cromática (pluralidad de colores) y monocromática (color claro, por ejemplo, blanco, y color oscuro, por ejemplo, negro) posibilita que un código de este tipo sea usado en distintos entornos de acuerdo con la iluminación disponible en cada caso, ampliando así la capacidad de almacenamiento en las situaciones de iluminación apropiadas.
En algunos ejemplos, la pluralidad de colores comprende al menos tres de los siguientes colores: cian, magenta, amarillo, rojo, verde, azul. Por ejemplo, puede ser cualquier combinación de colores, pero es posible elegir tres colores que estén lo más separados posible en el cubo RGB, como pueden ser las combinaciones {cian, magenta, amarillo} o {rojo, verde, azul}. La pluralidad de colores también puede representarse en una escala de grises.
De acuerdo con algunos ejemplos, un color oscuro puede ser el color negro. En realidad, puede ser cualquier color oscuro, pero el color negro (mate) permite maximizar el contraste con el entorno o fondo claro (por ejemplo, blanco), lo que facilita la detección del código visual. En cualquier caso, el color claro puede ser de un color mucho más claro que el del marco oscuro. Además, el color oscuro del marco y el color claro del fondo pueden servir de referencia para un color claro y/o oscuro utilizado en alguna de las celdas de la matriz de celdas.
De acuerdo con algunos ejemplos, la matriz de celdas puede tener el mismo número de filas que de columnas, aunque no es esencial que la matriz sea cuadrada. Pueden diseñarse estructuras rectangulares, hexagonales, etc., que tendrían sus agrupamientos de celdas específicos pero seguirían el mismo procedimiento de codificación.
En algunos ejemplos, la información codificada por los grupos de celdas puede comprender al menos un primer valor numérico (también referenciado como Code A) que se determina a partir de valores obtenidos de las celdas de un color claro o de un color oscuro y de las celdas de colores dentro de la pluralidad de colores, de los grupos de tres celdas. En este caso, la decodificación de este primer valor numérico depende de la correcta identificación cromática de los colores de la pluralidad de colores, por lo que la decodificación de la combinación concreta es menos robusta a posibles degradaciones cromáticas de la imagen capturada del código visual.
En algunos ejemplos, la información codificada por los grupos de celdas puede comprender al menos un segundo valor numérico (también referenciado como Code B) que se determina a partir de valores obtenidos de las celdas en base a su color en una escala de grises, de los grupos de tres celdas. De este modo, se consigue información codificada en forma de segundo valor numérico o Code B, cuya decodificación es robusta a degradaciones cromáticas.
En algunos ejemplos, la información codificada por los grupos de celdas puede comprender al menos un tercer valor numérico (también referenciado como Code C) que se determina a partir de valores obtenidos de todas las celdas de un color claro o de un color oscuro de la matriz de celdas. Este Code C puede proporcionarse solo para el caso en que la lectura del Code A y del Code B falle, a modo de hash, con un rango bastante más reducido que los Codes A y B. No dispone de un sistema de redundancia para la detección de errores en la decodificación del código visual, para controlar posibles errores. Por lo tanto, puede ser utilizado como último recurso en condiciones de iluminación extremas, trabajando únicamente sobre una versión binaria (0/1) de la imagen de entrada.
De acuerdo con algunos ejemplos, el sistema de redundancia para la detección de errores en la decodificación del código visual puede implementarse a partir de valores obtenidos de las celdas de un color claro o de un color oscuro y de las celdas de colores dentro de la pluralidad de colores, de los grupos de cuatro celdas, para detectar errores en la decodificación del primer valor numérico.
En algunos ejemplos, el sistema de redundancia para la detección de errores en la decodificación del código visual puede implementarse a partir de valores obtenidos de las celdas de un color claro o un color oscuro de los grupos de cuatro celdas, para detectar errores en la decodificación del segundo valor numérico.
Por lo tanto, los códigos visuales propuestos pueden introducir un esquema jerárquico de checksums dirigido a aumentar la robustez global y evitar la posible aceptación de códigos erróneos. Este esquema puede venir proporcionado al menos por un grupo de cuatro celdas que puede ser usado también para obtener la orientación del código visual. Esta duplicidad de funciones realizada por un mismo conjunto de celdas (cuaterna) permite reducir el número de celdas requeridas.
1
De acuerdo con otro aspecto, se proporciona un procedimiento para generar un código visual tal como se ha descrito anteriormente. El procedimiento comprende:
• obtener el número de filas y columnas de la matriz de celdas;
• determinar la combinación de uno o más grupos de tres celdas y/o uno o más grupos de cuatro celdas adecuada para el número obtenido de filas y columnas de la matriz de celdas;
• obtener la información a codificar;
• codificar la información y/o implementar el sistema de redundancia para la detección de errores en la decodificación del código visual, en base a la siguiente configuración: o para cada grupo de tres celdas de la combinación determinada:
■ asignar un color claro o un color oscuro a una de las celdas del grupo de tres celdas, definiéndose un primer parámetro que toma un valor predeterminado que depende de si el color asignado a la celda es el color claro o el color oscuro, y definiéndose un segundo parámetro que toma un valor predeterminado que depende de la celda, del grupo de tres celdas, a la que se le asigna el color claro o el color oscuro;
■ asignar dos colores de la pluralidad de colores, que no incluye el color claro y el color oscuro, a las dos celdas restantes del grupo de tres celdas, definiéndose un tercer parámetro que toma un valor predeterminado que depende de al menos un color no escogido de la pluralidad de colores, y definiéndose un cuarto parámetro que toma un valor predeterminado que depende del orden de los dos colores asignados a las celdas, en base a un orden pre-establecido de los colores de la pluralidad de colores;
o para cada grupo de cuatro celdas de la combinación determinada:
■ asignar un color claro y/o un color oscuro a dos de las tres celdas que forman la primera fila y la primera columna del grupo de cuatro celdas, definiéndose un quinto parámetro que toma un valor predeterminado que depende de la celda que no tiene asignado un color claro o un color oscuro, y definiéndose un sexto parámetro que toma un valor predeterminado que depende de la combinación de color claro y/o color oscuro asignada a las dos celdas;
■ asignar dos colores de la pluralidad de colores, que no incluye el color claro y el color oscuro, a las dos celdas restantes del grupo de cuatro celdas, definiéndose un séptimo parámetro que toma un valor predeterminado que depende de al menos un color no escogido de la pluralidad de colores, y definiéndose un octavo parámetro que toma un valor predeterminado que
depende del orden de los dos colores asignados a las celdas, en base a un orden pre-establecido de los colores de la pluralidad de colores.
De este modo, se genera un código visual con las características descritas con anterioridad.
En algunos ejemplos, el primer parámetro puede tomar un valor 0 o 1 (aunque los valores podrían ser otros) dependiendo de si el color asignado a la celda es el color claro o el color oscuro, es decir, el primer parámetro puede tomar el valor 0 si el color asignado es el color oscuro (por ejemplo, negro) o el valor 1 si el color asignado es el color claro (por ejemplo, blanco), o viceversa. Este primer parámetro puede referenciarse como bit monocromático (bm) de la terna.
Por otro lado, el segundo parámetro puede tomar un valor 0, 1 o 2 (aunque pueden ser otros) dependiendo de si la celda a la que se le asigna el color claro o el color oscuro, en posición de lectura del código, es la primera celda, la segunda celda o la tercera celda del grupo de tres celdas. De este modo, el segundo parámetro puede tomar tres valores diferentes, por ejemplo, 0 si el color claro o el color oscuro está en la primera celda del grupo de tres celdas, 1 si está en la segunda celda o 2 si está en la tercera celda (aunque la asignación de valores puede ser cualquier otra). Este segundo parámetro puede referenciarse como trit monocromático (tm) de la terna.
En consecuencia, con esta configuración entre el bit y el trit monocromático se consigue un total de 2x3=6 posibilidades diferentes por cada terna, es decir, (bm,tm)={(0,0),(1,0),(0,1),(1,1),(0,2),(1,2)}. Dependiendo del número de ternas se conseguirá un número determinado de posibilidades diferentes, las cuales pueden ser decodificadas incluso en condiciones de pérdida absoluta de la información de color, requiriendo simplemente que la celda de color claro o de color oscuro pueda ser correctamente localizada en cada terna. Dado el procedimiento descrito, este requerimiento siempre será posible porque cada una de las otras dos celdas de la terna tienen necesariamente un color de la pluralidad de colores (por ejemplo, cian, magenta y amarillo), y estos colores pueden mostrar una diferencia de valor de gris medio mayor que la que muestra el elemento de color claro o de color oscuro con su correspondiente color claro o color oscuro calibrado, obtenidos estos últimos directamente del exterior y del interior del marco de color oscuro sobre fondo blanco del código visual. Estas posibilidades descritas forman el correspondiente segundo valor numérico (Code B) descrito anteriormente, para la codificación de información.
1
De acuerdo con algunos ejemplos, el tercer parámetro puede tomar un valor 0, 1o 2 (aunque pueden ser otros) dependiendo del color no escogido de la pluralidad de colores. Así, por ejemplo, si la pluralidad de colores comprende cian, magenta y amarillo, el tercer parámetro puede tomar, por ejemplo, el valor 0 si el color descartado es el cian, el valor 1 si el color descartado es el magenta, y el valor 2 si el color descartado es el amarillo. Obviamente, es aceptable cualquier combinación de valor/color descartado. Este tercer parámetro puede referenciarse como trit cromático (tc) de la terna.
En algunos ejemplos. el cuarto parámetro puede tomar un valor 0 o 1 (aunque pueden ser otros) dependiendo de si el orden coincide o no con el orden preestablecido de los colores de la pluralidad de colores. De este modo, por ejemplo, el cuarto parámetro puede tomar el valor 0 si el orden coincide con el orden preestablecido (por ejemplo, cian<magenta<amarillo) o el valor 1 si el orden no es coincidente, o viceversa.
Por lo tanto, de nuevo se consiguen 2x3=6 posibilidades diferentes para unos valores concretos (bc,tc) que, si se aprovecha la combinatoria inducida por un número determinado de ternas (es decir, grupos de tres celdas), se consiguen posibilidades adicionales que, además, son completamente independientes de las combinaciones monocromáticas (bm,tm) descritas anteriormente. La combinación de la información monocromática y de la información cromática da lugar a una combinatoria elevada de combinaciones distintas, cada una de las cuales da lugar al primer valor numérico (Code A) descrito anteriormente, para la codificación de información. Sin embargo, en este caso sí que la decodificación depende de la correcta identificación cromática de los colores de la pluralidad de colores, por lo que la decodificación de la combinación concreta es menos robusta a posibles degradaciones cromáticas de la imagen capturada del código visual.
En algunos ejemplos, el quinto parámetro puede tomar un valor 0, 1 o 2 (aunque pueden ser otros) dependiendo de si la celda a la que no se le asigna el color claro o el color oscuro, en posición de lectura del código, es la primera celda, la segunda celda o la tercera celda de las tres celdas que forman la primera fila y la primera columna del grupo de cuatro celdas. De este modo, por ejemplo, si la celda a la que no se le asigna el color oscuro o el color claro es la primera celda, el valor del quinto parámetro puede tomar el valor 0, si es la segunda celda puede tomar el valor 1 y si es la tercera celda puede tomar el valor 2 (aunque la asignación
1
de valores puede ser cualquier otra). El quinto parámetro puede referenciarse como trit monocromático (tmc) adicional para cada cuaterna o grupo de cuatro celdas.
De acuerdo con algunos ejemplos, el sexto parámetro toma un valor {(0,0),(0,1),(1,0),(1,1)} (aunque pueden ser otros) dependiendo de la combinación de color claro y/o color oscuro asignada a las dos celdas. Así, si la combinación es oscuro-oscuro el sexto parámetro puede tomar el valor (0,0), si la combinación es oscuro-claro puede tomar el valor (0,1), si la combinación es claro-oscuro puede tomar el valor (1,0), o si la combinación es claro-claro puede tomar el valor (1,1), aunque la asignación de valores puede ser cualquier otra. Este sexto parámetro puede referenciarse como dos bits monocromáticos (bmc0, bmc1) adicionales para la cuaterna.
En este caso, acumulando la información de tmc, bmc1 y bmc0 se dispone de un total de 3x2x2=12 posibilidades que, de nuevo, puede ser determinadas con robustez a degradaciones cromáticas extrema. Estas 12 posibilidades o valores pueden usarse para aumentar el número de posibles segundos valores numéricos (Code B), aunque se propone utilizarlos como checksum de los valores codificados por las ternas, para detectar posibles errores en la decodificación, es decir, como sistema de redundancia para la detección de errores en la decodificación del Code B .
En algunos ejemplos, el séptimo parámetro puede tomar un valor 0, 1 o 2 (aunque pueden ser otros) dependiendo del color no escogido de la pluralidad de colores. Así, si se parte del mismo ejemplo que el utilizado para las ternas, el séptimo parámetro puede tomar, por ejemplo, el valor 0 si el color descartado es el cian, el valor 1 si el color descartado es el magenta, y el valor 2 si el color descartado es el amarillo. Obviamente, es aceptable cualquier combinación de valor/color descartado. Este séptimo parámetro puede referenciarse como trit cromático (tcc) adicional de la cuaterna.
De acuerdo con algunos ejemplos, el octavo parámetro puede tomar un valor 0 o 1 (aunque podrían ser otros) dependiendo de si el orden coincide o no con el orden pre-establecido de los colores de la pluralidad de colores. De este modo, por ejemplo, el octavo parámetro puede tomar el valor 0 si el orden coincide con el orden pre-establecido (por ejemplo, cian<magenta<amarillo) o el valor 1 si el orden no es coincidente, o viceversa. Este octavo parámetro puede referenciarse como bit cromático (bcc) adicional.
Una vez más, también en este caso se obtienen 2x3=6 posibilidades o valores diferentes para cada par de valores concretos (bcc,tcc), que pueden ser utilizados a modo de checksum para controlar posibles errores de decodificación de, en este caso, el primer valor numérico o Code A, ya que la decodificación de estos ítems de información (bcc,tcc) dependen de la correcta identificación de la pluralidad de colores (por ejemplo, cian, magenta y amarillo). En consecuencia, su determinación no es tan robusta como los ítems de información monocromática descritos anteriormente, para las diferentes combinaciones correspondientes a los Code B.
En resumen, sólo identificando correctamente las posiciones de los valores claro y oscuro (por ejemplo, blanco y negro respectivamente) en la/s terna/s y en la/s cuaterna/s, es posible codificar un número determinado de posibilidades diferentes (depende del número de ternas y de cuaternas establecido en la matriz de celdas), controladas por un checksum. Estas posibilidades forman el llamado segundo valor numérico o Code B, robusto a degradaciones cromáticas. Si, además, se tiene la capacidad de determinar correctamente los colores de la pluralidad de colores (por ejemplo, cian, magenta y amarillo), es posible disponer de otro número determinado, tal como el Code A, de posibilidades o valores, controladas por otro checksum.
Por otro lado, si uno de estos grupos de cuatro celdas se encuentra, en posición de lectura del código, en la esquina superior izquierda de la matriz de celdas y el resto de las esquinas presenta ternas en forma de L, puede conseguirse un procedimiento de codificación invariante a rotaciones. Ello significa que, aunque el código aparezca rotado en la imagen capturada, en cualquiera de los cuatro posibles ángulos de rotación de un cuadrado (0, 90, 180 o 270 grados), el procedimiento de decodificación puede determinar sin problemas cuál de las esquinas es la correspondiente a la superior izquierda, es decir, a la cuaterna de celdas. Ello es debido a que, de las cuatro ternas de celdas correspondientes a las cuatro esquinas, sólo las celdas que forman parte de la primera fila y de la primera columna de la cuaterna contienen forzosamente dos colores claro y/u oscuro, frente a las otras tres esquinas, en la que un y sólo un color de las celdas de la terna correspondiente puede tener un color claro u oscuro. Esta propiedad es importante para poder decodificar los códigos visuales en cualquier posición relativa de éstos respecto a la cámara, independientemente de la posición de giro concreto respecto a la misma con el que se estén visualizando en cada momento.
1
En algunos ejemplos, los grupos de tres celdas pueden codificar la información, mientras que los grupos de cuatro celdas pueden implementar el sistema para la detección de errores en la decodificación del código visual. También son posible otras configuraciones, tales que tanto las terna como las cuaternas codifican información y, por lo tanto, no se implementa un sistema de detección de errores.
Según otro aspecto, se proporciona un producto de programa informático. El producto de programa informático comprende instrucciones de programa para provocar que un sistema realice un procedimiento para generar un código visual, tal como el descrito anteriormente. El programa informático puede estar almacenado en unos medios de almacenamiento físico, tales como unos medios de grabación, una memoria de ordenador, o una memoria de sólo lectura, o puede ser portado por una onda portadora, tal como eléctrica u óptica.
De acuerdo con otro aspecto, se proporciona un sistema para generar un código visual, tal como el descrito anteriormente. El sistema comprende:
• medios para obtener el número de filas y columnas de la matriz de celdas;
• medios para determinar la combinación de uno o más grupos de tres celdas y/o uno o más grupos de cuatro celdas adecuada para el número obtenido de filas y columnas de la matriz de celdas;
• medios para obtener la información a codificar;
• medios para codificar la información y/o implementar el sistema de redundancia para la detección de errores en la decodificación del código visual, en base a la siguiente configuración:
o para cada grupo de tres celdas de la combinación determinada:
■ medios para asignar un color claro o un color oscuro a una de las celdas del grupo de tres celdas, definiéndose un primer parámetro que toma un valor predeterminado que depende de si el color asignado a la celda es el color claro o el color oscuro, y definiéndose un segundo parámetro que toma un valor predeterminado que depende de la celda, del grupo de tres celdas, a la que se le asigna el color claro o el color oscuro;
■ medios para asignar dos colores de la pluralidad de colores, que no incluye el color claro y el color oscuro, a las dos celdas restantes del grupo de tres celdas, definiéndose un tercer parámetro que toma un valor predeterminado que depende de al menos un color no escogido de la pluralidad de colores, y definiéndose un cuarto parámetro que toma un valor predeterminado que
1
depende del orden de los dos colores asignados a las celdas, en base a un orden pre-establecido de los colores de la pluralidad de colores;
o para cada grupo de cuatro celdas de la combinación determinada:
■ medios para asignar un color claro y/o un color oscuro a dos de las tres celdas que forman la primera fila y la primera columna del grupo de cuatro celdas, definiéndose un quinto parámetro que toma un valor predeterminado que depende de la celda que no tiene asignado un color claro o un color oscuro, y definiéndose un sexto parámetro que toma un valor predeterminado que depende de la combinación de color claro y/o color oscuro asignada a las dos celdas;
■ medios para asignar dos colores de la pluralidad de colores, que no incluye el color claro y el color oscuro, a las dos celdas restantes del grupo de cuatro celdas, definiéndose un séptimo parámetro que toma un valor predeterminado que depende de al menos un color no escogido de la pluralidad de colores, y definiéndose un octavo parámetro que toma un valor predeterminado que depende del orden de los dos colores asignados a las celdas, en base a un orden preestablecido de los colores de la pluralidad de colores.
De acuerdo aún con otro aspecto, se proporciona un sistema para generar un código visual. Este sistema está configurado para:
• obtener el número de filas y columnas de la matriz de celdas;
• determinar la combinación de uno o más grupos de tres celdas y/o uno o más grupos de cuatro celdas adecuada para el número obtenido de filas y columnas de la matriz de celdas;
• obtener la información a codificar;
• codificar la información y/o implementar el sistema de redundancia para la detección de errores en la decodificación del código visual, en base a la siguiente configuración: o para cada grupo de tres celdas de la combinación determinada:
■ asignar un color claro o un color oscuro a una de las celdas del grupo de tres celdas, definiéndose un primer parámetro que toma un valor predeterminado que depende de si el color asignado a la celda es el color claro o el color oscuro, y definiéndose un segundo parámetro que toma un valor predeterminado que depende de la celda, del grupo de tres celdas, a la que se le asigna el color claro o el color oscuro;
2
■ asignar dos colores de la pluralidad de colores, que no incluye el color claro y el color oscuro, a las dos celdas restantes del grupo de tres celdas, definiéndose un tercer parámetro que toma un valor predeterminado que depende de al menos un color no escogido de la pluralidad de colores, y definiéndose un cuarto parámetro que toma un valor predeterminado que depende del orden de los dos colores asignados a las celdas, en base a un orden pre-establecido de los colores de la pluralidad de colores;
o para cada grupo de cuatro celdas de la combinación determinada:
■ asignar un color claro y/o un color oscuro a dos de las tres celdas que forman la primera fila y la primera columna del grupo de cuatro celdas, definiéndose un quinto parámetro que toma un valor predeterminado que depende de la celda que no tiene asignado un color claro o un color oscuro, y definiéndose un sexto parámetro que toma un valor predeterminado que depende de la combinación de color claro y/o color oscuro asignada a las dos celdas;
■ asignar dos colores de la pluralidad de colores, que no incluye el color claro y el color oscuro, a las dos celdas restantes del grupo de cuatro celdas, definiéndose un séptimo parámetro que toma un valor predeterminado que depende de al menos un color no escogido de la pluralidad de colores, y definiéndose un octavo parámetro que toma un valor predeterminado que depende del orden de los dos colores asignados a las celdas, en base a un orden pre-establecido de los colores de la pluralidad de colores.
Según otro aspecto, se proporciona un sistema para generar un código visual. El sistema comprende una memoria y un procesador. La memoria almacena instrucciones de programa informático ejecutables por el procesador. Las instrucciones comprenden funcionalidades para ejecutar un procedimiento para generar un código visual, tal como el descrito anteriormente.
De acuerdo con otro aspecto, se proporciona un procedimiento para decodificar un código visual tal como el descrito anteriormente. Este código visual está codificado de acuerdo con un procedimiento para generar un código visual también descrito anteriormente. El procedimiento de decodificación comprende:
- Obtener una imagen que comprende al menos un código visual a decodificar;
- Localizar en la imagen obtenida al menos un código candidato;
Para cada código candidato localizado:
- Extraer el color de cada celda del código candidato;
- Decodificar la información codificada y/o el sistema de redundancia para la detección de errores en base al color extraído de cada celda.
La obtención de la imagen puede realizarse mediante un dispositivo de captura de imágenes propia del sistema para decodificar un código visual, el cual será descrito más adelante, o puede obtenerse en forma de imagen previamente capturada por otro dispositivo que el sistema recoge o recibe del mismo o de otro dispositivo que la almacena.
En algunos ejemplos, localizar en la imagen cada código candidato puede comprender:
• Aplicar un algoritmo de umbralizado dinámico de la imagen, que tenga en cuenta las posibles diferentes condiciones de iluminación en diferentes áreas de la captura;
• Aplicar un algoritmo de extracción de contornos cerrados, sobre la imagen binarizada resultante de aplicar el algoritmo de umbralización;
• Reducir los contornos cerrados extraídos, mediante una aproximación poligonal;
• Verificar cuáles de los contornos reducidos son proyectivamente equivalentes a un cuadrado, obteniéndose, para cada contorno proyectivamente equivalente a un cuadrado, un código candidato.
La aproximación poligonal puede seguir, por ejemplo, el procedimiento descrito en [ “Algorithms for the reduction of the number of points required to represent a digitized line oríts caricature", David Douglas & Thomas Peucker, The Canadian Cartographer 10(2), 112-122, (1973)].
Además, el algoritmo de umbralizado dinámico de la imagen puede utilizar un umbral adaptativo, el cual calcula el valor de un umbral diferente para cada posición de la imagen, dependiendo de la distribución de valores de gris de una pequeña región de imagen alrededor de cada píxel, tal y como se describe, por ejemplo, en [ “Local Adaptive Thresholding."Li S.Z., Jain A. (eds) Encyclopedia of Biometrics. Springer" (2009)].
En algunos ejemplos, localizar en la imagen cada código candidato puede comprender corregir la distorsión radial en la imagen introducida por el elemento de captura de la imagen. Cabe decir que la corrección de la posible distorsión radial introducida por la cámara puede no ser en principio necesaria, ya que los códigos están explícitamente diseñados para ser
pequeños y ser visualizados a larga distancia. No obstante, para su visualización cercana (por ejemplo, con un Smartphone o teléfono inteligente situado cerca del código), podría tener que realizarse en algún caso una precorrección de dicha distorsión, especialmente para objetivos de tipo gran angular.
En algunos ejemplos, extraer el color de cada celda de un código candidato puede comprender:
• Realizar una rectificación homográfica de la imagen original, usando las cuatro esquinas del contorno del código candidato, a un marco canónico cuadrado de tamaño suficiente;
• Obtener, de la imagen rectificada, una matriz de celdas con un simple vector de color (R,G,B) en cada celda;
• Obtener un solo valor de vector RGB por celda de la matriz de celdas obtenida, mediante un filtro de mediana para eliminar posible ruido del sensor;
siendo el resultado obtenido un tensor de un número determinado de valores (el número de valores depende, por ejemplo, del tamaño de la matriz de celdas), con un vector (R,G,B) con valores entre [0,0,0] y [255,255,255] para cada celda.
Por otro lado, el marco canónico cuadrado puede tener, por ejemplo, un tamaño de 100x100 píxeles.
En algunos ejemplos, extraer el color de cada celda del código candidato puede comprender realizar un alineamiento sub-píxel de cada contorno del código candidato.
De acuerdo con algunos ejemplos, obtener, de la imagen rectificada, una matriz de celdas con un simple vector de color (R,G,B) en cada celda puede comprender realizar un balance de blancos usando los propios colores claro y oscuro del fondo y del marco, respectivamente, como elementos de calibración, cuyas posiciones en la imagen rectificada son ya plenamente conocidas.
Por otro lado, el filtro de mediana puede tener una anchura suficiente como para cubrir de forma consistente el centro de cada celda en el área que le corresponde de la imagen rectificada, sin invadir el resto de las celdas contiguas de la matriz de celdas.
2
En algunos ejemplos, decodificar la información codificada y/o el sistema de redundancia para la detección de errores en base al color extraído de cada celda puede comprender:
• Determinar la orientación correcta de la matriz de celdas;
• Decodificar cada grupo de tres celdas, comprobando que que se cumplen las restricciones referentes a que cada grupo de tres celdas tiene una única celda de un color claro o de un color oscuro, entendida como una restricción monocromática, y el resto de las celdas son de colores diferentes entre sí, de la pluralidad de colores, entendida como una restricción cromática;
• Decodificar cada grupo de cuatro celdas, comprobando que se cumplen las restricciones referentes a que, en la posición de lectura del código visual, dos de las celdas de cada grupo de cuatro celdas, de las tres que forman la primera fila y la primera columna, son cada una de un color claro y/o un color oscuro, entendida como una restricción monocromática, y las dos restantes son de colores diferentes entre sí, de una pluralidad de colores que no incluye el color claro y el color oscuro, entendida como una restricción cromática;
• Si no se cumple la restricción monocromática de los grupos de tres celdas y/o de los grupos de cuatro celdas, descartar el código candidato;
• Si no se cumple la restricción cromática de los grupos de tres celdas y/o de los grupos de cuatro celdas,
o descartar el primer valor numérico (Code A);
o Obtener el segundo valor numérico (Code B) que se determina a partir de valores obtenidos de las celdas en base a su color en una escala de grises, de los grupos de tres celdas;
o Obtener el valor de redundancia del segundo valor numérico (Code B) a partir de valores obtenidos de las celdas de un color claro o un color oscuro de los grupos de cuatro celdas;
o Comprobar el valor de redundancia obtenido, con el segundo valor numérico (Code B) obtenido, para detectar errores en la lectura;
o Si la comprobación no es correcta, descartar el segundo valor numérico (Code B) obtenido;
o Si la comprobación es correcta, proporcionar el segundo valor numérico (Code B) obtenido;
• Si se cumplen las restricciones monocromática y cromática de los grupos de tres celdas y/o de los grupos de cuatro celdas,
o Obtener el primer valor numérico (Code A) que se determina a partir de valores obtenidos de las celdas de un color claro o de un color oscuro y de las celdas de colores dentro de la pluralidad de colores, de los grupos de tres celdas;
o Obtener el valor de redundancia del primer valor numérico (Code A) a partir de valores obtenidos de las celdas de un color claro o de un color oscuro y de las celdas de colores dentro de la pluralidad de colores, de los grupos de cuatro celdas;
o Comprobar el valor de redundancia obtenido, con el primer valor numérico (Code A) obtenido, para detectar errores en la lectura;
o Si la comprobación no es correcta, descartar el primer valor numérico (Code A) obtenido;
o Si la comprobación es correcta, proporcionar el primer valor numérico (Code A) obtenido;
o Obtener el segundo valor numérico (Code B) que se determina a partir de valores obtenidos de las celdas en base a su color en una escala de grises, de los grupos de tres celdas;
o Obtener el valor de redundancia del segundo valor numérico (Code B) a partir de valores obtenidos de las celdas de un color claro o un color oscuro de los grupos de cuatro celdas;
o Comprobar el valor de redundancia obtenido, con el segundo valor numérico (Code B) obtenido, para detectar errores en la lectura;
o Si la comprobación no es correcta, descartar el segundo valor numérico (Code B) obtenido;
o Si la comprobación es correcta, proporcionar el segundo valor numérico (Code B) obtenido.
De acuerdo con algunos ejemplos, decodificar la información codificada y/o el sistema de redundancia para la detección de errores en base al color extraído de cada celda puede comprender, si se descarta el primer valor numérico (Code A) y el segundo valor numérico (Code B):
• Obtener el tercer valor numérico (Code C) a partir de valores obtenidos de todas las celdas de un color claro o de un color oscuro de la matriz de celdas;
• Proporcionar el tercer valor numérico (Code C) obtenido.
2
Por lo tanto, sólo en el caso de que la lectura de ambos Codes A y B fallase, se podría devolver un simple valor de Code C (tercer valor numérico), a modo de hash, con un rango bastante más reducido que los Codes A y B, que ya no dispone de ningún sistema de redundancia para la detección de errores, y que es utilizado como último recurso en condiciones de iluminación extremas, trabajando únicamente sobre una versión binaria (0/1) de la imagen de entrada.
Según otro aspecto, se proporciona un producto de programa informático. El producto de programa informático comprende instrucciones de programa para provocar que un sistema realice un procedimiento para decodificar un código visual, tal como el descrito anteriormente. El programa informático puede estar almacenado en unos medios de almacenamiento físico, tales como unos medios de grabación, una memoria de ordenador, o una memoria de sólo lectura, o puede ser portado por una onda portadora, tal como eléctrica u óptica.
De acuerdo con otro aspecto, se proporciona un sistema para decodificar un código visual, tal como el descrito anteriormente. El código visual ha sido codificado por un sistema para generar un código visual también descrito. El sistema de decodificación comprende:
- Medios para obtener una imagen que comprende al menos un código visual a decodificar;
- Medios para localizar en la imagen obtenida cada código candidato;
- Medios para extraer el color de cada celda del código candidato;
- Medios para decodificar la información codificada y/o el sistema de redundancia para la detección de errores en base al color extraído de cada celda.
De acuerdo con aún otro aspecto, se proporciona un sistema para decodificar un código visual, tal como el descrito anteriormente. El código visual ha sido codificado por un sistema para generar un código visual también descrito. El sistema de decodificación está configurado para:
- Obtener una imagen que comprende al menos un código visual a decodificar;
- Localizar en la imagen obtenida cada código candidato;
Para cada código candidato localizado:
- Extraer el color de cada celda del código candidato;
- Decodificar la información codificada y/o el sistema de redundancia para la detección de errores en base al color extraído de cada celda.
Según otro aspecto, se proporciona un sistema para decodificar un código visual, tal como el descrito anteriormente. El código visual ha sido codificado por un sistema para generar un
2
código visual también previamente descrito. El sistema comprende una memoria y un procesador. La memoria almacena instrucciones de programa informático ejecutables por el procesador. Estas instrucciones comprenden funcionalidades para ejecutar un procedimiento para decodificar un código visual, tal como se ha descrito con anterioridad.
Otros objetos, ventajas y características de realizaciones de la invención se pondrán de manifiesto para el experto en la materia a partir de la descripción, o se pueden aprender con la práctica de la invención.
BREVE DESCRIPCIÓN DE LOS DIBUJOS
A continuación, se describirán realizaciones particulares de la presente invención a título de ejemplo no limitativo, con referencia a los dibujos adjuntos, en los cuales:
La Figura 1 muestra esquemáticamente un ejemplo de código visual, usando un tamaño concreto de matriz de 4x4 celdas y cinco colores diferentes (blanco (B), negro (N), cian (C), magenta (M) y amarillo (A)), y un ancho del marco negro igual al de una celda.
La Figura 2 muestra esquemáticamente un ejemplo de código visual equivalente al de la Figura 1, pero con un borde más pequeño, en particular, de ancho igual a la mitad del ancho de una celda.
La Figura 3 muestra esquemáticamente un ejemplo de código visual para una matriz de 4x4, identificando las cuatro ternas ta, tb, tc y td, así como la cuaterna c.
La Figura 4 muestra esquemáticamente el código visual del ejemplo de la Figura 1, resaltando las diferentes ternas y la cuaterna.
La Figura 5 muestra esquemáticamente un ejemplo de código visual para una matriz de 5x5, identificando las siete ternas ta, tb, tc, td, te, tf y tg, así como la cuaterna c.
La Figura 6 muestra un diagrama de flujos de un procedimiento para decodificar un código visual, más concretamente para la lectura de los códigos numéricos asociados al código visual, en tres bloques principales: localización de códigos candidatos, generación de tensor y decodificación por niveles.
La Figura 7 muestra esquemáticamente un escenario de aplicación, en el que una o más cámaras, conectadas a una intranet, envían las imágenes captadas en una determinada zona de una planta a un sistema informático central, donde son procesadas. Circulando por la planta hay, por ejemplo, carretillas móviles portando algún tipo de producto sobre el cual se ha adherido una etiqueta con uno de los códigos visuales.
EXPOSICIÓN DETALLADA DE MODOS DE REALIZACIÓN
Uno de los objetivos de la presente invención es el diseño de un código visual multicolor junto con los correspondientes procedimientos automatizados de codificación y decodificación del mismo a partir de imágenes tomadas con un dispositivo de captura adecuado. El código en sí consiste en una matriz cuadrada de colores (aunque puede tomar otras formas tal como rectangular o hexagonal) rodeada por un contorno o marco oscuro, tal como negro. Su diseño pretende explícitamente que el código sea decodificado de forma robusta en condiciones de captura potencialmente problemáticas, tales como las degradaciones cromáticas y pérdidas de resolución crecientes que se producen al alejar del dispositivo de captura (que comprende, por ejemplo, un sensor óptico) el código a identificar, y/o variar significativamente las condiciones lumínicas.
Para conseguir este objetivo, el código obtiene un compromiso entre la capacidad de codificación de información y la robustez a ser detectado a potenciales largas distancias. Este compromiso se obtiene representando tres valores numéricos diferentes, que de aquí en adelante serán denominados como Code A (primer valor numérico), Code B (segundo valor numérico) y Code C (tercer valor numérico), cada uno de los cuales es reconocido usando procedimientos de interpretación diferentes sobre el código. Así, Code A ofrece una mayor expresividad (mayor número de combinaciones posibles) que Code B y, a su vez, Code B ofrece un valor más informativo que Code C. En contrapartida, la robustez en la determinación de cada código es inversamente proporcional a la capacidad, con Code B y Code C soportando incrementalmente mejor cierto tipo de degradaciones de color y otros tipos de ruido de imagen.
Entrando en detalle en el diseño de un código visual de acuerdo con la invención, la Figura 1 muestra el aspecto general de un código 101 de ejemplo, usando un tamaño concreto de 4x4 celdas 103 de cinco colores diferentes (blanco (B), negro (N), cian (C), magenta (M) y amarillo
2
(A)), y un ancho del marco 102 negro de anchura igual a la de una celda, todo ello sobre un fondo blanco. Se trata sólo de una realización concreta de la invención, siendo también posibles otras variantes, con diferente número y disposición de celdas, así como ancho de borde mayor o menor. Lo mismo sucede a nivel de los colores. Puede ser cualquier combinación, pero puede se adecuado elegir tres colores que estén lo más separados posible en el cubo RGB, como es, por ejemplo, la combinación citada (cian, magenta y amarillo) o la combinación rojo, verde y azul. También puede variar el color del marco, que puede ser cualquier color oscuro pero con el color negro se consigue maximizar el contraste con el fondo blanco, lo que facilita la detección del marcador. El fondo puede ser de un color mucho más claro que el del rectángulo marco, para nuevamente maximizar el contraste con el marco.
Tanto la Figura 1 como el resto de las figuras tienen como propósito la ilustración de diferentes ejemplos de códigos visuales y de procedimientos de codificación y decodificación de estos códigos, y en ningún caso deben entenderse como límites del alcance de aplicación de los mismos. Así, por ejemplo, la Figura 2 muestra un código equivalente, pero con un borde más pequeño (de ancho igual a la mitad del ancho de una celda), mientras que la Figura 5 muestra un código visual con una matriz de 5x5 celdas para aumentar la capacidad de codificación, si bien a costa de una posible pérdida de alcance de visualización. Igualmente, los colores del código visual no están limitados a los expuestos blanco (B), negro (N), cian (C), magenta (M) y amarillo (A). En particular, otras ternas cromáticas bien diferenciadas podrían sustituir a los colores C, M y A (por ejemplo, por los colores rojo, verde y azul) en la medida en que el test de pertenencia a cada uno de dichos colores pueda ser determinado con el procedimiento libre de umbrales y celdas de calibración que se describirá más adelante en el apartado correspondiente.
Así pues, de aquí en adelante se utiliza un ejemplo de código visual de 4x4 celdas y colores B, N, C, M y A de la Figura 1, sin que ello suponga ninguna pérdida de generalidad en la descripción, ni de limitación en las reivindicaciones de la invención.
Este código visual se halla estructurado por bloques o grupos de cuatro y/o tres celdas según se muestra en la Figura 3. Sólo un bloque 301, situado en la esquina superior izquierda de la matriz, está formado por una cuaterna de celdas c1,c2,c3,c4, es decir, un grupo de cuatro celdas, mientras que el resto de celdas están agrupadas en cuatro grupos 302,303,304,305, de tres celdas cada una, correspondientes a las ternas (ta1,ta2,ta3), (tb1,tb2,tb3), (tc1,tc2,tc3) y (td1,td2,td3), respectivamente. Tanto las ternas como la cuaterna tienen una serie de
2
restricciones en los colores a ocupar por cada celda. En particular, una terna puede tener una y solo una celda de color distinto de C, M o A (es decir, tiene siempre una celda B o una celda N), mientras que las otras dos celdas deben forzosamente ser de dos colores diferentes escogidos del conjunto {C,M,A}. En cuanto a la cuaterna, la reglas son ligeramente diferentes: dos de las tres celdas {c1,c2,c3} (las que se encuentran en contacto con el marco) deben ser de color B y/o N, mientras que las dos restantes, es decir, c4 y la única celda del conjunto {c1,c2,c3} que no sea de color B ni N, son de nuevo forzosamente de dos colores diferentes, escogidos del conjunto {C,M,A}. Como puede observarse, el código de ejemplo mostrado en la Figura 1 cumple perfectamente con las reglas de construcción especificadas.
Teniendo en cuenta las restricciones anteriores, y por construcción, dada una terna cualquiera, una y solo una de sus celdas puede tener un color N o un color B. Dicho color define un primer bit (al que llamaremos "bit monocromático", o bm) de dicha terna. Puede seguirse el convenio de tomar dicho bit como 0 para el color N, y como 1 para el color B, aunque podría ser al revés. Dicha celda B o N, por tanto, está necesariamente en una y sólo una de las tres posiciones de la terna, lo que dará lugar a un segundo ítem de información, que en este caso puede tomar tres valores diferentes, y al que se le puede denominar "trit monocromático", o tm, de la terna. En el presente ejemplo, se asocia un trit igual a 0 si el color B/N está en la primera celda de la terna, 1 si se halla en la segunda, o 2 si se encuentra en la tercera, aunque esta asociación podría ser diferente. Esto hace un total de 2x3=6 posibilidades diferentes para cada terna, a saber (bm,tm) = {(0,0), (1,0), (0,1), (1,1), (0,2), (1,2)}. Dado que en el presente ejemplo hay un total de cuatro ternas, es decir, ta, tb, tc y td, esto hace un total de 6A4=1296 posibilidades diferentes que, lo que es más importante, pueden ser decodificadas incluso en condiciones de pérdida absoluta de la información de color, simplemente exigiendo, eso sí, que la celda B o N pueda ser correctamente localizada en cada terna. Pero, por el procedimiento de construcción general descrito para el código, esto siempre es posible, ya que las otras dos celdas tienen necesariamente un color C, M o A, y dichos colores siempre muestran una diferencia de valor de gris medio mayor que la que muestra el elemento B o N con su correspondiente color B o N calibrado, obtenidos estos últimos directamente del exterior y el interior del marco negro sobre fondo blanco de la imagen de entrada. Las 1296 posibilidades descritas son las que forman el correspondiente Code B de cada código visual.
A continuación, se describe cómo es posible utilizar el color de las dos celdas restantes de cada terna para añadir más información. De nuevo, por la regla de construcción señalada
anteriormente, estas dos celdas restantes tienen que ser de dos colores diferentes escogidos del conjunto {C,M,A}. El color descartado es utilizado para codificar un nuevo trit de información, que en este caso puede denominarse "trit cromático", o tc, de la terna. El convenio elegido es tc=0, si se descarta el color C, tc=1, si se descarta el color M, o tc=2, si se descarta el A, aunque esta asignación puede ser diferente.
Por último, el orden en el que aparecen los dos colores restantes en la terna marcan un último bit de información, que puede referenciarse como "bit cromático" de la terna, o bc. Así, si dicho par de colores aparecen, en orden de lectura por posiciones de la terna, en un orden consistente con el orden predefinido por convenio como C<M<A (aunque el orden puede ser otro), entonces puede establecerse que bc=0. En caso contrario, se establece que bc=1. De nuevo, se obtienen 2x3=6 posibilidades diferentes para unos valores concretos (bc,tc) que, aprovechando la combinatoria inducida por la existencia de las cuatro ternas ta, tb, tc y td, llevan a otras 6A4=1296 posibilidades adicionales, que además son completamente independientes de las combinaciones monocromáticas (bm,tm) anteriores.
La combinación de la información monocromática y la cromática da una combinatoria de 6A4 *6A4 = 1296*1296 = 6A8 = 1,679,616 combinaciones distintas, que conforman otros tantos Code A diferentes. En este caso, sin embargo, sí que se depende de la correcta identificación cromática de los colores C, M y A, por lo que la determinación (es decir, la decodificación) de la combinación concreta es menos robusta a posibles degradaciones cromáticas de la imagen de entrada, de forma que estas 1296 posibilidades adicionales no son usadas para la determinación del Code B, sino solo del Code A.
A continuación, se realiza la descripción del procedimiento de codificación que se sigue para la cuaterna de la esquina superior izquierda c1,c2,c3,c4. En este caso, tal y como se ha comentado anteriormente, dos y solo dos de los colores de las celdas c1,c2,c3 de la cuaterna que lindan con el marco son de color B y/o N. Esta configuración o restricción lleva a la existencia de un primer trit monocromático adicional para esta cuaterna, al que se referencia como tmc, con un valor de 0, 1 o 2 si, respectivamente, la celda de color diferente a B o N es la c1, la c2 o la c3 (aunque puede establecerse cualquier otro orden). Además, las cuatro combinaciones NN, NB, BN y BB para las otras dos celdas sirven para codificar dos bits monocromáticos adicionales para la cuaterna, que pueden referenciarse como bmc0 y bmc1, con valores respectivos (bmc1, bmc0) = {(0,0), (0,1), (1,0) y (1,1)} para dichas combinaciones (estas combinaciones pueden tener otras asignaciones a las citadas en el presente ejemplo).
1
En este caso, pues, acumulando la información de tmc, bmcl y bmc0 se dispone de un total de 3*2*2 = 12 posibilidades, que de nuevo pueden ser determinadas con robustez a degradaciones cromáticas extremas, de una forma análoga a lo que ocurre con los valores bm y tm de cada terna de celdas. Estos 12 valores pueden usarse para aumentar el número de posibles Code B diferentes, si bien, en lugar de ello, se propone usarlos como un checksum de los 1296 posibles valores codificados por las ternas, como procedimiento de detección de posibles errores. Más adelante se describirá el procedimiento de cómputo exacto del checksum propuesto.
La información que puede codificarse usando las dos celdas restantes de la cuaterna, es decir, aquellas que toman dos valores diferentes a B y/o N, se describe a continuación. Puesto que estas dos celdas deben tomar de nuevo dos colores diferentes escogidos del conjunto {C,M,A}, de una forma absolutamente análoga a lo que ocurre en cada terna, estas dos celdas definen un trit cromático adicional, que puede referenciarse como tcc, con tcc=0 si se descarta el color C, tcc=1 si se descarta el M, o tcc=2 si se descarta el A (aunque esta asignación, en algunos ejemplos, puede ser diferente). Finalmente, y de nuevo de forma análoga, un bit cromático adicional, que puede referenciarse como bcc, tiene valor bcc=0 si dicho par de colores aparecen, en orden de lectura por posiciones de la cuaterna, en un orden consistente con el orden predefinido por convenio como C<M<A, o bcc=1 si ocurre al contrario. Una vez más, se tienen 2*3 = 6 posibilidades diferentes para cada par de valores concretos 15 (bcc,tcc), que es utilizado de nuevo a modo de checksum para controlar posibles errores de decodificación de, en este caso, el Code A, ya que la decodificación de estos items de información depende de la correcta identificación de los colores C, M y A. Por lo tanto, su determinación no es tan robusta como los ítems de información monocromática descritos anteriormente para las diferentes combinaciones correspondientes a los Code B.
En consecuencia, a partir de todo lo descrito se desprende que solo identificando correctamente las posiciones de los valores B y N en las cuatro ternas 302,303,304,305 (ver Figura 3), así como en las posiciones c1, c2 y c3 de la cuaterna 301, es posible codificar hasta 1296 posibilidades diferentes, controladas por un checksum con 12 valores distintos. Estas posibilidades forman el llamado Code B, robusto a degradaciones cromáticas. Si, además, se pueden determinar correctamente los colores C, M y A restantes, entonces se dispone de, adicionalmente, otras 1296 posibilidades independientes de las anteriores, y controladas en este caso por un checksum de solo seis valores diferentes. Junto con la información completamente independiente del Code B, puede verse que esta situación lleva al total de
2
1296*1296 = 1,679,616 posibilidades diferentes mencionadas anteriormente, con un checksum correspondiente de 6*12 = 72 valores posibles. Cada una de estas posibilidades son las correspondientes a un Code A válido diferente, que, eso sí, no es robusto a degradaciones cromáticas tales que no permitan la correcta identificación de los colores C, M y A.
A continuación, se describen los pesos exactos asignados a cada uno de los bits y trits definidos sobre las ternas para asignar un número concreto entre 0 y 1,679,615 al Code A, así como un número concreto entre 0 y 1295 al Code B, correspondientes ambos a un código visual concreto que sigue las reglas de construcción establecidas. Referenciando bm_i / tm_i / bc_i / tc_i, con i = a, b, c o d para las ternas ta, tb, tc y td, respectivamente, el número de Code B, N_B correspondiente a un código visual dado responde a la fórmula:
N_B = bm_a+2*bm_b+4*bm_c+8*bm_d 16*(tm_a+3*tm_b+9*tm_c+27*tm_d) (eq.1)
De forma análoga es posible definir el número de Code A, N_A, de la siguiente manera:
N_A = 6*4*N_H N_B = 1296*N_H N_B (eq.2)
con:
N_H = bc_a+2*bc_b+4*bc_c+8*bc_d 16*(tc_a+3*tc_b+9*tc_c+27*tc_d) (eq.3)
Con estas definiciones se consigue que codes consecutivos vayan variando continuamente N_B, dando una vuelta completa a sus posibles 1296 valores diferentes antes de volver a repetirse. Esto puede tener ciertas ventajas en entornos industriales, donde interesa que la secuencia de Codes B correspondientes a códigos visuales generados secuencialmente vuelvan a repetirse lo más espaciadamente posible, de cara a lograr la máxima capacidad de desambiguación posible entre etiquetas para las que sólo N_B (pero no N_A) ha podido determinarse con fiabilidad.
Por último, los correspondientes checksums (códigos de redundancia) contenidos en la cuaterna pueden quedar definidos como sigue:
C_B = 11 -N_B%12 (eq.4)
y:
C_A = 5 - N_H%6 (eq.5)
con:
C_B = 4*tmc 2*bmc1+ bmc0 (eq.6)
y:
C_A = 2*tcc bcc (eq.7)
Para terminar la descripción del procedimiento de codificación, a continuación se plantea un ejemplo concreto que ayudará a la comprensión de todo el procedimiento propuesto.
Si se toma, por ejemplo, el valor N_A = 1,234,567. De (eq.2), se deduce que N_B = N_A % 6A4 = N_A % 1296 = 775, mientras que N_H = N_A / 6A4 = N_A / 1296 = 952 (usando en todo momento la división entera). Según (eq.1), entonces, los bits monocromáticos de las cuatro ternas, (bm_a,bm_b,bm_c,bm_d), deben codificar el número N_B % 16 = 775 % 16 = 7. Dado que bm_a es el bit de menos peso, y bm_d el de más, se deduce que (bm_a,bm_b,bm_c,bm_d) = (1,1,1,0). Respecto a los trits monocromáticos (tm_a,tm_b,tm_c,tm_d), y de nuevo según (eq.2), deben codificar el número N_B / 16 = 775 / 16 = 48. Pero el número 48 expresado en base 3 es exactamente (1210)3, ya que 48 = 1*27+2*9+1*3+0*1, y por ello, siguiendo el convenio de que el trit tm_a es el de menor peso, y tm_d el de mayor, se concluye que:
(tm_a,tm_b,tm_c,tm_d) = (0,1,2,1).
Terminado el procedimiento con los bits y trits monocromáticos, se continúa ahora con los cromáticos. El procedimiento es completamente análogo al anterior usado para N_B, solo que con el valor N_H. Según (eq.3), entonces, se tiene que los bits cromáticos de las cuatro ternas, (bm_a,bm_b,bm_c,bm_d), deben codificar el número N_H % 16 = 952 % 16 = 8. Dado que bc_a es el bit de menos peso, y bc_d el de más, se deduce que (bc_a,bc_b,bc_c,bc_d) = (0,0,0,1). Respecto a los trits cromáticos (tc_a,tc_b,tc_c,tc_d), y otra vez según (eq.3), deben
4
codificar el número N_H / 16 = 952 / 16 = 59. El número 59 expresado en base 3 es (2102)3, ya que 59 = 102*27+0*9+1*3+2*1, y por ello, siguiendo el convenio de que el trit tc_a es el de menor peso, y tc_d el de mayor, se concluye que (tc_a,tc_b,tc_c,tc_d) = (2,1,0,2).
Se calculan finalmente los bits y los trits monocromáticos y cromáticos correspondientes al checksum. Por (eq.4) se deduce que C_B = 11 - N_B%12 = 11 - 15775%12 = 4, de donde, por (eq.6), (tmc,bmc1,bmc0) = (1,0,0). Análogamente, de (eq.5) se tiene que C_A = 5 -N_H%6 = 5 - 952%6 = 1, de donde, por (eq.7), (tcc,bcc) = (0,1).
En resumen, se ha deducido que, para el Code A 1,234,567, el correspondiente Code B es 775, y los correspondientes bits y trits monocromáticos y cromáticos son:
(bm_a,bm_b,bm_c,bm_d) = (1,1,1,0)
(tm_a,tm_b,tm_c,tm_d) = (0,1,2,1)
(bc_a,bc_b,bc_c,bc_d) = (0,0,0,1)
(tc_a,tc_b,tc_c,tc_d) = (2,1,0,2)
(tmc,bmc1,bmc0) = (1,0,0)
(tcc,bcc) = (0,1)
Pasando estos bits y trits a colores, según los esquemas definidos previamente, se puede comprobar que el código de color resultante es exactamente el definido en la Figura 1. Así, se puede comprobar en dicha figura (y recordando la distribución de tuplas mostrada en la Figura 3) que los colores B/N de las ternas (ta,tb,tc,td) son de colores (B,B,B,N), como corresponde a (bm_a,bm_b,bm_c,bm_d) = (1,1,1,0). Igualmente se puede comprobar que las posiciones de dichos colores B y N están en las celdas (ta1,tb2,tc3,td2), que corresponde a (tm_a,tm_b,tm_c,tm_d) = (0,1,2,1). Las parejas de colores escogidas del conjunto {C,M,A} en las ternas (ta,tb,tc,td) son, en orden de lectoescritura, (CM,CA,MA,MC). Dado que (C<M, C<A, M<A, M>C), eso se corresponde exactamente con (bc_a,bc_b,bc_c,bc_d) = (0,0,0,1). Además, los colores del conjunto {C,M,A} faltantes en las ternas (ta,tb,tc,td) son, respectivamente, (A,M,C,A), como corresponde a los valores (tc_a,tc_b,tc_c,tc_d) = (2,1,0,2). En cuanto a la cuaterna de la esquina superior izquierda, las dos celdas de colores B y/o N de la misma son ambas de color N, que están en las posiciones c1 y c3, de modo que tmc=1 (por quedar libre c2, del conjunto {c1,c2,c3}), y (bmc1,bmc0) = (0,0), por tratarse de una pareja de celdas ambas de color N. Finalmente, los colores de las dos celdas restantes, c2 y c4, son
respectivamente A y M. El color faltante en dicha pareja es C, como corresponde al trit tcc=0, y ocurre que A>M, como corresponde a bcc=1.
Una ventaja del esquema de codificación descrito es que es completamente invariante a rotaciones, por construcción. Ello significa que aunque el código aparezca rotado en la imagen capturada, en cualquiera de los cuatro posibles ángulos de rotación de un cuadrado (0, 90, 180 o 270 grados), el procedimiento de decodificación puede determinar sin problema correctamente cuál de las esquinas es la correspondiente a la superior izquierda, es decir, a la cuaterna de celdas (c1,c2,c3,c4). Y ello es debido a que de las cuatro ternas de celdas correspondientes a las cuatro esquinas, sólo la terna (c1,c2,c3) (ver Figura 3) contiene forzosamente dos colores B y/o N, frente a las otras tres esquinas, en la que un y solo un color de las celdas de la terna correspondiente puede tener un color B o N. Esta propiedad es importante para poder decodificar los códigos visuales en cualquier posición relativa de éstos respecto a la cámara, independientemente de la posición de giro concreto respecto a la misma con el que se estén visualizando en cada momento.
En el ejemplo descrito se ha elegido un código de redundancia cíclica (CRC) concreto, de tipo checksum modular simple, para realizar un control relativamente sencillo de errores. No obstante, en algunos ejemplos podrían incluirse otro tipo de soluciones alternativas igualmente capaces de detectar (por ejemplo, con dígitos de paridad, funciones de hash, etc.) o incluso corregir (Reed Solomon codes, Turbo codes, etc.) los posibles errores en el proceso de decodificación, dedicando más bits/trits a dicho control de errores, a costa de disminuir la cantidad de códigos válidos. Igualmente, si se quisiera aumentar el número de combinaciones válidas, a costa de reducir la capacidad de detectar y/o corregir errores, podría también decidirse dedicar menos bits/trits al control de errores. Por ejemplo, si se dedicase íntegramente la cuaterna (c1,c2,c3,c4) de la Figura 3 también a contener datos, en lugar de como checksum, el número de Codes A y Codes B válidos pasarían a ser, respectivamente, 2*6**10 = 120,932,352 y 2*6**5 = 15,552. Sin embargo, en ese caso no se tendría la protección ofrecida por el checksum frente a posibles errores en el proceso de decodificación.
Una vez impresa una etiqueta con un código determinado sobre papel, adhesivo, plástico, tejido, u otro tipo de soporte que pueda ser adherido por algún medio a cualquier tipo de activo (productos, materiales, personas, etc.) sobre el que interese realizar un seguimiento o trazabilidad, es necesario describir el procedimiento para localizar y decodificar correctamente el código a partir de una imagen en la que el mismo aparezca visible. Un posible escenario de
aplicación sería el mostrado en la Figura 7, que se describirá en detalle más adelante, donde una serie de una o más cámaras 701, conectadas a una intranet 705, envían las imágenes captadas en una determinada zona de una planta a un sistema informático central 706 o servidor, donde son procesadas. Circulando por la planta podría haber, por ejemplo, carretillas móviles 702 portando algún tipo de producto 703 sobre el cual se ha adherido una etiqueta con uno de los códigos 704. Es posible que en una misma imagen aparezcan varios códigos, así como que, simultáneamente, varias cámaras capturen un mismo código o conjunto de códigos en cada instante determinado. Un programa informático de procesamiento de imágenes instalado en el servidor debe procesar cada imagen de entrada para detectar y decodificar correctamente todos y cada uno de los códigos visibles en cada imagen procesada. A continuación, se describen las etapas involucradas en dicho procesamiento, cuyo esquema global se muestra en la Figura 6.
El algoritmo de procesamiento comienza con la localización 601 exacta en la escena (imagen capturada) de cada código candidato. Para ello, se procede primero con un algoritmo de umbralizado dinámico de la imagen, que tenga en cuenta las posibles diferentes condiciones de iluminación en diferentes áreas de la imagen de entrada. Se utiliza en el ejemplo un umbral adaptativo, que calcula el valor de un umbral diferente para cada posición de la imagen, dependiendo de la distribución de valores de gris de una pequeña región de imagen alrededor de cada píxel, tal y como se describe, por ejemplo, en [ “Local Adaptive Thresholding."Li S.Z., Jain A. (eds) Encyclopedia of Biometrics. Springer" (2009)]. A continuación, se procede con un algoritmo de extracción de contornos cerrados sobre la imagen binarizada resultante, que son posteriormente reducidos mediante una aproximación poligonal (por ejemplo, siguiendo el procedimiento descrito en [ “Algorithms for the reduction of the number of points required to represent a digitized line orits caricature", David Douglas & Thomas Peucker, The Canadian Cartographer 10(2), 112-122, (1973)]). Sólo aquellos contornos que pasen un test de ser proyectivamente equivalentes a un cuadrado pasan a la siguiente etapa de procesamiento. Es importante destacar que la corrección de una posible distorsión radial introducida por la cámara no se considera en principio necesaria, ya que los códigos están explícitamente diseñados para ser pequeños y ser visualizados a larga distancia. No obstante, para su visualización cercana (por ejemplo, con un teléfono inteligente o smartphone situado cerca del código), podría tener que realizarse en algún caso una pre-corrección de dicha distorsión, especialmente para objetivos de tipo gran angular.
7
En una segunda etapa 602 de procesamiento, y tras un opcional alineamiento sub-píxel de cada contorno o marco extraído, se usan sus cuatro esquinas para realizar una rectificación homográfica de la imagen original a un marco canónico cuadrado de tamaño suficiente, por ejemplo (de nuevo sin pérdida de generalidad) de 100x100 píxeles. A continuación, esta imagen rectificada es tratada con varios algoritmos con la intención de obtener una matriz de 4x4 celdas con un simple vector de color (R,G,B) en cada celda, lo más fiel posible a los colores originales. Para ello, se realiza (opcionalmente) un balance de blancos usando los propios colores blanco y negro de los bordes (cuyas posiciones en la imagen rectificada son ya plenamente conocidas) como elementos de calibración. A continuación, y mediante un filtro de mediana para eliminar posible ruido del sensor de la cámara, se obtiene un solo valor de vector RGB por celda. Dicho filtro tiene una anchura suficiente como para cubrir de forma consistente el centro de cada celda en el área que le corresponde de la imagen rectificada, sin invadir el resto de las celdas contiguas. El resultado final de esta etapa es un tensor de (4x4x3) valores, con un vector (R,G,B) con valores entre [0,0,0] y [255,255,255] para cada celda.
La tercera y última etapa 603 de procesamiento comienza con la determinación de la orientación correcta de la matriz de 4x4 colores, que resulta sencilla dada la restricción ya mencionada anteriormente de que sólo las tres celdas de la cuaterna superior izquierda pegadas al borde (c1, c2 y c3 en Figura 3) pueden contener exactamente dos colores B y/o N. Pueden eliminarse, pues, las otras tres de las cuatro posibles orientaciones. Una vez que la matriz de colores está correctamente orientada, se procede a decodificar terna a terna, comprobando para cada una que se cumplen todas las restricciones impuestas por el diseño del código: esto es, que cada terna (ta1,ta2,ta3), (tb1,tb2,tb3), (tc1,tc2,tc3) y (td1,td2,td3) (ver Figura 3) contiene exactamente sólo uno de los colores B ó N, y dos colores diferentes del conjunto {C,M,A} en las otras dos celdas. De no ser así en alguna de las ternas, se considera un error de consistencia, que puede ser debido a la restricción monocromática (una celda B ó N en cada terna), o a la restricción cromática (dos colores diferentes del conjunto {C,M,A}). De producirse el primero, se descarta automáticamente el contorno, sin devolver ninguno de los valores Code A o Code B. De producirse el segundo, se descarta producir un Code A, pero se continúa intentando producir un Code B . El siguiente paso, de no haber sido ya descartado el contorno o marco, es computar los Codes A y B (o sólo el B, en su caso), usando las ecuaciones (eq.1), (eq.2) y (eq.3), una vez determinados los correspondientes bits y trits por terna, según el esquema de codificación descrito anteriormente. Por lo tanto, ya solo queda generar los valores de checksum para los Codes A y B, contenido en los colores de las celdas
(c1,c2,c3,c4) de la Figura 3 según el esquema también descrito, y comprobar su corrección. De nuevo, sin embargo, podría ocurrir que hubiese un error de consistencia en la cuaterna (c1,c2,c3,c4) (es decir, que no hubiese exactamente dos celdas en ella de colores B y/o N, y las otras dos de dos colores diferentes extraídos del conjunto {C,M,A}). En ese caso, de producirse el primer error se descartaría devolver ninguno de los dos Codes A o B, mientras que de producirse solo el segundo, se descartaría sólo el Code A, pero se continuaría el procedimiento para el Code B.
En otro caso, los correspondientes valores de los checksums computados, C_A y C_B se determinarán a partir de las ecuaciones (eq.6) y (eq.7), y se comprobará su corrección para los respectivos Codes A y B chequeando si se dan las igualdades (eq.5) y (eq.4), respectivamente.
De haberse comprobado la corrección del Code A y su correspondiente checksum, el procedimiento de decodificación devuelve este Code A como detectado para el contorno actual. Si, por el contrario, el checksum de A es incorrecto, o fallase alguno de los tests de consistencia cromática para cualquiera de las ternas o la cuaterna de celdas, entonces se devuelve sólo el Code B como detectado, suponiendo, claro está, que se superaron todos los tests de consistencia monocromática para las ternas y la cuaterna de celdas, y que el correspondiente checksum para el mismo es correcto. Finalmente, y solo para el caso en que la lectura de ambos codes fallase, se podría devolver un simple valor de Code C, a modo de hash, con un rango bastante más reducido que los Codes A y B, que ya no dispone de CRC ninguno para controlar posibles errores, y que es utilizado como último recurso en condiciones de iluminación extremas, trabajando únicamente sobre una versión binaria (0/1) de la imagen de entrada.
Más adelante se describe el cómputo de este valor de hash de último recurso, cuyo uso queda restringido a posibles tareas de emparejado dentro de un pequeño subconjunto de códigos previamente conocidos.
En cualquier caso, todo el procesamiento descrito para las etapas segunda 602 y tercera 603 se repite mientras quede algún contorno cuadrado candidato detectado por la primera etapa 601.
Pueden plantearse escenarios de uso en los que se sabe con anterioridad que el código visual a reconocer no puede ser cualquiera, sino que necesariamente se halla en un subconjunto predeterminado más limitado (y previamente conocido) de códigos. Por ejemplo, podría conocerse, por las particularidades del proceso de producción, que en una planta podrían circular en un periodo determinado de tiempo sólo un conjunto reducido de, por ejemplo, 100 códigos diferentes. Si dichos códigos son previamente conocidos, el problema de su decodificación no parte, como el procedimiento anteriormente descrito, del absoluto desconocimiento, sino que se tiene una cierta información a priori que podría ser explotada para detectar dichos códigos incluso en condiciones de iluminación y/o toma de imagen extremadamente desafiantes. Es en este escenario donde puede tener utilidad la existencia del Code C de último recurso. Este code se computará solamente en caso de haber fallado previamente la detección de los Codes A y B. Se basa solamente en la localización de celdas N en la matriz de 4x4, y se determina de la manera descrita a continuación. Numerando las celdas de dicha matriz en orden de lectoescritura, con un índice i=0 para la celda de arriba a la izquierda, y de i=15 para la de abajo a la derecha, se asigna a cada una de las 4x4=16 celdas el correspondiente peso 2Ai. El Code C resultante será la suma de los pesos correspondientes a todas las celdas para las que se determinó un color N.
Naturalmente, en esta situación en la que solamente se han podido localizar las celdas de color N, pero no había ni siquiera una consistencia monocromática completa (esto es, se desconocen incluso las posibles ubicaciones de las celdas blancas), no es posible tener seguridad de haber corregido bien la posible rotación de la plantilla, llevando la cuaterna de control a la posición correcta, en la esquina superior izquierda (ver Figura 3). Es por ello que, para hacer el Code C invariante a la rotación, se calcula en realidad dicho valor para las cuatro posibles rotaciones de la plantilla, realizando las cuatro interpretaciones binarias correspondientes, y seleccionando la mayor de esas cuatro interpretaciones como Code C definitivo.
De nuevo, a continuación se muestra el cómputo de este Code C usando el código visual de ejemplo mostrado en la Figura 4. En esta figura, cuando está correctamente orientada, las posiciones de las celdas de color N en la plantilla son, usando el orden de lectoescritura, las correspondientes a las celdas i=0 (fila 1, columna 1), i=5 (fila 2, columna 1) e i=14 (fila 4, columna 3). El valor correspondiente a la suma de los pesos de las potencias de dos correspondientes será, pues, 2A0 2A5 2A14 = 16417. No obstante, es necesario repetir el procedimiento para las otras tres posibles orientaciones, dado que a priori no se conoce la
4
rotación exacta con la que aparece la plantilla en la imagen de entrada. Se puede comprobar fácilmente que, para las rotaciones de 90, 180 y 270 grados de la matriz de la Figura 4, los correspondientes valores de i son {i=7,i=12,i=13} (que produce un valor 2A7 2A12 2A13 = 12416), en el primer caso, {i=1,i=11,i=15} (que produce un valor 2A1 2A11 2A15 = 34818), en el segundo caso, y {i=2,i=3,i=8} (que produce un valor 2A2 2A3 2A8 = 268), en el tercer 20 caso. El máximo de los cuatro valores {16417, 12416, 34818, 268} es 34818, de modo que, finalmente, éste último es el valor del Code C devuelto como valor de hash de último recurso, a comparar con los hash para cada uno de los posibles códigos candidatos del conjunto de entrada.
Existen aún un par de consideraciones finales importantes respecto al cómputo del Code C. La primera es que la configuración de las posiciones de los unos podría salir inconsistente, bajo cualquiera de las cuatro rotaciones, con las reglas de construcción del código. Por ejemplo, un código que contuviese dos o más celdas de color N en dos o más esquinas sería claramente inconsistente con las reglas de construcción expuestas anteriormente. De la misma forma, es imposible también, por ejemplo, que tres de las cuatro celdas centrales de la matriz 4x4 sean de color N, por las restricciones sobre las tuplas expuestas también anteriormente. De este modo, antes de devolver un Code C como posible hash, se realiza un último chequeo de consistencia del patrón de celdas consideradas como N para su cómputo según lo expuesto. De no superar tampoco este último chequeo, el código es completamente descartado (Figura 6, bloque 603).
La segunda consideración importante es que el valor del hash obtenido para el Code C es, obviamente, no único para cada Code A original. Es decir, provoca colisiones (varios Codes A, o incluso varios Codes B, diferentes pueden dar lugar a un mismo Code C válido). Este es el motivo por el que, aunque en última instancia pueda resultar útil para reducir la ambigüedad, no siempre vale para determinar unívocamente el código detectado de entre un posible conjunto de códigos candidatos de entrada, dependiendo, por supuesto, de los valores concretos de los mismos.
Como siguiente cuestión, a continuación se describe, dentro del procedimiento de decodificación, el proceso específico de determinación del color concreto de cada celda, dentro del subconjunto total de colores empleado {B,N,C,M,A}. Un par de características importantes de la invención son que a) dicha determinación del color se realiza mediante un proceso que se encuentra libre de todo umbral, y b) que no necesita habilitar celdas que se
tengan que emplear como calibración. La primera característica consigue que el procedimiento sea más robusto, al no depender de umbrales ajustados manualmente (es, por el contrario, un procedimiento completamente auto-umbralizado). La segunda característica evita el coste que tendría en términos de pérdida de número de combinaciones posibles el tener que emplear parte de las celdas del código visual para dichas celdas de control (esquema que, por otro lado, siguen algunos de los códigos de color expuestos y descritos anteriormente, perdiéndolas así para codificar los datos). La eliminación de esta necesidad es particularmente importante para hacer los códigos lo más pequeños posible (en número de celdas), en el contexto de detección con robustez a largo alcance que se persigue en las aplicaciones industriales para las que los códigos pueden estar diseñados.
En primer lugar, se realiza la descripción para el procedimiento monocromático, destinado a localizar correctamente las posiciones de las celdas B y N tanto en las ternas como en la cuaterna de checksums. Para el caso concreto de una terna, por ejemplo, simplemente se toma aquella celda cuyo vector de color (R,G,B), en cualquier tipo de medida de distancia bien definida (por ejemplo, euclídea, o de Manhattan), esté más cercano a cualquiera de los dos vectores (R,G,B) de control extraídos a partir de los píxeles del borde interior (para el color N; borde interno a 101 en Figura 1) o exterior (para el color B; borde externo a 101 en Figura 1) de la propia imagen, en el entorno del polígono de cuatro lados inicialmente extraído, y que ejercen como únicos colores de calibración inicialmente disponibles. Es importante notar que, de esta forma, se evita tener que añadir celdas de control de color (esto es, de calibración) adicionales a la matriz del código visual, ya que los mismos bordes interno (N) y externo (B) utilizados para la propia detección del código (etapa 601 en el algoritmo de la Figura 6) pueden ejercer perfectamente dicho papel. El caso de la cuaterna, es absolutamente similar, solo que, dado que por construcción en ella debe haber dos celdas (y no solo una) de colores B y/o N, son las dos celdas con distancia menor a cualquiera de los dos colores base extraídos de los bordes las que se etiquetan con los colores B y/o N correspondientes. Obsérvese que, al estar basado en una comparación de distancias con dos colores observados a partir de la propia imagen, en lugar de en cualesquiera valores concretos de umbralizado predeterminados, el proceso es resistente a prácticamente cualquier tipo de variación de iluminación de la escena típicamente posible (excepto casos extremos de deslumbramiento u oscuridad prácticamente totales).
En cuanto a la pareja de colores diferentes escogidos del conjunto {C,M,A}, para las otras dos celdas de la correspondiente terna/cuaterna, se determina igualmente con un procedimiento
de nuevo libre de umbrales y de todo tipo de información de calibración cromática exterior. Para ello, simplemente, a las dos celdas restantes tras la determinación de la posición y tipo (B/N) de la celda de control monocromática, se les calcula el mínimo de su valor R, G o B. Si dicho mínimo se encuentra en el canal R, el color asignado a la misma es el C. Análogamente, se asigna un color M o A si dicho mínimo se alcanza en los canales G o B, respectivamente. Obsérvese que, de nuevo, al utilizar un valor mínimo en una comparación (en lugar de la comparación con un umbral concreto predeterminado), el procedimiento es de nuevo resistente a variaciones de intensidad de la luz, que afectan en principio por igual a todos los canales. También, en caso de optar por el conjunto de colores {R,G,B} en lugar de {C,M,A} (una posible variante citada con anterioridad), el procedimiento puede ser fácilmente modificado para detectar el nuevo conjunto de colores, atendiendo en este caso no ya al mínimo de los tres canales (R,G,B) de la celda, sino, por supuesto, del máximo de los mismos.
No obstante, el procedimiento podría eventualmente fracasar en situaciones de luz que se alejase mucho de la luz blanca, lo cual no suele ser un problema en entornos industriales, salvo casos muy específicos, o bien en condiciones en las que la correcta sensorización del color fuese muy problemática, como puede ser el caso en situaciones cercanas al deslumbramiento, o alternativamente el oscurizado excesivo de la etiqueta que comprende el código, como puede producirse, por ejemplo, por fuertes contraluces en la escena. Es para estos casos para los que, probablemente, se detecten las inconsistencias cromáticas aludidas en el procedimiento de decodificación (etapa de procesamiento 603 en la Figura 6), como que dos de los colores de una tupla sean iguales, en lugar de siempre diferentes, o que, más adelante, falle el checksum del correspondiente Code A. Una vez más, es en estos casos en los que el Code B, no obstante, puede ser determinado al no depender en ningún caso de ningún color que no sea el B o el N puros.
Cabe también comentar que, una vez determinadas aquellas celdas cuya diferencia entre el canal menor de los tres (R,G,B) y los otros dos sea mayor, dicha celda puede tomarse como color canónico C, M o A para todo el código, y ejercer, además de como ítem de información, también como ítem de calibración, es decir, como referencia para las demás celdas. Ello equivale, en cierta forma, a localizar los píxeles "más cyan" (es decir, con mayor diferencia entre el R y el min(G,B)), "más magenta" (con mayor diferencia entre el G y el min(R,B)) y "más amarillo" (con mayor diferencia entre el B y el min(R,G)) de toda la matriz, y tomarlos como canónicos, es decir, como celdas de calibración, para comparar el resto de colores de las celdas con ellos, mediante una medida distancia convencional. De esta forma, y aún
4
manteniendo el esquema global libre de umbrales y de la necesidad de celdas utilizadas sólo para calibrar, se pueden solventar aún algunos casos adicionales en los que ciertas áreas del código visual hayan podido sufrir degradaciones cromáticas superiores a otras.
En la Figura 7 se presenta un ejemplo de implementación de todo el esquema de generación, detección y decodificación de códigos propuesto, en concreto sobre la planta principal de una empresa dedicada a la producción y envasado de productos frescos de origen hortofrutícola. El escenario específico de aplicación es la correcta localización y seguimiento en el tiempo y en el espacio de palets cargados con productos, que son descargados en los muelles de la empresa, y monitorizados desde el mismo momento de su entrada en la planta de envasado. Para ello, las cajas con los productos son etiquetadas ya en el momento de su recolección en el campo, con códigos visuales como los descritos, en un lugar bien visible en las mismas.
Este ejemplo de implementación emplea las dos variantes concretas del código descrito en este documento: en primer lugar, la versión de colores {B,N,C,M,A} en una matriz de celdas de 4x4, con etiquetas impresas a color (ejemplo de la Figura 1); y en segundo lugar, una versión del código de matriz de celdas de 5x5 (mostrado en la Figura 5), sólo que, en este caso particular, se emplea en lugar de un código de cinco colores, una versión monocromática con sólo tres colores, {B,Gr,N}, siendo Gr un nivel de gris intermedio situado entre los valores B y N. En esta última implementación particular, pues, se descarta de partida el código de color (sustituyendo todos los valores C, M y A por Gr en los códigos visuales generados), con lo que el procedimiento descrito siempre fracasa, por construcción, en la determinación del Code A (cromático), si bien es perfectamente viable la decodificación del Code B (monocromático). Ocurre que, dada la mayor cantidad de ternas de esta variante (siete ternas ta, tb, tc, td, te, tf, tg en la Figura 5), el Code B, siendo extremadamente robusto a las más variadas condiciones de luz, y funcionando incluso en toma de imágenes en blanco y negro, permite aún 6A7 = 279,936 posibilidades diferentes, controladas por su correspondiente checksum de la cuaterna de la esquina superior izquierda, que sigue tomando un valor en el rango [0..11].
El sistema de sensorización planteado para este ejemplo cuenta con un número variable de cámaras, interconectadas a la red principal de la empresa mediante tecnología Gigabit Ethernet. En esta implementación particular se usan cámaras con resoluciones de hasta 3840x2160 píxeles y 60 frames por segundo, y ópticas de zoom variable que permiten ángulos de visión de entre 37° y 109° en horizontal.
Desde su entrada en el almacén, las cajas 703 con los productos procedentes de los muelles de carga, ya debidamente etiquetadas 704 son transportadas por carretillas paletizadoras 702 por el interior de la planta de envasado. Las cámaras 701, montadas en ciertos puntos clave de la planta, monitorizan de forma continua la evolución de las carretillas, enviando las imágenes capturadas de forma continua a un servidor central 706, a través de una Intranet dedicada 705, cuyo ancho de banda (1 Gbps) permite, en combinación con un adecuado factor de compresión de imagen, el envío simultáneo de varias secuencias de vídeo a decenas de frames por segundo desde múltiples cámaras. Las cámaras usadas en el presente ejemplo están dotadas de una CPU y memoria propias, para realizar la compresión del vídeo en tiempo real, empleando la tecnología Zipstream. Esta tecnología utiliza un codec H.262 con bit-rate variable, que permite una velocidad en fps y ancho de banda controlables desde el servidor central.
En este punto es importante destacar que la comunicación entre las cámaras y el servidor central puede realizarse de manera alámbrica (con cables) o inalámbricamente. En el caso de una comunicación cableada (alámbrica), la conexión puede realizarse mediante puertos serie, tales como USB, micro USB, mini USB, Firewire o Ethernet (tal como la Intranet descrita anteriormente). En el caso de comunicaciones inalámbricas, la conexión puede realizarse mediante módulos de comunicaciones inalámbricas de corto alcance (las cámaras y el servidor están lo suficientemente cerca), por ejemplo, Bluetooth, NFC, Wifi, IEEE 802.11 o Zigbee. Si las comunicaciones son de largo alcance (las cámaras y el servidor están alejados), la conexión puede realizarse mediante módulos de comunicaciones basados en tecnología GSM, GPRS, 3G, 4G, 5G o tecnología por satélite (por ejemplo, si la comunicación se realiza a través de una red global de comunicación, tal como Internet) o incluso a través de una red de comunicaciones para Internet de las cosas (loT - Internet of Things). Para securizar la comunicación entre las cámaras y el servidor, esta comunicación puede asegurarse mediante, por ejemplo, nombre de usuario/contraseña, claves criptográficas y/o mediante un túnel SSL establecido en la comunicación.
Cada vez que una imagen nueva llega al servidor 706, éste la procesa mediante una implementación del algoritmo descrito en la Figura 6, localizando y decodificando, en su caso, todas las etiquetas visuales detectadas en la escena. La implementación del mismo se ha realizado en el lenguaje Python, en su versión 3.6, haciendo uso de las librerías OpenCV (versión 3.4) y Numpy (versión 1.14) para todas las funciones relativas al proceso de imagen:
4
umbralizado, extracción y poligonización de contornos, alineamiento y rectificación homográfica, balance de blancos, filtros de supresión de ruido y el proceso de decodificación final del código de color. La interacción con el resto de las aplicaciones y bases de datos relevantes para el sistema de control de producción y trazabilidad de la empresa se hace a través de un API REST específicamente diseñado para ello, que se apoya en la librería Flask (versión 0.12). Dicho código Python es ejecutado, en esta implementación particular, en un servidor con una CPU i7 de 8 núcleos y 16 GB de RAM. El rendimiento obtenido depende de la resolución de las imágenes de entrada, siendo del orden de (tomando un ejemplo concreto) unos 20 milisegundos por frame para una resolución de entrada de 1920x1080, pudiéndose detectar varios códigos (por ejemplo, hasta 6) por imagen (sin que tampoco haya un límite estricto en este sentido).
La distancia de visualización y correcta decodificación depende a su vez tanto de la distancia focal de la cámara (y por tanto, de su campo de visión) como de la resolución de imagen empleada, pero en este entorno concreto es posible afirmar que el límite observado de robustez en reconocimiento del Code A es de, aproximadamente, un mínimo de 3x3 píxeles por cada celda en la imagen de entrada. Ello se corresponde a, aproximadamente, tamaños de ~18x18 píxeles para un código completo del tipo 4x4, incluyendo un ancho de borde igual al de una celda, como en la versión de ejemplo de la Figura 1, o con algunos píxeles menos para tamaños de marco inferiores, como los mostrados en el ejemplo de la Figura 2.
Jugando adecuadamente con ópticas de zoom variable, y dependiendo por supuesto del tamaño físico de impresión de la etiqueta, ello equivale a posibles distancias de decodificación de incluso decenas de metros. La tabla siguiente muestra algunos escenarios concretos de ejemplo:
Todas las anteriores posibilidades responden en realidad a la siguiente fórmula general:
4
PIX = TC*RH/(2000*D*tan(AVH/2)) (eq.8)
donde:
PIX = Tamaño resultante del código visual en la imagen (en píxeles).
TC = Tamaño del código visual impreso (en mm).
RH = Resolución horizontal de la imagen (en píxeles).
D = Distancia de la cámara a la etiqueta (en metros).
AVH = Ángulo de visión horizontal de la cámara (en grados).
En teoría, y con restricción a las cámaras con las ópticas mencionadas anteriormente, esto permite igualmente detectar y decodificar códigos impresos a tamaño, por ejemplo, 200 mm de ancho a distancias superiores a los 60 metros (para el ángulo de visualización correspondiente al mayor zoom admitido por la óptica de la cámara, 37°, y su mayor resolución, de 3840x2160 píxeles). Por supuesto, montando ópticas de teleobjetivo con mayores focales (y por tanto menor ángulo de visión), estas distancias de decodificación pueden aumentarse aún más. En el escenario concreto del ejemplo descrito, sin embargo, en ningún caso es necesaria una configuración de tales características, optándose por tamaños más pequeños en la implementación final, con códigos visuales impresos a 80 mm de ancho y distancias de visualización típicamente inferiores a los 10 m. En todo momento el sistema muestra una buena tolerancia a diferentes fuentes de ruido que se traducen en diferentes causas de pérdida de nitidez en la imagen, como desenfoques puntuales, movimientos rápidos en la escena, ruido de "sal y pimienta” en la imagen sensorizada motivado por las bajas condiciones de iluminación, e incluso artefactos originados por la compresión de la imagen.
Es importante destacar que tanto el procedimiento de codificación como el procedimiento de decodificación descritos con anterioridad pueden implementarse, cada uno, con un sistema con una configuración totalmente informática, totalmente electrónica o mediante una combinación de ambos.
En el caso de que un sistema sea puramente informático (por ejemplo, un servidor informático), el sistema puede comprender una memoria y un procesador (por ejemplo, un microprocesador), en el que la memoria almacena instrucciones de programa informático
ejecutables por el procesador, comprendiendo estas instrucciones funcionalidades para ejecutar un procedimiento para decodificar o un procedimiento para codificar un código visual tal como los descritos.
La memoria de este sistema informático puede estar comprendida en el procesador o puede ser externa. Si está comprendida en el propio procesador, puede tratarse, por ejemplo, de una memoria tipo EEPROM o similar. En el caso de que sea externa, puede ser, por ejemplo, unos medios de almacenamiento de datos tales como discos magnéticos (por ejemplo, discos duros), discos ópticos (por ejemplo, DVD o CD), tarjetas de memoria, memorias flash (por ejemplo, pendrives) o unidades de estado sólido (SSD basadas en RAM, basadas en flash, etc.). Estos medios de almacenamiento pueden formar parte del propio sistema informático y/o pueden estar dispuestos remotos al mismo, conectados de manera alámbrica (con cables) o inalámbricamente. En el caso de una comunicación cableada (alámbrica), la conexión puede realizarse mediante puertos serie, tales como USB, micro USB, mini USB, Firewire o Ethernet. En el caso de comunicaciones inalámbricas, la conexión puede realizarse mediante módulos de comunicaciones inalámbricas de corto alcance (el sistema y los medios de almacenamiento están lo suficientemente cerca), por ejemplo, Bluetooth, NFC, Wifi, IEEE 802.11 o Zigbee. Si las comunicaciones son de largo alcance (el sistema y los medios de almacenamiento están alejados), la conexión puede realizarse mediante módulos de comunicaciones basados en tecnología GSM, GPRS, 3G, 4G, 5G o tecnología por satélite (por ejemplo, si la comunicación se realiza a través de una red global de comunicación, tal como Internet) o incluso a través de una red de comunicaciones para Internet de las cosas (loT -In te rneto f Things). En este último caso de un sistema con los medios de almacenamiento dispuestos remotos, la comunicación establecida entre el sistema y los medios de almacenamiento puede asegurarse mediante, por ejemplo, nombre de usuario/contraseña, claves criptográficas y/o mediante un túnel SSL establecido en la comunicación entre el sistema y los medios de almacenamiento.
Por lo tanto, el conjunto de instrucciones de programa informático (un programa informático) ejecutables por el procesador puede estar almacenado en unos medios de almacenamiento físico, tales como los citados, pero también puede ser portado por una onda portadora (el medio portador puede ser cualquier entidad o dispositivo capaz de portar el programa), tal como eléctrica u óptica, que puede transmitirse vía cable eléctrico u óptico o mediante radio u otros medios. De este modo, cuando el programa informático está contenido en una señal
4
que puede transmitirse directamente mediante un cable u otro dispositivo o medio, el medio portador puede estar constituido por dicho cable u otro dispositivo o medio.
Alternativamente, el medio portador puede ser un circuito integrado en el que está encapsulado (embedded) el programa informático, estando adaptado dicho circuito integrado para realizar o para usarse en la realización de los procedimientos relevantes.
El programa informático puede estar en forma de código fuente, de código objeto o en un código intermedio entre código fuente y código objeto, tal como en forma parcialmente compilada, o en cualquier otra forma adecuada para usar en la implementación de los procedimientos descritos.
Por otro lado, al menos uno de los sistemas (el que ejecuta el procedimiento de codificación y/o el que ejecuta el procedimiento de decodificación) puede tener una configuración puramente electrónica, por lo que podría estar formado por un dispositivo electrónico programable tal como un CPLD (Complex Programmable Logic Device), un FPGA (Field Programmable Gate Array) o un ASIC (Application-Specific Integrated Circuit).
Finalmente, al menos uno de los sistemas puede presentar también una configuración híbrida entre informática y electrónica. En este caso, el sistema debe comprender una memoria y un procesador para implementar informáticamente una parte de sus funcionalidades, así como determinados circuitos electrónicos para implementar el resto de las funcionalidades.
A pesar de que se han descrito aquí sólo algunas realizaciones y ejemplos particulares de la invención, el experto en la materia comprenderá que son posibles otras realizaciones alternativas y/o usos de la invención, así como modificaciones obvias y elementos equivalentes. Además, la presente invención abarca todas las posibles combinaciones de las realizaciones concretas que se han descrito. Los signos numéricos relativos a los dibujos y colocados entre paréntesis en una reivindicación son solamente para intentar aumentar la comprensión de la reivindicación, y no deben ser interpretados como limitantes del alcance de la protección de la reivindicación. El alcance de la presente invención no debe limitarse a realizaciones concretas, sino que debe ser determinado únicamente por una lectura apropiada de las reivindicaciones adjuntas.
4
Claims (48)
1. Código visual (101) que comprende una matriz bidimensional de celdas (103) y un marco (102) de un color oscuro que rodea la matriz de celdas, caracterizado por el hecho de que la matriz de celdas comprende al menos uno de:
• uno o más grupos de cuatro celdas (301;401) en los que:
o las celdas están dispuestas en dos filas y dos columnas,
o en la posición de lectura del código visual, dos de las celdas de cada grupo de cuatro celdas, de las tres (c1,c2,c3) que forman la primera fila y la primera columna, son cada una de un color claro y/o un color oscuro, y las dos restantes son de colores diferentes entre sí, de una pluralidad de colores que no incluye el color claro y el color oscuro;
• uno o más grupos de tres celdas (302,303,304,305;402,403,404,405) en los que:
o cada grupo comprende tres celdas conectadas alineadas o en forma de L, o cada grupo de tres celdas tiene una única celda de un color claro o de un color oscuro y el resto de las celdas son de colores diferentes entre sí, de la pluralidad de colores;
en el que los grupos de celdas codifican información y/o implementan un sistema de redundancia para la detección de errores en la decodificación del código visual.
2. Código visual (101) según la reivindicación 1, que comprende un fondo de un color claro externo al marco (102) de un color oscuro.
3. Código visual (101) según una cualquiera de las reivindicaciones 1 o 2, en el que el ancho del marco (102) de un color oscuro es igual al ancho de una celda (103).
4. Código visual (101) según una cualquiera de las reivindicaciones 1 o 2, en el que el ancho del marco (102) de color oscuro es la mitad del ancho de una celda (103).
5. Código visual (101) según una cualquiera de las reivindicaciones 1 a 4, que comprende, en la posición de lectura del código visual, un grupo (301;401) de cuatro celdas (c1,c2,c3,c4) dispuesto en la esquina superior izquierda de la matriz de celdas.
6. Código visual (101) según la reivindicación 5, que comprende un grupo (302,304,305) de tres celdas conectadas en forma de L en cada una de las esquinas restantes de la matriz de celdas.
7. Código visual (101) según una cualquiera de las reivindicaciones 1 a 6, en el que la pluralidad de colores comprende al menos tres de los siguientes colores:
• cian;
• magenta;
• amarillo;
• rojo;
• verde;
• azul.
8. Código visual (101) según una cualquiera de las reivindicaciones 1 a 7, en el que la pluralidad de colores se representa en una escala de grises.
9. Código visual (101) según una cualquiera de las reivindicaciones 1 a 8, en el que un color oscuro es el color negro.
10. Código visual (101) según una cualquiera de las reivindicaciones 1 a 9, en el que un color claro es el color blanco.
11. Código visual (101) según una cualquiera de las reivindicaciones 1 a 10, en el que la matriz de celdas (103) tiene el mismo número de filas que de columnas.
12. Código visual (101) según la reivindicación 1 a 11, en el que la información codificada por los grupos de celdas comprende al menos un primer valor numérico que se determina a partir de valores obtenidos de las celdas de un color claro o de un color oscuro y de las celdas de colores dentro de la pluralidad de colores, de los grupos (302,303,304,305) de tres celdas.
13. Código visual (101) según una cualquiera de las reivindicaciones 1 a 12, en el que la información codificada por los grupos de celdas comprende al menos un segundo valor numérico que se determina a partir de valores obtenidos de las celdas en base a su color en una escala de grises, de los grupos (302,303,304,305) de tres celdas.
1
14. Código visual (101) según una cualquiera de las reivindicaciones 1 a 13, en el que la información codificada por los grupos de celdas comprende al menos un tercer valor numérico que se determina a partir de valores obtenidos de todas las celdas de un color claro o de un color oscuro de la matriz de celdas.
15. Código visual (101) según una cualquiera de las reivindicaciones 1 a 14, en el que el sistema de redundancia para la detección de errores en la decodificación del código visual se implementa a partir de valores obtenidos de las celdas de un color claro o de un color oscuro y de las celdas de colores dentro de la pluralidad de colores, de los grupos (301;401) de cuatro celdas, para detectar errores en la decodificación del primer valor numérico.
16. Código visual (101) según una cualquiera de las reivindicaciones 1 a 14, en el que el sistema de redundancia para la detección de errores en la decodificación del código visual se implementa a partir de valores obtenidos de las celdas de un color claro o un color oscuro de los grupos (301;401) de cuatro celdas, para detectar errores en la decodificación del segundo valor numérico.
17. Procedimiento para generar un código visual (101) según una cualquiera de las reivindicaciones 1 a 16, que comprende:
• obtener el número de filas y columnas de la matriz de celdas (103);
• determinar la combinación de uno o más grupos (302,303,304,305;402,403,404,405) de tres celdas y/o uno o más grupos (301;401) de cuatro celdas adecuada para el número obtenido de filas y columnas de la matriz de celdas;
• obtener la información a codificar;
• codificar la información y/o implementar el sistema de redundancia para la detección de errores en la decodificación del código visual, en base a la siguiente configuración: o para cada grupo de tres celdas de la combinación determinada:
■ asignar un color claro o un color oscuro a una de las celdas del grupo de tres celdas, definiéndose un primer parámetro que toma un valor predeterminado que depende de si el color asignado a la celda es el color claro o el color oscuro, y definiéndose un segundo parámetro que toma un valor predeterminado que depende de la celda, del grupo de tres celdas, a la que se le asigna el color claro o el color oscuro;
■ asignar dos colores de la pluralidad de colores, que no incluye el color claro y el color oscuro, a las dos celdas restantes del grupo de tres celdas,
2
definiéndose un tercer parámetro que toma un valor predeterminado que depende de al menos un color no escogido de la pluralidad de colores, y definiéndose un cuarto parámetro que toma un valor predeterminado que depende del orden de los dos colores asignados a las celdas, en base a un orden pre-establecido de los colores de la pluralidad de colores;
o para cada grupo de cuatro celdas de la combinación determinada:
■ asignar un color claro y/o un color oscuro a dos de las tres celdas que forman la primera fila y la primera columna del grupo de cuatro celdas, definiéndose un quinto parámetro que toma un valor predeterminado que depende de la celda que no tiene asignado un color claro o un color oscuro, y definiéndose un sexto parámetro que toma un valor predeterminado que depende de la combinación de color claro y/o color oscuro asignada a las dos celdas;
■ asignar dos colores de la pluralidad de colores, que no incluye el color claro y el color oscuro, a las dos celdas restantes del grupo de cuatro celdas, definiéndose un séptimo parámetro que toma un valor predeterminado que depende de al menos un color no escogido de la pluralidad de colores, y definiéndose un octavo parámetro que toma un valor predeterminado que depende del orden de los dos colores asignados a las celdas, en base a un orden pre-establecido de los colores de la pluralidad de colores.
18. Procedimiento según la reivindicación 17, en el que el primer parámetro toma un valor 0 o 1 dependiendo de si el color asignado a la celda es el color claro o el color oscuro.
19. Procedimiento según una cualquiera de las reivindicaciones 17 o 18, en el que el segundo parámetro toma un valor 0, 1 o 2 dependiendo de si la celda a la que se le asigna el color claro o el color oscuro, en posición de lectura del código, es la primera celda, la segunda celda o la tercera celda del grupo de tres celdas.
20. Procedimiento según una cualquiera de las reivindicaciones 17 a 19, en el que el tercer parámetro toma un valor 0, 1 o 2 dependiendo del color no escogido de la pluralidad de colores.
21. Procedimiento según una cualquiera de las reivindicaciones 17 a 20, en el que el cuarto parámetro toma un valor 0 o 1 dependiendo de si el orden coincide o no con el orden pre establecido de los colores de la pluralidad de colores.
22. Procedimiento según una cualquiera de las reivindicaciones 17 a 21, en el que el quinto parámetro toma un valor 0, 1 o 2 dependiendo de si la celda a la que no se le asigna el color claro o el color oscuro, en posición de lectura del código, es la primera celda, la segunda celda o la tercera celda de las tres celdas que forman la primera fila y la primera columna del grupo de cuatro celdas.
23. Procedimiento según una cualquiera de las reivindicaciones 17 a 22, en el que el sexto parámetro toma un valor {(0,0),(0,1),(1,0),(1,1)} dependiendo de la combinación de color claro y/o color oscuro asignada a las dos celdas.
24. Procedimiento según una cualquiera de las reivindicaciones 17 a 23, en el que el séptimo parámetro toma un valor 0, 1 o 2 dependiendo del color no escogido de la pluralidad de colores.
25. Procedimiento según una cualquiera de las reivindicaciones 17 a 24, en el que el octavo parámetro toma un valor 0 o 1 dependiendo de si el orden coincide o no con el orden preestablecido de los colores de la pluralidad de colores.
26. Procedimiento según una cualquiera de las reivindicaciones 17 a 25, en el que los grupos (302,303,304,305;402,403,404,405) de tres celdas codifican la información, mientras que los grupos (301;401) de cuatro celdas implementan el sistema de redundancia para la detección de errores en la decodificación del código visual.
27. Producto de programa informático que comprende instrucciones de programa para provocar que un sistema realice un procedimiento según una cualquiera de las reivindicaciones 17 a 26 para generar un código visual (101).
28. Producto de programa informático según la reivindicación 27, que está almacenado en unos medios de grabación.
29. Producto de programa informático según la reivindicación 27, que es portado por una señal portadora.
4
30. Sistema para generar un código visual (101) según una cualquiera de las reivindicaciones 1 a 16, que comprende:
• medios para obtener el número de filas y columnas de la matriz de celdas (103);
• medios para determinar la combinación de uno o más grupos (302,303,304,305;402,403,404,405) de tres celdas y/o uno o más grupos (301;401) de cuatro celdas adecuada para el número obtenido de filas y columnas de la matriz de celdas;
• medios para obtener la información a codificar;
• medios para codificar la información y/o implementar el sistema de redundancia para la detección de errores en la decodificación del código visual, en base a la siguiente configuración:
o para cada grupo de tres celdas de la combinación determinada:
■ medios para asignar un color claro o un color oscuro a una de las celdas del grupo de tres celdas, definiéndose un primer parámetro que toma un valor predeterminado que depende de si el color asignado a la celda es el color claro o el color oscuro, y definiéndose un segundo parámetro que toma un valor predeterminado que depende de la celda, del grupo de tres celdas, a la que se le asigna el color claro o el color oscuro;
■ medios para asignar dos colores de la pluralidad de colores, que no incluye el color claro y el color oscuro, a las dos celdas restantes del grupo de tres celdas, definiéndose un tercer parámetro que toma un valor predeterminado que depende de al menos un color no escogido de la pluralidad de colores, y definiéndose un cuarto parámetro que toma un valor predeterminado que depende del orden de los dos colores asignados a las celdas, en base a un orden pre-establecido de los colores de la pluralidad de colores;
o para cada grupo de cuatro celdas de la combinación determinada:
■ medios para asignar un color claro y/o un color oscuro a dos de las tres celdas que forman la primera fila y la primera columna del grupo de cuatro celdas, definiéndose un quinto parámetro que toma un valor predeterminado que depende de la celda que no tiene asignado un color claro o un color oscuro, y definiéndose un sexto parámetro que toma un valor predeterminado que depende de la combinación de color claro y/o color oscuro asignada a las dos celdas;
■ medios para asignar dos colores de la pluralidad de colores, que no incluye el color claro y el color oscuro, a las dos celdas restantes del grupo de cuatro
celdas, definiéndose un séptimo parámetro que toma un valor predeterminado que depende de al menos un color no escogido de la pluralidad de colores, y definiéndose un octavo parámetro que toma un valor predeterminado que depende del orden de los dos colores asignados a las celdas, en base a un orden preestablecido de los colores de la pluralidad de colores.
31. Sistema para generar un código visual (101) según una cualquiera de las reivindicaciones 1 a 16, estando el sistema configurado para:
• obtener el número de filas y columnas de la matriz de celdas (103);
• determinar la combinación de uno o más grupos (302,303,304,305;402,403,404,405) de tres celdas y/o uno o más grupos (301;401) de cuatro celdas adecuada para el número obtenido de filas y columnas de la matriz de celdas (103);
• obtener la información a codificar;
• codificar la información y/o implementar el sistema de redundancia para la detección de errores en la decodificación del código visual, en base a la siguiente configuración: o para cada grupo de tres celdas de la combinación determinada:
■ asignar un color claro o un color oscuro a una de las celdas del grupo de tres celdas, definiéndose un primer parámetro que toma un valor predeterminado que depende de si el color asignado a la celda es el color claro o el color oscuro, y definiéndose un segundo parámetro que toma un valor predeterminado que depende de la celda, del grupo de tres celdas, a la que se le asigna el color claro o el color oscuro;
■ asignar dos colores de la pluralidad de colores, que no incluye el color claro y el color oscuro, a las dos celdas restantes del grupo de tres celdas, definiéndose un tercer parámetro que toma un valor predeterminado que depende de al menos un color no escogido de la pluralidad de colores, y definiéndose un cuarto parámetro que toma un valor predeterminado que depende del orden de los dos colores asignados a las celdas, en base a un orden pre-establecido de los colores de la pluralidad de colores;
o para cada grupo de cuatro celdas de la combinación determinada:
■ asignar un color claro y/o un color oscuro a dos de las tres celdas que forman la primera fila y la primera columna del grupo de cuatro celdas, definiéndose un quinto parámetro que toma un valor predeterminado que depende de la celda que no tiene asignado un color claro o un color oscuro, y definiéndose
un sexto parámetro que toma un valor predeterminado que depende de la combinación de color claro y/o color oscuro asignada a las dos celdas;
■ asignar dos colores de la pluralidad de colores, que no incluye el color claro y el color oscuro, a las dos celdas restantes del grupo de cuatro celdas, definiéndose un séptimo parámetro que toma un valor predeterminado que depende de al menos un color no escogido de la pluralidad de colores, y definiéndose un octavo parámetro que toma un valor predeterminado que depende del orden de los dos colores asignados a las celdas, en base a un orden pre-establecido de los colores de la pluralidad de colores.
32. Sistema para generar un código visual (101) según una cualquiera de las reivindicaciones 1 a 16, comprendiendo el sistema una memoria y un procesador, en el que la memoria almacena instrucciones de programa informático ejecutables por el procesador, comprendiendo estas instrucciones funcionalidades para ejecutar un procedimiento según una cualquiera de las reivindicaciones 17 a 26 para generar un código visual.
33. Procedimiento para decodificar un código visual (101) según una cualquiera de las reivindicaciones 1 a 16, codificado de acuerdo con un procedimiento para generar un código visual según una cualquiera de las reivindicaciones 17 a 26, comprendiendo el procedimiento de decodificación:
- Obtener una imagen que comprende al menos un código visual a decodificar;
- Localizar (601) en la imagen obtenida al menos un código candidato;
Para cada código candidato localizado:
- Extraer (602) el color de cada celda del código candidato;
- Decodificar (603) la información codificada y/o el sistema de redundancia para la detección de errores en base al color extraído de cada celda.
34. Procedimiento según la reivindicación 33, en el que localizar (601) en la imagen cada código candidato comprende:
• Aplicar un algoritmo de umbralizado dinámico de la imagen, que tenga en cuenta las posibles diferentes condiciones de iluminación en diferentes áreas de la captura;
• Aplicar un algoritmo de extracción de contornos cerrados, sobre la imagen binarizada resultante de aplicar el algoritmo de umbralización;
• Reducir los contornos cerrados extraídos, mediante una aproximación poligonal;
7
• Verificar cuáles de los contornos reducidos son proyectivamente equivalentes a un cuadrado, obteniéndose, para cada contorno proyectivamente equivalente a un cuadrado, un código candidato.
35. Procedimiento según la reivindicación 34, en el que el algoritmo de umbralizado dinámico de la imagen utiliza un umbral adaptativo.
36. Procedimiento según una cualquiera de las reivindicaciones 34 o 35, en el que localizar (601) en la imagen cada código candidato comprende:
• Corregir la distorsión radial en la imagen introducida por el elemento de captura de la imagen.
37. Procedimiento según una cualquiera de las reivindicaciones 33 a 36, en el que extraer (602) el color de cada celda de un código candidato comprende:
• Realizar una rectificación homográfica de la imagen original, usando las cuatro esquinas del contorno del código candidato, a un marco canónico cuadrado de tamaño suficiente;
• Obtener, de la imagen rectificada, una matriz de celdas con un simple vector de color (R,G,B) en cada celda;
• Obtener un solo valor de vector RGB por celda de la matriz de celdas obtenida, mediante un filtro de mediana para eliminar posible ruido del sensor.
38. Procedimiento según la reivindicación 37, en el que extraer (602) el color de cada celda del código candidato comprende:
• Realizar un alineamiento sub-píxel de cada contorno del código candidato.
39. Procedimiento según una cualquiera de las reivindicaciones 37 o 38, en el que obtener, de la imagen rectificada, una matriz de celdas con un simple vector de color (R,G,B) en cada celda comprende:
- Realizar un balance de blancos usando los propios colores claro y oscuro del fondo y del marco, respectivamente, como elementos de calibración.
40. Procedimiento según una cualquiera de las reivindicaciones 37 a 39, en el que el filtro de mediana tiene una anchura suficiente como para cubrir de forma consistente el centro de cada
celda en el área que le corresponde de la imagen rectificada, sin invadir el resto de las celdas contiguas de la matriz de celdas.
41. Procedimiento según una cualquiera de las reivindicaciones 33 a 40, en el que decodificar (603) la información codificada y/o el sistema de redundancia para la detección de errores en base al color extraído de cada celda comprende:
• Determinar la orientación correcta de la matriz de celdas;
• Decodificar cada grupo de tres celdas, comprobando que que se cumplen las restricciones referentes a que cada grupo de tres celdas tiene una única celda de un color claro o de un color oscuro, entendida como una restricción monocromática, y el resto de las celdas son de colores diferentes entre sí, de la pluralidad de colores, entendida como una restricción cromática;
• Decodificar cada grupo de cuatro celdas, comprobando que se cumplen las restricciones referentes a que, en la posición de lectura del código visual, dos de las celdas de cada grupo de cuatro celdas, de las tres que forman la primera fila y la primera columna, son cada una de un color claro y/o un color oscuro, entendida como una restricción monocromática, y las dos restantes son de colores diferentes entre sí, de una pluralidad de colores que no incluye el color claro y el color oscuro, entendida como una restricción cromática;
• Si no se cumple la restricción monocromática de los grupos de tres celdas y/o de los grupos de cuatro celdas, descartar el código candidato;
• Si no se cumple la restricción cromática de los grupos de tres celdas y/o de los grupos de cuatro celdas,
o descartar el primer valor numérico (Code A);
o Obtener el segundo valor numérico (Code B) que se determina a partir de valores obtenidos de las celdas en base a su color en una escala de grises, de los grupos de tres celdas;
o Obtener el valor de redundancia del segundo valor numérico (Code B) a partir de valores obtenidos de las celdas de un color claro o un color oscuro de los grupos de cuatro celdas;
o Comprobar el valor de redundancia obtenido, con el segundo valor numérico (Code B) obtenido, para detectar errores en la lectura;
o Si la comprobación no es correcta, descartar el segundo valor numérico (Code B) obtenido;
o Si la comprobación es correcta, proporcionar el segundo valor numérico (Code B) obtenido;
• Si se cumplen las restricciones monocromática y cromática de los grupos de tres celdas y/o de los grupos de cuatro celdas,
o Obtener el primer valor numérico (Code A) que se determina a partir de valores obtenidos de las celdas de un color claro o de un color oscuro y de las celdas de colores dentro de la pluralidad de colores, de los grupos de tres celdas;
o Obtener el valor de redundancia del primer valor numérico (Code A) a partir de valores obtenidos de las celdas de un color claro o de un color oscuro y de las celdas de colores dentro de la pluralidad de colores, de los grupos de cuatro celdas;
o Comprobar el valor de redundancia obtenido, con el primer valor numérico (Code A) obtenido, para detectar errores en la lectura;
o Si la comprobación no es correcta, descartar el primer valor numérico (Code A) obtenido;
o Si la comprobación es correcta, proporcionar el primer valor numérico (Code A) obtenido;
o Obtener el segundo valor numérico (Code B) que se determina a partir de valores obtenidos de las celdas en base a su color en una escala de grises, de los grupos de tres celdas;
o Obtener el valor de redundancia del segundo valor numérico (Code B) a partir de valores obtenidos de las celdas de un color claro o un color oscuro de los grupos de cuatro celdas;
o Comprobar el valor de redundancia obtenido, con el segundo valor numérico (Code B) obtenido, para detectar errores en la lectura;
o Si la comprobación no es correcta, descartar el segundo valor numérico (Code B) obtenido;
o Si la comprobación es correcta, proporcionar el segundo valor numérico (Code B) obtenido.
42. Procedimiento según la reivindicación 41, en el que el que decodificar (603) la información codificada y/o el sistema de redundancia para la detección de errores en base al color extraído de cada celda comprende, si se descarta el primer valor numérico (Code A) y el segundo valor numérico (Code B):
• Obtener el tercer valor numérico (Code C) a partir de valores obtenidos de todas las celdas de un color claro o de un color oscuro de la matriz de celdas;
• Proporcionar el tercer valor numérico (Code C) obtenido.
43. Producto de programa informático que comprende instrucciones de programa para provocar que un sistema realice un procedimiento según una cualquiera de las reivindicaciones 33 a 42 para decodificar un código visual.
44. Producto de programa informático según la reivindicación 43, que está almacenado en unos medios de grabación.
45. Producto de programa informático según la reivindicación 43, que es portado por una señal portadora.
46. Sistema para decodificar un código visual (101) según una cualquiera de las reivindicaciones 1 a 16, codificado por un sistema para generar un código visual según una cualquiera de las reivindicaciones 30 a 32, comprendiendo el sistema de decodificación:
- Medios para obtener una imagen que comprende al menos un código visual a decodificar;
- Medios para localizar en la imagen obtenida cada código candidato;
- Medios para extraer el color de cada celda del código candidato;
- Medios para decodificar la información codificada y/o el sistema de redundancia para la detección de errores en base al color extraído de cada celda.
47. Sistema para decodificar un código visual (101) según una cualquiera de las reivindicaciones 1 a 16, codificado por un sistema para generar un código visual según una cualquiera de las reivindicaciones 30 a 32, estando configurado el sistema de decodificación para:
- Obtener una imagen que comprende al menos un código visual a decodificar;
- Localizar (601) en la imagen obtenida cada código candidato;
Para cada código candidato localizado:
- Extraer (602) el color de cada celda del código candidato;
- Decodificar (603) la información codificada y/o el sistema de redundancia para la detección de errores en base al color extraído de cada celda.
1
48. Sistema para decodificar un código visual (101) según una cualquiera de las reivindicaciones 1 a 16, codificado por un sistema para generar un código visual según una cualquiera de las reivindicaciones 30 a 32, comprendiendo el sistema de decodificación una memoria y un procesador, en el que la memoria almacena instrucciones de programa informático ejecutables por el procesador, comprendiendo estas instrucciones funcionalidades para ejecutar un procedimiento según una cualquiera de las reivindicaciones 33 a 42 para decodificar un código visual.
2
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
ES201930860A ES2817652B2 (es) | 2019-10-04 | 2019-10-04 | Codigo visual, procedimiento para generar un codigo visual y procedimiento para decodificar un codigo visual |
PCT/ES2020/070598 WO2021064272A1 (es) | 2019-10-04 | 2020-10-02 | Código visual, procedimiento para generar un código visual y procedimiento para decodificar un código visual |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
ES201930860A ES2817652B2 (es) | 2019-10-04 | 2019-10-04 | Codigo visual, procedimiento para generar un codigo visual y procedimiento para decodificar un codigo visual |
Publications (2)
Publication Number | Publication Date |
---|---|
ES2817652A1 ES2817652A1 (es) | 2021-04-07 |
ES2817652B2 true ES2817652B2 (es) | 2021-10-19 |
Family
ID=75336116
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
ES201930860A Active ES2817652B2 (es) | 2019-10-04 | 2019-10-04 | Codigo visual, procedimiento para generar un codigo visual y procedimiento para decodificar un codigo visual |
Country Status (2)
Country | Link |
---|---|
ES (1) | ES2817652B2 (es) |
WO (1) | WO2021064272A1 (es) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
ES2933648B2 (es) * | 2022-07-12 | 2023-05-23 | 4I Intelligent Insights S L | Sistema y procedimiento de codificacion y decodificacion de informacion a traves de imagenes con decodificacion robusta a media distancia |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8194973B2 (en) * | 2008-06-13 | 2012-06-05 | Hewlett-Packard Development Company, L.P. | Decoding information from a captured image |
JP2012523598A (ja) * | 2009-04-08 | 2012-10-04 | コンチネンタル・テベス・アーゲー・ウント・コンパニー・オーハーゲー | 2次元シンボルコードおよびそのシンボルコードを読取るための方法 |
US9111186B2 (en) * | 2011-10-12 | 2015-08-18 | University Of Rochester | Color barcodes for mobile applications: a per channel framework |
US9311584B2 (en) * | 2013-05-24 | 2016-04-12 | King Abdulaziz City for Science and Technology (KACST) | Multidimensional color barcode |
-
2019
- 2019-10-04 ES ES201930860A patent/ES2817652B2/es active Active
-
2020
- 2020-10-02 WO PCT/ES2020/070598 patent/WO2021064272A1/es active Application Filing
Also Published As
Publication number | Publication date |
---|---|
ES2817652A1 (es) | 2021-04-07 |
WO2021064272A1 (es) | 2021-04-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP2603880B1 (en) | Producing, capturing and using visual identification tags for moving objects | |
ES2750536T3 (es) | Transmisión de datos utilizando códigos ópticos | |
US11610299B2 (en) | Method and system for optical product authentication | |
EP2921997B1 (en) | Two-dimensional code | |
US9530215B2 (en) | Systems and methods for enhanced depth map retrieval for moving objects using active sensing technology | |
CN101978380B (zh) | 二维符号及其读取方法 | |
ES2823232T3 (es) | Sistema de generación de marcador y método | |
FI121901B (fi) | Objektien ilmaiseminen ja seuraaminen digitaalisissa kuvissa | |
US8194973B2 (en) | Decoding information from a captured image | |
CN103776392A (zh) | 三维几何建模和三维视频内容创建 | |
CA3045391C (en) | Method for detection and recognition of long-range high-density visual markers | |
CN105894069B (zh) | 一种视觉导航用的crc二维码的生成方法及识别方法 | |
US9104933B2 (en) | Covert bar code pattern design and decoding | |
ES2817652B2 (es) | Codigo visual, procedimiento para generar un codigo visual y procedimiento para decodificar un codigo visual | |
Tian et al. | Polartag: Invisible data with light polarization | |
US8919649B2 (en) | Method for the detection of a marker affixed to the surface of an object and system for implementing same | |
KR101109510B1 (ko) | 2차원 바코드 인식방법 | |
ES2817926B2 (es) | Codigo visual y procedimiento para codificar y decodificar una imagen bidimensional | |
Dean et al. | Quick layered response (qlr) codes | |
US9286695B2 (en) | Systems and methods for tracking points within an encasement | |
WO2012035552A2 (en) | Generating a code system using haar wavelets | |
KR101109509B1 (ko) | 모바일 기기용 2차원 바코드 | |
US20150109331A1 (en) | System and method for superimposing an optical readable data matrix code on an image | |
WO2016082055A1 (es) | Etiqueta inteligente con campos de informacion estaticos y dinamicos |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
BA2A | Patent application published |
Ref document number: 2817652 Country of ref document: ES Kind code of ref document: A1 Effective date: 20210407 |
|
FG2A | Definitive protection |
Ref document number: 2817652 Country of ref document: ES Kind code of ref document: B2 Effective date: 20211019 |