Campo da Invenção
[001] A presente invenção está relacionada ao campo da interação humana com dispositivos portáteis, mais especificamente à interação feita através do reconhecimento automático de imagens de códigos de barras capturadas através da câmera integrada em dispositivos portáteis, em particular, telefones celulares, smartphones, Personal Digital Assistants PDA, câmera digitais portáteis, dentre outros.
[002] O presente pedido de patente de invenção refere-se a um sistema e método automático para rastreamento e decodificação de imagens de códigos de barras no padrão EAN-13 por meio de dispositivos portáteis equipados com câmeras digitais.
[003] Através deste sistema é possível rastrear o código de barras em qualquer posição e orientação que ele esteja e decodificá-lo automaticamente em tempo real. Para efetuar o rastreamento e a decodificação do código de barras, são aplicados métodos sobre a imagem capturada, buscando a orientação e localização do código de barras. Antecedentes da Invenção
[004] Atualmente, a tecnologia de código de barras faz parte de vários setores da área comercial, industrial e financeira. Podemos encontrar códigos de barras na identificação dos produtos de um supermercado, nos livros de uma biblioteca, nas máquinas de uma indústria, nos boletos bancários, nos equipamentos de uma organização, nos crachás dos funcionários de uma empresa, etc.
[005] Em geral, os códigos de barras originais representavam a informação através das larguras e dos espaços de barras paralelas dispostas na horizontal. Este tipo de código de barras possui apenas uma dimensão e é conhecido como código de barras unidimensional ou linear. Como exemplo de códigos de barras lineares tem-se o EAN-13, o código 128, o código 39, entre outros.
[006] Recentemente, surgiram os códigos de barras capazes de armazenar a informação na vertical e na horizontal e são os chamados código de barras 2D ou bidimensionais. Eles podem armazenar uma grande quantidade de informação. Como exemplo podemos citar o Qr Code, o DataMatrix, PDF417, Código 49, entre o outros.
[007] Alguns códigos de barras têm sua estrutura padronizada por organizações internacionais, como é o caso do EAN-13. Outros códigos são livres, onde quem deseja utilizá-lo tem autonomia para posicionar os dados como desejar, como, por exemplo, o código 128. Com isto, muitas organizações passaram a definir suas próprias estruturas.
[008] O padrão de código de barras EAN-13 é frequentemente utilizado na identificação de produtos vendidos em estabelecimentos comerciais. Este padrão de código de barras consiste em uma identificação única dos produtos que é utilizada pelos fabricantes, atacadistas, varejistas, distribuidores e consumidores em praticamente todo o mundo.
[009] Para efetuar a leitura do código de barras, utiliza-se um equipamento baseado em leitura ótica que é conhecido como escâner ou leitor de código de barras. Este equipamento realiza a varredura do código de barras emitindo um raio de luz vermelho que é absorvido pelas barras escuras e refletido pelas barras brancas. Sensores presentes no escâner captam estas informações e enviam para um computador que efetua tradução dos dados para números ou letras.
[0010] Com o avanço da tecnologia, tornou-se possível a criação de leitores de código de barras baseados em leitura ótica mais leves e que ocupam menos espaço, tornando-os mais portáteis. Apesar disto, estes leitores são desenvolvidos somente para a leitura de código de barras, e, em geral, só conseguem efetuar a leitura do padrão de código de barras para o qual foram desenvolvidos.
[0011] A patente norte-americana US2006020039, intitulada: Camera-Based Barcode Recognition, publicada em 14 de setembro de 2006, propõe um sistema de decodificação de código de barras a partir de imagens capturadas por câmeras digitais. Este sistema realiza a decodificação dos códigos de barras a partir de imagens obtidas no modo de pré-visualização, porém não apresenta uma técnica para evitar a degradação das imagens exibidas no visor do aparelho em questão. Para encontrar os limites do código de barras, a patente US2006020039 utiliza um método que tem como princípio encontrar as áreas brancas localizadas do lado esquerdo e do lado direito do código de barras a partir do centro do mesmo. Este método é ineficiente, pois estas áreas brancas podem encontrar-se danificadas, tornando o método impreciso. Após corrigir a rotação, a imagem retornada será uma sub-região localizada no centro do código de barras, excluindo o restante do código. Este procedimento não é eficiente, pois a imagem retornada poderá estar em pior estado do que nas regiões excluídas. A binarização utilizada pela referida patente possui parâmetros fixos, ou seja, não são adaptativos, com isto, este processo torna-se ineficaz, diminuindo a probabilidade de acerto do decodificador.
[0012] A patente US20050011957, intitulada: System and Method for Decoding and Analyzing Barcodes Using a Mobile Device, publicada no dia 20 de janeiro de 2005, apresenta uma aplicação para decodificação de códigos de barras. Esta aplicação consiste em um sistema e método que melhora a imagem e obtém a informação codificada pelo código de barras contido na imagem. Em seguida, através de uma conexão wireless, envia o resultado da decodificação para um servidor que é responsável por processar a informação do código de barras e transmitir de volta para o dispositivo móvel o conteúdo associado a este. A referida patente descreve, sem apresentar detalhes, o fluxo completo de um processo para correção da imagem e decodificação do código de barras. Este processo realiza inúmeras tentativas de decodificação utilizando diferentes parâmetros, que são obtidos através de um conjunto pré-estabelecido de parâmetros, que têm como objetivo melhorar a imagem e consequentemente, aumentar a probabilidade de decodificar o código de barras com sucesso. Estas operações são executadas nas imagens capturadas no “preview” da câmera integrada ao dispositivo móvel. A patente em questão menciona métodos para: correção da rotação; correção da perspectiva; remoção de cisalhamento; correção de problemas relacionados à iluminação; ajuste do foco; entre outras correções para remover as distorções que podem afetar a imagem do código de barras. A patente US20050011957 não descreve o funcionamento de um requisito importante para o sucesso da decodificação: o cálculo do limiar de corte entre o branco e o preto.
[0013] O documento de patente PI 0603273-7, publicado em 25 de janeiro de 2008, descreve um sistema e método que utiliza um software para realizar a decodificação de códigos de barras diretamente em aparelhos de comunicação móvel equipados com câmeras digitais. A referida patente descreve um método de pré-processamento da imagem capturada pela câmera do dispositivo a fim de verificar a presença de um código de barras. Este método consiste em converter a imagem para duas cores, e depois é realizar um processo de varredura da imagem que visa converter a mesma em dois estados de cores. Após este processo, é realizada uma filtragem dos elementos contidos na imagem. A seguir, é realizada uma parametrização visando identificar as partes componentes da imagem. Então, as partes componentes são verificadas a fim de localizar ou não um código de barras. Caso o resultado da verificação seja positivo, o valor representado no código de barras é obtido. As etapas realizadas pelo processo descrito no documento brasileiro PI 0603273-7 não são apresentadas com detalhamento suficiente. O documento PI0603273-7 apresenta o próprio estado da técnica, não acrescenta elementos novos e não explica como resolver os problemas apesar de indicá- los.
[0014] O documento intitulado: “Processamento Digital de Imagens de Códigos de Barras usando Telefones Celulares” de Tiago Henrique Tudisco dos Santos e Almir Olivette Artero, publicado em 7 de julho de 2010 no VI Workshop de Visão Computacional, propõe o uso de telefones móveis equipados com câmeras para leitura e interpretação de código de barras EAN-13, utilizando a tecnologia J2ME. Este documento utiliza o operador de Sobel de detecção de bordas para poder localizar e efetuar a leitura do código de barras. O método apresentado no referido artigo cria um mapa de direções de bordas a partir dos gradientes obtidos através da execução do operador de Sobel, eliminando as bordas com baixa magnitude. O sistema citado não apresenta soluções para problemas relacionados à iluminação, portanto, para que a decodificação seja efetuada com sucesso é necessário que o código de barras esteja em condições ideais, sem anomalias causadas por falta de foco, sombras ou ruídos.
[0015] O documento intitulado: “Locating and Decoding EAN-13 Barcodes from Images Captured by Digital Cameras” de Douglas Chai e Florian Hock, de 6 de dezembro de 2005, apresenta uma técnica baseada em visão computacional para localizar e decodificar código de barras. Para localizar o código de barras, divide-se a imagem em blocos de 32x32 pixels e, então, aplica-se o método de Otsu-Thresholding para limiarização em cada um destes blocos. Em seguida, realiza-se uma operação morfológica chamada “skeletonizing” em cada bloco. Para determinar se o bloco possui um código de barras ou não, separam-se os componentes conectados de cada bloco, e, então, calcula-se o ângulo destes componentes em relação ao eixo x. Apenas os blocos cujos ângulos dos componentes forem semelhantes, indicando que estes são paralelos, são mantidos na imagem. Apesar da técnica parecer ser eficaz, necessita de alto custo computacional, visto que o método apresentado por este artigo executa operações morfológicas que exigem alto custo computacional. O referido documento apresenta um método de decodificação simples, que é executado sem nenhum tipo de tratamento prévio na imagem para remoção de distorções causadas pela iluminação do ambiente, tratamento de sinal/ruído, remoção de perspectiva.
[0016] Os trabalhos supracitados apresentam vários processos para decodificação de código de barras, onde cada um possui métodos diferenciados para tentar reconhecer o código de barras da melhor forma possível. Imagens capturadas em ambientes não controlados sofrem interferências que dificultam sua análise. Estas interferências podem ser: problemas relacionados à iluminação; presença de ruído na imagem; baixo contraste; imagem capturada em movimento, imagem desfocada, distorções ligadas à perspectiva e a rotação; entre outros problemas. A maioria das soluções descritas pelos trabalhos correlatos realizará a leitura do código de barras com sucesso, somente se a imagem for capturada condições ideais, ou seja, se não sofrer influência dos problemas relatados anteriormente. Muitos trabalhos citaram a necessidade de aplicar métodos que melhorem a qualidade imagem, e conseqüentemente aumentando a probabilidade de realizar decodificações com sucesso, porém, não descrevem com detalhes o funcionamento desses métodos.
[0017] O documento de patente norte-americano US20040099741, publicado em 27 de maio de 2004, revela um sistema e método para obtenção da informação da imagem selecionada a partir de uma imagem digital e fornece a informação sobre a imagem selecionada para manuseio. Em um aspecto, a presente invenção localiza e segmenta automaticamente um item de uma imagem capturado por uma câmera digital e fornece uma informação da imagem, relativa ao item para processamento. Alternativamente, um usuário pode designar quais áreas de uma imagem compreendem o item de interesse para visualizações ou processamentos adicionais, sendo a inclinação localizada com base na transformada de Hough.
[0018] O documento de patente norte-americano US20060202039, publicado em 14 de setembro de 2006, apresenta um sistema para decodificação de informações relativas a códigos de barras a partir de uma imagem capturada por câmera, através da geração de uma sequência binária da imagem capturada e decodificação da informação do código de barras oriunda da sequência binarizada. A imagem capturada pela câmera é pré-processada em uma imagem em tons de cinza, e aprimorando o contraste entre as barras e espaços da imagem pré-processada. A orientação do código de barras é identificada de modo que seja paralela às barras na imagem pré-processada. Uma sequência projetada é formada pela projeção de pixels da imagem pré-processada ao longo da orientação do código de barras. A sequência binarizada é formada pela aplicação de um limiar para detectar picos da sequência projetada. Uma sequência de código de barras é formada, a partir a partir da sequência binarizada, na qual cada barra e cada espaço do código de barras são representados por único bit respectivo na sequência de codificação do código de barras. A seguir, a informação é extraída da sequência codificada do código de barras. De acordo com os ensinamentos do referido documento, o angulo de inclinação é encontrado através da projeção da imagem binarizada do código de barra sobre os eixos x e y.
[0019] Diferentemente dos documentos mencionados anteriormente, a presente invenção objetiva um método para leitura do código de barras a partir de uma imagem capturada pela câmera de um dispositivo portátil, levando em consideração a presença de anomalias que afetam a qualidade da imagem. Para isto, a presente invenção fornece um método para eliminar distorções relacionadas à perspectiva e à rotação do código de barras, iluminação, baixo contraste, melhorar a relação sinal/ruído, entre outros.
Sumário da Invenção
[0020] A presente invenção fornece um sistema de decodificação de código de barras, materializado através de uma solução integrada de software e hardware que rastreia e decodifica códigos de barras em tempo real por meio de dispositivos portáteis que possuam câmera digital. O sistema é capaz de rastrear e decodificar código de barras no padrão EAN-13.
[0021] Esta invenção tem como objetivo prover um método eficiente e eficaz que permita aos consumidores consultar preços dos produtos em qualquer lugar que esteja. A presente invenção permite que o consumidor, através de um dispositivo portátil, equipado com câmera digital consiga rapidamente decodificar o código de barras.
[0022] Visando um nível de decodificação similar ao dos equipamentos leitores de código de barras com laser, o sistema da presente invenção utiliza um método que possibilita a identificação e decodificação de códigos de barras posicionados em qualquer região da imagem capturada. O sistema também permite a identificação e decodificação de códigos de barras que estejam rotacionados ou que apresentem perspectiva.
[0023] O sistema da presente invenção permite ao usuário selecionar o modo de localização do código de barras. Este modo pode ser automático ou manual. No modo automático, o usuário enquadra o código de barras em qualquer posição do display da câmera e esse, por sua vez, será localizado e decodificado. Para o caso manual, o usuário deverá enquadrar o código de barras dentro dos limites de uma mira previamente posicionada. Problemas resolvidos pelo sistema da presente invenção
[0024] Apesar dos avanços tecnológicos, os dispositivos portáteis ainda possuem hardware com recursos relativamente limitados para executar algoritmos que efetuam cálculos avançados. Portanto, a presente invenção aplica técnicas de desenvolvimento com objetivo de diminuir o custo computacional, possibilitando uma redução no tempo de decodificação e minimizando o uso do processador do dispositivo portátil, além de economizar memória, otimizando, assim, o uso dos recursos. Estas técnicas também proporcionaram um aumento na robustez do leitor de código de barras, pois foi possível aumentar a quantidade de quadros analisados para o mesmo espaço de tempo.
[0025] Para realizar a análise em tempo real, faz- se necessário utilizar o quadro capturado pelo preview da câmera do dispositivo portátil e processá-lo. Porém, dependendo do tempo de processamento, a apresentação dos quadros poderia ser prejudicada, pois o quadro só poderá ser exibido no display do dispositivo portátil após o término do processamento, diminuindo, assim, a taxa de exibição efetiva dos quadros capturados pela câmera. Este tipo de limitação na visualização não costuma agradar aos usuários, causando desconforto na utilização do equipamento. Para evitar esta limitação, técnicas de programação concorrente e comunicação entre processos são utilizadas, possibilitando o desenvolvimento de um método eficaz que permite que um quadro seja processado, enquanto a câmera permanece filmando, fazendo com que os quadros continuem sendo capturados e exibidos no display do dispositivo portátil. Com isto, foi possível otimizar a visualização em tempo real, possibilitando processar um determinado quadro e ao mesmo tempo continuar a captura e apresentação dos quadros, mantendo a taxa de exibição do preview.
[0026] No momento da leitura, o código de barras pode ter sido posicionado inclinado e, com isto, a decodificação poderia ser prejudicada. Para ler o código de barras diretamente, é necessário que na imagem processada as barras tenham uma inclinação próxima de 90°. Por isso, foi desenvolvido um método específico que estima a orientação do código de barras e depois corrige o nível de inclinação, tornando possível decodificar códigos de barras inclinados, e por sua vez, aumentando a eficácia do leitor de código de barras. O ângulo de inclinação onde uma linha de varredura atravessando o código de barras apresenta a menor variância nos tons de cinza é utilizado para estimar o nível de inclinação do código de barras.
[0027] Para os casos em que a imagem capturada do código de barras não está em condições adequadas, poderia ocorrer perda de parte de suas informações. Este tipo de problema pode ser causado pelas condições de iluminação do ambiente, que pode ocasionar borrões de luz, sombras excessivas, baixa nitidez, entre outros. Também são muito comuns situações em que o código de barras já se encontra danificado devido a diversos fatores, dentre os quais se destacam: impressão de má qualidade; superfície envelhecida; recipiente ou embalagem estragada; dentre outros. Com o intuito de melhorar a eficácia da presente invenção, foram criados métodos que efetuam a correção dos possíveis danos supracitados.
[0028] Objetivando melhorar a eficácia da presente invenção para a leitura de códigos de barras, mesmo sob condições desfavoráveis, um conjunto de métodos são aplicados sobre a imagem. Primeiramente, busca-se somente a região onde o código de barras se encontra, eliminando componentes que comprometam o resultado da leitura do código de barras. O código de barras é dividido em fatias horizontais e cada uma destas é processada separadamente. Para obter os valores das barras, sub-regiões verticais são definidas e, por sua vez, calcula-se o limiar de preto e branco para cada sub-região. Um conjunto de pesos que ajustam o limiar ao nível de iluminação presente na imagem são aplicados no limiar. Com isto, os efeitos causados pela baixa qualidade da imagem e/ou fatores externos são eliminados, permitindo realizar a leitura do código de barras.
[0029] As embalagens dos produtos possuem diversos formatos. Por exemplo, imagens de embalagens com superfície curva distorcem o tamanho das barras, dificultando assim a decodificação do código de barras. Para resolver este problema, a presente invenção utiliza algoritmos eficientes para estimar o tamanho das barras.
[0030] Em alguns casos, determinadas câmeras podem não conseguir enquadrar com nitidez objetos pequenos, como é o caso de algumas fontes de letra, onde, à medida que a câmera se aproxima, elas permanecem desfocadas e ilegíveis. Algumas embalagens possuem ,código de barras tão pequenos que quando a câmera está distante, não é possível distinguir suas barras devido à quantidade insuficiente de pixels, e quando a câmera está próxima demais o objeto pode ficar desfocado, mesmo nos casos em que o auto-focus é executado. Este problema é contornado para câmeras com suporte a focus macro. Este tipo de auto-focus consegue focalizar objetos pequenos aumentando a sua nitidez e, por sua vez, favorecendo a leitura dos códigos de barras.
Vantagens técnicas/funcionais da invenção
[0031] Baixo custo computacional: Buscando aperfeiçoar o processo de leitura do código de barras, foram utilizadas técnicas de programação que otimizam a execução das instruções computacionais, como por exemplo, usar ponto fixo ao invés de ponto flutuante, utilizar manipulação de bits para realizar algumas operações, usar o mínimo de instruções possíveis para varrer ou copiar os pixels de uma imagem, dentre outras.
[0032] Leitura de código de barras eficiente e eficaz: A leitura é eficiente porque minimiza a utilização dos recursos computacionais, e é eficaz porque obtém sucesso na maioria das tentativas de leitura, sendo possível realizar a decodificação de código de barras com tamanhos diferentes, qualquer posicionamento, qualquer inclinação, alta perspectiva e em ambientes com diferentes iluminações.
[0033] Processamento em tempo real: Não é preciso capturar uma foto para que seja realizada a decodificação. O sistema executa todo o procedimento em tempo real, analisando os quadros obtidos no modo de pré-visualização. Com isto, foi possível aumentar a robustez do algoritmo, visto que a cada instante um novo quadro é processado até que a leitura seja realizada com sucesso. Além disto, dependendo da resolução suportada no modo de pré- visualização pela câmera do dispositivo portátil, é possível aumentar ainda mais a eficácia do leitor de código de barras.
[0034] Utilização de programação concorrente: Foram utilizadas técnicas robustas e ágeis de computação concorrente e comunicação entre processos, fazendo com que o sistema exiba os quadros filmados pela câmera do dispositivo portátil. ao mesmo tempo em que é efetuada a leitura e decodificação do código de barras presente em algum quadro capturado. Com a utilização desta técnica, é possível realizar todo processo de leitura do código de barras sem prejudicar a taxa de exibição do preview da câmera.
[0035] Identificação e correção da orientação do código de barras: Buscando aumentar ainda mais a eficácia do leitor de código da presente invenção, foi desenvolvido um método robusto para estimar o ângulo de inclinação do código de barras. Este método tenta encontrar qual a orientação das barras do código de barras. Para isto, a imagem é dividida em sub-regiões, e em cada uma destas se efetua uma busca pela linha de varredura com menor variância em uma faixa de ângulos de 180°.
[0036] Localização dos limites do código de barras: Este processo busca a posição do código de barras na imagem, retornando as coordenadas referentes ao lado esquerdo, o topo, o lado direito e a base do código de barras. Com isto, o leitor de código de barras precisará analisar somente a região dentro dos limites destas coordenadas, aumentando, por sua vez, a eficiência do algoritmo, que não terá que processar a imagem toda.
[0037] Eliminação de regiões inúteis: regiões fora dos limites encontrados são excluídas da leitura, evitando o processamento de regiões que não pertençam ao código de barras. Com isto melhorou-se a eficiência do leitor, visto que menos partes da imagem serão analisadas, diminuindo assim o tempo de processamento. A eficácia é acrescida, pois elementos que influenciam negativamente na definição dos limites de corte da região do código de barras são eliminados, fazendo que somente as barras, que são as informações relevantes, permanecem no processamento, e, com isto, aumentando a probabilidade de acerto na decodificação.
[0038] Identificação do código de barras: Com o objetivo de fazer com que o decodificador não seja executado em imagens que não possuam código de barras, ou que até possuam, porém com imagem desfocada, efetua-se uma pré-análise dentro dos limites do código de barras. Neste momento, será verificado o nível de contraste, onde, para os casos nos quais este contraste é muito baixo, descarta- se imediatamente a imagem, fazendo com que o leitor não execute uma tentativa de decodificação que poderia ser mal sucedida, e com isto, evitando-se o desperdício de tempo computando algo que dificilmente seria decodificado. Isto aumenta a eficácia no sentido que, após descartar a imagem, o processo será reiniciado e, portanto, um novo quadro que pode ter uma qualidade melhor e mais chances de decodificação será fornecido.
[0039] Fatiamento horizontal do código de barras: o código de barras é fatiado horizontalmente e a leitura é executada em cada uma destas fatias individualmente. Com isto, obteve-se uma melhor eficácia, pois o número de amostras foi aumentado, o que levou a um acréscimo no percentual de acerto. Caso não se obtenha sucesso na decodificação de uma fatia, outra é selecionada até que o código seja decodificado ou até que todas as fatias tenham sido selecionadas. O número de fatias é ajustado conforme a execução da leitura, fazendo com que no decorrer do processo obtenham-se fatias de diversas posições e de tamanhos diferentes, aumentando, assim, a probabilidade de sucesso na decodificação.
[0040] Método adaptativo de binarização: fase onde ocorre a definição das barras do código. Nesta etapa, é necessário determinar um limiar de corte para separar o nível branco do nível preto na imagem do código de barras em tons de cinza. Para isto, foram criados métodos que calculam o limiar de forma flexível e ajustável. Este limiar se ajusta à iluminação do ambiente. Isto acontece porque a fatia a ser decodificada é dividida em regiões verticais, e para cada uma destas sub-regiões obtém-se um limiar conforme a intensidade dos seus pixels. Além disto, a este limiar são atribuídos pesos que adaptam o limiar à iluminação do ambiente.
[0041] Leitura de código de barras em superfícies não planas: As embalagens dos produtos possuem diversos formatos. Podem ser encontrados produtos com embalagens com superfícies arredondadas, ovais, ou até mesmo embalagens que são sacos plásticos maleáveis cuja superfície não tem uma forma específica. Visando aumentar a robustez do processo, criou-se um método adaptativo que possibilita a decodificação de códigos de barras em superfícies com diferentes formatos. O método foi criado partindo-se do princípio que todas as barras são derivadas da barra fina, ou seja, para definir as outras barras, é necessário conhecer o tamanho da barra fina. Sabendo que dependendo da superfície que a barra se encontra, os valores podem aumentar ou diminuir conforme a perspectiva provocada pelo formato da embalagem. Por conta disto, calcula-se um tamanho de barra fina para cada dígito do código de barras, pois assim estima-se o tamanho de barra fina que está na mesma perspectiva das outras barras que formam o dígito.
[0042] Leitura de código de barras com perspectiva: visando aumentar a eficácia do leitor, foram desenvolvidas técnicas que possibilitam a decodificação de códigos de barras em perspectiva. Isto foi possível devido ao fatiamento horizontal que seleciona fatias do código que se encontram na mesma perspectiva favorecendo a decodificação de códigos de barras com alta perspectiva.
[0043] Validação do resultado: com o objetivo de mostrar apenas valores corretos, a presente invenção possui métodos de validação que verificam as barras de guarda do código e o dígito verificador. Logo após a definição das barras, é verificado se as barras de guarda estão corretas. Após todos os dígitos terem sido decodificados, efetua-se a checagem do dígito verificador. Caso a checagem esteja correta, o valor decodificado é retornado e o resultado é exibido.
[0044] Utilização de dispositivo de hardware com alta mobilidade: a presente invenção pode ser executada em um dispositivo portátil pequeno e leve que pode ser carregado para diferentes lugares sem ocupar muito espaço. Com isto, obteve-se um aparelho portátil e leve que efetua a leitura de código de barras em tempo real.
Breve descrição das figuras
[0045] Os objetivos e as vantagens da presente invenção tornar-se-ão mais evidentes a partir da descrição detalhada a seguir de um exemplo de concretização da invenção e desenhos anexos a título de exemplo não- limitativo, em que:
[0046] A Figura 1 ilustra como será a interação do usuário com a invenção.
[0047] A Figura 2 exibe como a invenção apresentará ao usuário a informação de que os limites do código de barras foram encontrados.
[0048] A Figura 3 exemplifica um modelo genérico de dispositivo portátil, no qual o sistema deve funcionar.
[0049] A Figura 4 é o diagrama de blocos mostrando os passos executados pela invenção para realizar a decodificação do código de barras.
[0050] A Figura 5 mostra o funcionamento da interceptação dos quadros filmados pela câmera do dispositivo portátil.
[0051] A Figura 6 mostra o método utilizado pela presente invenção para obter a provável orientação do código de barras.
[0052] A Figura 7 apresenta a região com a provável orientação do código de barras.
[0053] A Figura 8 detalha o funcionamento do método que computa a provável orientação do código de barras.
[0054] A Figura 9 exibe o código de barras após ter sua rotação corrigida.
[0055] A Figura 10 ilustra o processo de correção da rotação do código de barras.
[0056] A Figura 11 detalha o funcionamento do método que encontra os limites do código de barras.
[0057] A Figura 12 representa o momento em que a invenção computa os limites do código de barras.
[0058] A Figura 13 mostra o fluxo de decodificação do código de barras.
[0059] A Figura 14 representa o momento em que a invenção distingue os componentes pretos e brancos do código de barras.
[0060] A Figura 15 representa o momento em que a invenção define as barras do código de barras.
[0061] A Figura 16 ilustra a tela com o resultado da decodificação.
Descrição das concretizações preferidas da invenção
[0062] O sistema materializado a partir dos métodos desenvolvidos para esta invenção localiza e decodifica código de barras em tempo real a partir de um dispositivo portátil equipado com câmera digital. Assim, de acordo com a concretização preferida da invenção, é fornecido um método para localizar e decodificar códigos de barras, executados em tempo real a partir de um sistema integrado de hardware e software.
[0063] O funcionamento do sistema da presente invenção tem início no momento em que o usuário executa-o a partir de um dispositivo portátil no qual o sistema foi previamente instalado.
[0064] A figura 1 mostra o sistema após inicialização. Depois da inicialização, a câmera digital do dispositivo será acionada e o modo de pré-visualização será iniciado, mostrando os quadros filmados no display do dispositivo 111. Neste momento os quadros filmados são capturados em tempo real a uma taxa de FPS quadros por segundo, sendo o valor típico de FPS: 30.
[0065] Quando o código de barras 110 for enquadrado pela câmera do dispositivo, o sistema dará início às operações de localização e decodificação que processará os quadros obtidos pela câmera em execução. Neste momento, serão executados os procedimentos necessários para descobrir a orientação e os limites do código de barras, sendo também efetuadas correções relacionadas à iluminação, relação sinal/ruído, entre outras, e por fim o código de barras será decodificado.
[0066] A presente invenção tem como objetivo principal transformar um dispositivo portátil equipado com câmera digital em um sistema para decodificação de código de barras, com a finalidade semelhante ao dos equipamentos encontrados em lojas e supermercados. Para isto foram desenvolvidos métodos para localizar a orientação e a posição do código de barras antes deste ser decodificado. A figura 2 exemplifica o momento em que o código de barras é encontrado mostrando o retângulo 210 desenhado em torno dos limites do código de barras sinalizando que a localização foi executada com sucesso.
[0067] O hardware necessário para materializar o sistema da presente invenção é um dispositivo portátil, onde as suas principais características são ilustradas na figura 3. A CPU 310 (Unidade Central de Processamento) é responsável por executar as instruções necessárias pelo gerenciamento da câmera, além de fazer os cálculos computacionais para o processamento da imagem com o código de barras, a câmera 311 captura as imagens e deve possuir um foco suficiente para que a imagem capturada mantenha sua nitidez ou possuir o auto-focus. O meio de armazenamento 312 serve para guardar informações e dados, inclusive os códigos decodificados, entre outros. O hardware também é composto por dispositivos de entrada de informação 313 e componentes de áudio 314. Através de algum componente de conectividade 315 é possível fazer a comunicação entre a aplicação e uma base de dados remota que possui informações sobre os produtos. O meio de exibição 316 é utilizado para visualizar os quadros capturados pela câmera do dispositivo.
[0068] A figura 4 mostra o diagrama de blocos com o funcionamento geral da presente invenção. Este diagrama descreve todo o processo executado pelo sistema, desde a obtenção do quadro, localização e decodificação do código de barras.
[0069] A etapa “inicializa leitor de código de barras” 410, consiste no acionamento e configuração da câmera digital integrada com o dispositivo portátil, apresentação da interface com usuário e preparação dos parâmetros necessários para que o leitor de código de barras seja executado com sucesso. Nesta etapa, destaca-se a definição da resolução do quadro do modo de pré- visualização, onde tipicamente é selecionada a maior resolução suportada pelo equipamento. Além disto, é ativada a opção focus macro para câmeras que possuem auto-focus e suporte a esta opção. O focus macro é utilizado para que o aufo-focus focalize imagens próximas a lente da câmera permitindo que imagens filmadas próximas fiquem nítidas. Com isto, torna-se possível a decodificação de código de barras menores.
[0070] A etapa “Intercepta quadros capturados no modo de pré-visualização da câmera” (411), é responsável por obter os quadros filmados com eficiência e eficácia. O dispositivo portátil usualmente possui um sistema operacional embarcado com capacidade de realizar múltiplas tarefas ao mesmo tempo. Aproveitando este recurso, o processo de leitura do código de barras é feito em uma thread separada da thread onde o quadro filmado é interceptado e exibido no display do dispositivo. Com isto, a câmera continua filmando e exibindo os novos quadros, enquanto outro quadro é processado em uma outra thread. Para realizar este procedimento, foram desenvolvidos métodos bem definidos para troca de informações e mensagens entre as threads, conforme será descrito a seguir.
[0071] A figura 5 mostra o funcionamento da interceptação dos quadros filmados pela câmera do dispositivo portátil. Uma thread 511 é responsável por capturar os quadros da câmera e exibir no display. O quadro filmado é interceptado e postado 513 para a outra thread 514. Neste momento, o estado do leitor está definido como “disponível” 515. Então, o quadro é copiado para uma área de memória compartilhada 512 e, em seguida, a leitura do código de barras inicia-se em uma nova thread 514. Neste momento, o estado é definido como “ocupado” 517 e, com isto, não é possível postar um quadro novamente.
[0072] As operações realizadas na leitura do código utilizam apenas a luminância da imagem. Por isto, assim que o leitor de código de barras recebe o quadro interceptado, verifica-se o formato deste quadro e se obtém a sua luminância ou escala de cinza, que representa a intensidade de luz dos pixels da imagem. A câmera integrada ao dispositivo portátil pode suportar diversos formatos de imagem com seus respectivos espaços de cores. Muitos formatos já possuem um canal para a luminância, como é o caso do YUV e YCbCr, cuja luminância é armazenada no canal Y. Um formato comumente utilizado é o RGB, cuja equação para obtenção da luminância é:(1) L = 0,299R + 0,587G + 0,114 B
[0073] Após o término da leitura, o estado é definido como “pausado” 518. Se a leitura foi efetuada com sucesso, então, o resultado é exibido 519. Caso contrário, o estado é definido como “disponível” 520 e o processo é reiniciado.
[0074] Com a utilização do procedimento descrito acima, tornou-se possível efetuar a leitura do código de barras sem afetar a exibição dos quadros filmados, fazendo com que não ocorra congelamento da imagem no momento da filmagem, dando ao usuário a sensação de fluidez na exibição de imagens, pois minimiza-se a interferência do processo de decodificação na taxa de exibição no display do dispositivo portátil.
[0075] Retornando à figura 4, a etapa “pesquisa provável orientação do código de barras” 412 computará qual o ângulo de rotação de orientação, no qual o código de barras se encontra. Para isto, o quadro que contém o código de barras é dividido em regiões menores com mesmo tamanho e para cada uma destas regiões calcula-se um ângulo. Esta operação é exemplicada na figura 6. As equações utilizadas para obter os limites e o tamanho das regiões são mostradas a seguir:
[0076] As equações (1) e (2) são utilizadas para calcular a largura e a altura de cada região respectivamente. LQ é a largura e AQ é altura do quadro. ES representa quantas vezes uma região será menor que o quadro. A equação (3) calcula a área total de uma região.
[0077] Para estimar o ângulo do código de barras, faz-se necessário obter os níveis de cinza localizados em diferentes orientações de linhas de varredura percorrendo o código de barras. Os pixels são obtidos a partir das linhas com inclinações entre 0° a 180°, sendo que o centro das linhas de varredura intercepta o centro da região, conforme é exemplificado em 611. Para o traçado e varredura das linhas, utilizou-se o algoritmo de Bresenham 2d, que computa as coordenadas dos pontos das linhas eficientemente. A orientação do código de barras será o ângulo da linha de varredura entre 0° e 180° que possui menor variância nos tons de cinza dos pixels interceptados 712.
[0078] Cada região terá uma orientação própria 710, obtida conforme detalhado acima. Porém é necessário obter a orientação pertencente ao código de barras. Para isto, calcula-se o nível de variação dos níveis de cinza da linha perpendicular à orientação computada em cada região. Com isto, temos que a orientação do código de barras corresponde à orientação computada pela região com a maior variação entre os níveis de cinza. A figura 7 mostra como seria o resultado desta operação e a figura 8 exemplifica detalhadamente a obtenção da orientação estimada do código de barras. Este processo é calculado a partir das equações a seguir:
[0079] A equação (4) exemplifica o processo utilizado para calcular as coordenadas da linha que será analisada pelo algoritmo. A função B(a, b, r, θ) extrai linhas com diferentes inclinações, cujos parâmetros a e b representam as coordenadas do centro da linha. Neste método, a e b serão as coordenadas do centro da região em relação ao quadro contendo o código de barras. O parâmetro r é o raio, utilizado para definir o tamanho da linha que será igual a 2r. O parâmetro θ é o ângulo de inclinação da linha. A função bresenham2d, conforme mencionado anteriormente, serve para computar de forma rápida as posições dos pontos de uma linha, obtendo, assim, os níveis de cinza da linha com as suas respectivas coordenadas ao longo de uma linha de varredura. Esta função recebe como parâmetros as coordenadas do início e do fim de uma linha. A equação (5) computa a média, utilizada na equação (6) para calcular a variância. A variável x é um vetor de valores de luminâncias ao longo da linha calculada com a equação (4) e xi é o valor de luminância do pixel correspondente à posição i. Por fim, é mostrada a equação (7) cujo resultado será o ângulo da linha com a menor variância. As linhas obtidas possuirão inclinação variando entre 1° e 180°, sendo que a cada iteração este ângulo é incrementado delta graus (valor típico: 5o).
[0080] Neste momento, são obtidas várias pequenas regiões com seus respectivos ângulos. Assim, o próximo passo é descobrir qual a região onde o código de barras se encontra e obter o ângulo resultante. Aproveitando-se a estrutura do código de barras que é formado por linhas brancas e pretas, pesquisa-se a região com a maior variação entre os níveis de cinza na direção perpendicular ao ângulo resultante.
[0081] A equação (8) calcula o nível de variação de uma linha, onde x é um vetor correspondente a uma linha de varredura com seus respectivos níveis de cinza. A equação (9) retorna uma estimativa do ângulo do código de barras, que será o ângulo, obtido pela equação (7), da região com maior variação entre os níveis de cinza das linhas perpendiculares a este ângulo. Na equação (9) temos θj que é ângulo da região j, e J é número total de regiões. A partir do ângulo resultante, torna-se possível corrigir a rotação do código de barras.
[0082] Retornando à figura 4, a etapa “corrige rotação do código de barras” 413 é utilizada para a decodificação de código de barras muito inclinados. Esta etapa será executada apenas se o ângulo de rotação do código de barras for menor que 80° e maior do que 100°, pois é possível fazer a leitura do código de barras com pouca inclinação. O resultado da correção do código de barras é exemplificado pela figura 9. Para corrigir o código de barras, mais uma vez, utiliza-se Bresenham 2d que varrerá todas as linhas perpendiculares à orientação do código de barras e, por sua vez, criará uma nova imagem empilhando estas linhas.
[0083] A figura 10 ilustra o processo de correção da rotação do código de barras, onde, após obter o ângulo de rotação do código de barras 1010, calculam-se todas as linhas perpendiculares a este ângulo 1011 e, conforme mencionado anteriormente, cria-se uma nova imagem empilhando verticalmente cada linha perpendicular 1012 as barras do código de barras.
[0084] Após a correção de rotação do código de barras, segue-se para a etapa “pesquisa os limites do código de barras” 414 que visa encontrar a localização do código de barras. Esta etapa calcula a posição a qual se inicia o código de barras e a posição onde ele termina, tanto na horizontal como na vertical.
[0085] A figura 11 mostra o processo executado para obter estes dados. A primeira fase deste processo é tentar encontrar o topo e a base do código de barras. Para isto, ele calcula a diferença horizontal de cada linha da imagem 1110. Com isto, obtém-se que o topo do código de barras será a primeira linha cuja variação entre os níveis de cinza seja maior que o limiar estabelecido e a base do código de barras será a última linha maior que este limiar. As equações a seguir descrevem este processo:
[0086] A equação (10) e a equação (11) descrevem o processo utilizado para encontrar o topo e a base do código de barras. A equação (10) corresponde ao algoritmo que calcula a variação dos níveis de cinza de cada linha da imagem. A função C calcula o nível de variação de cada linha, onde L é a largura da imagem e xj é o valor correspondente à coluna j. Seu retorno é a média de variação do nível de cinza de uma linha da imagem. D é um vetor que armazena o valor do nível de variação de cada linha da imagem, onde Di representa um elemento deste vetor na posição i. A variável A é a altura da imagem e será o tamanho do vetor D. A equação (11) representa o algoritmo que pesquisa o topo e a base do código de barras a partir do resultado da equação (10), o topo, t, será a primeira linha com variação maior que o limiar, T1, e a base, b, será a última linha com variação maior que este limiar.
[0087] Após encontrar o topo e a base do código de barras, o próximo passo será a busca pelo lado esquerdo e pelo lado direito do código de barras. Para isto é feito o empilhamento vertical da região entre o topo e a base 1112. Como o código de barras é formado por linhas verticais pretas, logo, este se encontrará entre os elementos cujos valores do empilhamento sejam maiores que o limiar estabelecido. Então, o lado esquerdo do código de barras será a primeira coluna e o lado direito será a última coluna com valores maiores que o limiar estabelecido 1113.As equações a seguir demonstram como é feita a busca pelo lado esquerdo e pelo lado direito do código de barras:
[0088] A equação (12) computa o empilhamento vertical das colunas entre a posição t e b, calculados nas equações (10) e (11). A variável y corresponde a uma coluna da imagem, onde yi é o elemento da coluna na linha i. A variável E é um vetor com os valores do empilhamento vertical, onde, Ej é o seu elemento na posição j. L é a largura da imagem e corresponde ao total de elementos de E. A equação (13) pesquisa o lado esquerdo e o lado direito do código de barras, onde T2 é o limiar do empilhamento, logo, o código de barras está localizado na região onde o empilhamento possui valor maior do que T2.
[0089] No final do processo de localização do código de barras, serão obtidas as coordenadas com os limites do código de barras, e com isto o leitor analisará apenas a região retangular delimitada por estas coordenadas 1114, fazendo com que não sejam computados os elementos que não estão presentes no código de barras e, que por sua vez, poderiam dificultar a leitura deste.
[0090] A figura 12 ilustra o resultado da pesquisa pelos limites do código de barras, exemplificando como seria a região selecionada 1210.
[0091] A etapa “confirma a presença do código de barras” 415 analisa se dentro da região selecionada realmente existe um código de barras. Isto é feito verificando o nível de variação brusca dos tons de cinza dentro dos limites computados para o código de barras. Este processo é executado da seguinte forma: é selecionada uma linha horizontal no meio da região correspondente ao código de barras. Caso o nível de variação dos tons de cinza desta linha seja menor que o limiar estabelecido, então a imagem em análise é descartada e o processo é reiniciado; caso contrário, a próxima etapa é executada, pois foi confirmada a presença de um código de barras.
[0092] Caso seja confirmada a presença do código de barras dentro dos limites calculados, então a etapa “decodifica código de barras” 416 é executada. Esta etapa é correspondente ao núcleo da decodificação e é utilizada para a leitura do código de barras, conforme ilustrado na figura 13.
[0093] A etapa “decodifica código de barras” 416 é dividida em sub-etapas (figura 13). Cada uma desta etapas aplica uma determinada ação sobre a imagem do código de barras, sendo que, o resultado de uma sub-etapa anterior é utilizado como parâmetro de entrada para etapa seguinte. Estas sub-etapas são descritas detalhadamente a seguir:
[0094] Fatiamento horizontal do código de barras (1310): A imagem é fatiada horizontalmente e cada uma desta fatias é processada individualmente, onde, caso a fatia (1311) corrente obtiver sucesso na decodificação, o processo é concluído e o resultado da decodificação é retornado. A quantidade de fatias horizontais é um dos parâmetros utilizados pelo sistema leitor de código de barras, sendo que este número pode ser alterado dependendo do fluxo da execução do algoritmo, ou seja, este fatiamento é adaptativo, sendo que primeiro tenta-se efetuar a decodificação a partir de um parâmetro inicial. Caso a leitura não ocorra com este parâmetro, este será incrementado até que haja uma decodificação com sucesso ou até atingir o limite máximo de fatias horizontais.
[0095] Binarização da fatia horizontal (1312): esta sub-etapa é responsável por converter os valores da imagem, que geralmente se encontram com 255 tons de cinza diferentes em apenas dois tons distintos: preto e branco. Esta etapa representa um dos passos necessários para o sucesso da decodificação, pois é a partir desta que será possível definir o que é barra preta e o que é barra branca.
[0096] A Figura 14 representa o momento em que a invenção distingue os componentes pretos e brancos do código de barras. Para efetuar a binarização da fatia, é necessário definir o limiar que separa os tons brancos dos tons pretos. Para isto, divide-se a fatia horizontal em fatias verticais e calcula-se o limiar de tom para a fatia vertical. Este limiar é obtido através da média dos tons de cinza de cada fatia vertical. Se o valor do tom do pixel for menor que este limiar, então, atribui-se preto, caso contrário atribui-se branco. Entretanto, ao limiar são aplicados conjuntos de pesos para poder corrigir a distorção causada pela iluminação, onde, no caso de ambientes muitos escuros, o limiar tem seu valor reduzido, e para ambientes com alta iluminação este será aumentado.As equações a seguir detalham este processo:
[0097] A equação (14) calcula os tamanhos e as coordenadas iniciais das fatias horizontais e verticais. M é a altura da fatia horizontal e N é a largura da fatia vertical, a variável A corresponde à altura e a variável L à largura da imagem. A variável NH representa o número de fatias horizontais e a variável NV representa o número de fatias verticais. Utilizam-se também as variáveis h e v que são, respectivamente, os índices da fatia horizontal e da fatia vertical correntes. O número da linha inicial da fatia é representada por l e o número da coluna é representada por c. A função S computa o limiar utilizado para distinguir o preto do branco, onde W é o peso que torna adequado o limiar para o nível de iluminação do ambiente. A equação (16) binariza a fatia horizontal. A variável G representa a imagem em tons de cinza, em que i corresponde a posição de uma linha e j a posição de uma coluna. A variável B é uma fatia horizontal binarizada.
[0098] Empilhamento vertical da fatia binarizada (1313): nesta sub-etapa, a fatia bidimensional será convertida em um vetor unidimensional. Este processo é feito através do empilhamento vertical da fatia binarizada. Este processo obtém a média dos tons de cinza de cada coluna. Se esta média for maior que 127, então, o valor será definido como branco, senão será preto. O valor de corte é 127, pois a imagem binarizada possui somente os valores 0 para preto e 255 para branco.
[0099] A equação (17) efetua o empilhamento vertical da fatia binarizada. A equação (18) converte os valores da matriz bidimensional em uma matriz unidimensional, onde R é a matriz unidimensional em que Rj representa seu elemento na posição j.
[00100] Converte pixels para barras (1314): Esta sub-etapa tem como entrada o vetor retornado pela etapa anterior que tem a informação das barras em pixels, convertendo este vetor para uma representação do código de barras EAN-13. Este código possui 4 níveis de barras (fina, média: 2 barras finas, larga: 3 barras finas, muito larga: 4 barras finas). Então, faz-se necessário encontrar uma forma de definir quantos pixels cada barra possui. Na imagem, o elemento atômico é o pixel. No código de barras EAN-13, o elemento atômico é a barra fina. Então, se tenta encontrar o tamanho em pixels da barra fina, e a partir desta define-se o tamanho das outras barras. O primeiro passo para efetuar esta conversão é encontrar as barras de início e de fim do código, e após isto, buscam-se as posições das barras correspondentes aos dígitos. Sabe-se que cada dígito possui 4 barras de diferentes tamanhos, porém estes dígitos são sempre formados por 7 barras finas. Portanto, sabendo-se o tamanho em pixels da largura da barra fina, torna-se possível calcular a largura das outras barras. Então, para cada dígito obtém-se a largura da barra fina, e por sua vez calcula-se a largura das outras barras que formam o dígito. Desta forma, torna-se possível obter o tamanho correto das barras do código de barras de embalagens com superfície arredondada. A figura 15 ilustra esta conversão, onde o número 1 representa barra preta fina e o número 0 representa barra branca fina.
[00101] Tradução do código de barras (1315): Esta sub-etapa efetua a tradução do código de barras, ou seja, a partir da combinação de 4 barras obtém-se o dígito codificado por esta. O código de barras EAN-13 possui 13 dígitos, sendo que 12 destes estão codificados nas barras e 1 é codificado através da paridade dos 6 primeiros dígitos. Após a tradução do código de barras, calcula-se o dígito verificador. Logo em seguida, checa-se o dígito verificador, sendo que em caso de sucesso, retorna-se o valor do código de barras decodificado.
[00102] Retornando à figura 4, a etapa “exibe resultado da decodificação” 417 apresenta o resultado da leitura do código de barras apenas nos casos em que a decodificação foi bem-sucedida. Nesta etapa, de acordo com a concretização aqui preferida, com o resultado do código de barras é efetuada uma pesquisa sobre os pontos de vendas que fornecem o produto identificado pelo código de barras decodificado, bem como os preços deste.
[00103] A Figura 16 ilustra a tela com o resultado da decodificação, de acordo com a concretização preferida da invenção.
[00104] Embora uma modalidade preferida da presente invenção seja mostrada e descrita, aqueles versados na técnica compreenderam que várias modificações podem ser feitas sem se afastar do escopo e do espírito da presente invenção, tal como definidos nas reivindicações anexas.
[00105] É expressamente previsto ainda que todas as combinações dos elementos que desempenham a mesma função substancialmente da mesma forma, para alcançar os mesmos resultados, estão dentro do escopo da presente invenção.