Conoscere i “Barcode” e “QR Code”

È sufficiente andare in giro per negozi, magari in un supermercato o una biblioteca, per renderci conto che la quantità di informazioni che dobbiamo essere in grado di gestire sulla disponibilità dei prodotti, la varietà di prezzo e, in alcuni casi, anche l'assortimento e l'effettiva quantità reperibile, è immensa. Fortunatamente esiste un sistema snello, pratico ed essenziale che permette di gestire tutte queste informazioni con uno sforzo modesto. I codici a barre risolvono buona parte dei problemi di trasferimento informativo, perché viaggiano insieme al prodotto e possono essere letti in maniera facile e universale. In questo articolo ci occuperemo di un'applicazione che li riguarda.

DI COSA SI TRATTA

Tra gli esempi che sono stati fatti in apertura, certamente non si citano le prenotazioni dei posti in treno, in aereo, in albergo e così tanti altri. L’utilizzo dei codici a barre, ormai da molto tempo, e dei QRCode, diffusi solo in periodi più recenti, rappresenta una delle più intelligenti forme di identificazione dei prodotti che sia mai stata creata fino a questo momento. L’avvento delle nuove tecnologie, degli smartphone e dei lettori ha reso tutto questo molto più utile, trasformando un sistema inizialmente destinato a soli “addetti ai lavori” in qualcosa che oggi è realmente alla portata anche degli utenti meno evoluti. Naturalmente all’interno di un codice a barre ci sono delle informazioni che devono poter essere tradotte dal linguaggio visivo e decodificate per tornare a comunicare all’utente l’informazione. Quella che vedremo oggi è un’applicazione di un kit realizzato da Atmel in grado di effettuare il riconoscimento continuo di entrambi i tipi di codice, e per farlo prima di tutto ci adopereremo per capire come debba essere eseguita la decodifica.

CARATTERISTICHE

Come abbiamo detto, il kit di cui parleremo oggi, ovvero l’Atmel SAM4S_WPIR_RD, illustrato in Figura 1, è in grado di effettuare l’elaborazione d’immagine e la decodifica di entrambi i tipi di codice. È basato su due librerie che sicuramente molti di voi già conosceranno, la Libdecodeqr e la OpenCV, ed una delle sue caratteristiche fondamentali è il supporto per la scansione continua. Questa possibilità permette, tra l’altro, l’implementazione del sistema all’interno di una catena industriale dedicata alla produzione in serie. Ma prima di terminare questa sezione dedicata alle caratteristiche, per procedere con un certo ordine dobbiamo parlare di ciò che arriva assieme al kit, ovvero la dotazione software. Il software demo, già caricato nella scheda, si attiva immediatamente non appena quest’ultima viene alimentata. L’alimentazione avviene tramite connessione USB, quindi per poterla vedere all’opera non serve fare altro. Non sono previsti altri controlli. L’unica cosa che dovete fare è guardare il display ed il risultato dell’elaborazione che proporrà. Dopo pochi secondi dall’accensione la scheda è già pronta per il riconoscimento continuo; se anteporrete al sensore un codice da decodificare, sicuramente il display mostrerà qualche dato significativo.

Figura 1: L’elettronica del barcode reader, un Atmel SAM4S_WPIR_RD

Figura 1: L’elettronica del barcode reader, un Atmel SAM4S_WPIR_RD

Il software lavora per garantire:

- la cattura dell’immagine tramite il sensore CMOS;
- l’acquisizione e la gestione dell’immagine;
- l’elaborazione dell’immagine;
- la decodifica QR;
- la visualizzazione sul display LCD.

La documentazione informativa di questa scheda non riguarda soltanto il software ma soddisfa anche tutto quanto vi serve sapere sull‘hardware: schemi in formati PDF ed OrCad, BoM e file GERBER. Avendo deciso di approfondire un argomento, è sempre meglio affrontarne prima di tutto gli aspetti teorici. Per questo motivo adesso cerchiamo di comprendere come l’informazione venga effettivamente inserita all’interno di un codice di tipo a barre o QR. Iniziamo partendo dai primi, illustrati nella Figura 2.

Figura 2: Esempi di codifica a barre nei suoi Standard più diffusi

Figura 2: Esempi di codifica a barre nei suoi Standard più diffusi

Quello che vediamo è una serie di linee parallele verticali che cambiano sia di dimensione sia di spaziatura tra di loro. Quello che non cambia, invece, è la dimensione totale del codice a barre. Questo, naturalmente, non è un caso. Nell’immagine notiamo subito che esistono diversi tipi di codice a barre, di diverse dimensioni e naturalmente indicati, in basso, con codici diversi. Questo perché come avviene con tutti i codici, anche quelli a barre sono oggetto di convenzioni che portano a codifiche che avvengono in maniera distinta. L’applicazione che vedremo oggi si riferisce all’EAN-13. Questa è una sigla che sta per “European Article Number” a 13 digit, dei quali 12 sono di dati ed 1 di controllo. La codifica e la decodifica vengono effettuate seguendo moduli fissi, con il criterio che segue: da sinistra a destra troviamo il margine sinistro, l’inizio del modulo, il blocco sinistro dei dati, il divisore centrale, il blocco destro dei dati, la cifra di controllo, la chiusura del modulo ed il margine destro. Questo significa: margine sinistro (3) + 6 caratteri di dati (7 × 6) + barra centrale (5) + 5 caratteri di dati (7 × 5) + caratteri di controllo (7) + margine destro (3) = 3 + 42 + 5 + 35 + 7+ 3 = 95. Questi moduli possono essere divisi in barre bianche o nere. Margine sinistro: bianco × 1 = 1; guida sinistra: nero × 2 + bianco = 3; blocco dati sinistro: (nero × 2 + bianco × due) × 6 = 24; divisore centrale: nero × 3 + bianco × 2 = 5; blocco destro dei dati: (nero × 2 + bianco × 2) × = 24; guida a destra: nero × 2 + bianco = 3; margine destro: bianco × 1 = 1; 1 + 3 + 24 + 5 + 24 + 3 + 1 = 61; che in altre parole significa che ci sono 61 barre totali; l’immagine in Figura 3 illustra la tabella di codifica utilizzata. Ora passiamo ai QR-Code.

Figura 3: Tabella di codifica EAN – 13

Figura 3: Tabella di codifica EAN-13

Si tratta di immagini leggermente più complicate, come mette in evidenza quella riportata in Figura 4.

Figura 4: Presentazione di un QR-Code

Figura 4: Presentazione di un QR-Code

 

Figura 5: Diagramma della sequenza di lettura del pattern EAN-13 e sua decodifica

Figura 5: Diagramma della sequenza di lettura del pattern EAN-13 e sua decodifica

QR-Code è una sigla che sta per “Quick Response Code”. Il motivo si intuisce facilmente: si tratta di una matrice o, se volete, di un codice a barre bidimensionale, rappresenta un sistema che nel corso del tempo è diventato molto popolare perché è facilmente leggibile ma soprattutto perché, messo a confronto con i codici a barre standard UPC ed EAN, permette di comunicare una maggiore quantità di dati. È composto da moduli scuri organizzati in una griglia quadrata su sfondo bianco. L’informazione codificata potrebbe essere costituita di quattro tipi standardizzati (“modi”), di dati (numerici, alfanumerici, binari o altro) o attraverso estensioni specifiche supportate. L’immagine utilizzata come esempio riporta direttamente al sito della Atmel e l’informazione codificata al suo interno non è altro che l’indirizzo internet della compagnia (www.atmel.com).

Naturalmente, anche per questo tipo di codifica esistono diversi standard e relativa documentazione. Vediamo come si può effettuare la decodifica dell’immagine e ricavare l’informazione che c’è al suo interno. Generalmente l’algoritmo di decodifica si basa sulla ricerca dei simboli significativi all’interno dell’intera matrice, riconoscendo il nero ed il bianco all’interno dei moduli quadrati. È un procedimento molto simile a quello utilizzato nel riconoscimento del codice a barre, in verità. Se volessimo identificare il contenuto di un QR-Code, dovremmo prima di tutto calcolare il valore di soglia e convertire l’immagine in una di formato binario. Successivamente, dovremmo localizzare i vari “pattern finder”; questi ultimi sono tre riquadri identici, posizionati all’interno dell’immagine ai bordi, in particolare negli angoli. La sequenza è sempre fissa e consiste di un nero, tre bianchi, un bianco, un nero. Sono sostanzialmente i simboli che troviamo negli angoli sud-ovest, nord-ovest e nord-est. Una volta fatto questo, è necessario:

- analizzare la posizione per identificare la rotazione;
- analizzare la posizione per identificare la distanza;
- calcolare la misura del modulo;
- acquisire l’immagine QR;
- generare la bitmap partendo dall’immagine;
- interpretare il pattern;
- applicare l’operazione XOR insieme col mask pattern;
- analizzare i simboli (operazione da svolgere secondo gli standard);
- ottenere il bit stream ed effettuare le eventuali correzioni;
- riorganizzare il bit stream ed applicare le regole di decodifica.

FACCIAMOLO FUNZIONARE

Non si tratta di un processo complicato, si tratta soltanto di prendere un pò di confidenza con il tipo di codifica utilizzato. In effetti l‘applicazione, una volta che le librerie sono state scritte, è abbastanza semplice ed è proprio questo che la rende così interessante. Fondamentalmente, in maniera molto simile ad altre applicazioni, l’inizializzazione include i segnali di CLOCK e la configurazione delle periferiche eventualmente presenti. In questo caso specifico, naturalmente, il sensore CMOS è la periferica da inizializzare. La qualità dell’immagine che verrà catturata dipenderà molto dalle differenti configurazioni del sensore, quindi questo rappresenta un fattore cruciale per il successo dell’applicazione. Le funzioni di questo programma possono essere suddivise in due parti, identificando due blocchi funzionali completamente distinti: la prima parte riguarda la modalità di scansione per i codici a barre mentre la seconda riguarda quella per i QR-Code. Per “spostarsi” da una modalità all’altra basterà semplicemente la pressione del tasto BP1.

Non soltanto sarà necessario inizializzare il sensore, ma anche l’MCU, rispetto a tutti i singoli task. Il dispositivo ricava il clock da un oscillatore veloce RC interno da 4 MHz, ma se si utilizza un quarzo esterno e la libreria opportuna (Broad_lowlevel.c) lo si può far lavorare con frequenze che arrivano fino a 120 MHz. Un aspetto interessante del SAM4S è la possibilità di gestire eventi di acquisizione in parallelo, utilizzando come segnale di sincronismo un clock esterno per effettuare l’interfacciamento al sensore. La funzione di bilanciamento automatico del bianco (Auto White Balance) nonchè quella di Auto Exposure (AE) del sensore OV7740 vengono impostate ai loro valori automatici, in modo tale che il sensore acquisisca immagini mediamente di buona qualità in qualunque condizione di luce. Questo, ovviamente, aumenta i tempi di messa a fuoco e rende necessaria l’acquisizione di un maggior numero di frame per ottenere un’immagine fruibile. All’interno del software, dal momento che il sensore può essere spento e riattivato in ogni momento, se queste funzioni sono impostate in modalità automatica la qualità del primo frame dopo l’operazione di “risveglio” non sarà eccelsa; le successive risulteranno sicuramente migliori. Dopo aver riattivato il dispositivo, un metodo certo per ottenerle è di non impostare queste funzioni in modalità automatica.

Prima di catturare la prima immagine il software aspetta tre secondi perché le funzioni siano stabilizzate, successivamente i parametri di AWB e AE vengono impostati e salvati, ne viene effettuato un backup all’interno dei registri del SAM4S e così possono essere impostati in modalità manuale. Successivamente, per ciascuna delle volte che si cercherà di acquisire un’immagine, per la configurazione di lettura saranno utilizzati i due valori dei quali è stato fatto il backup all’interno dei registri. Avevamo anche parlato, in apertura, di una libreria, la OpenCV (acronimo di Open Source Computer Vision Library), che altro non è se non una libreria Open Source per la visione artificiale, che può essere anche molto utile per sviluppare software con funzioni di apprendimento. È stata costruita per fornire una base comune per la visione artificiale e le applicazioni ad essa correlate. Questa libreria vanta la disponibilità di oltre 2500 algoritmi ottimizzati e grazie ad essi il kit riesce a realizzare le funzioni di elaborazione di immagine come la soglia, di cui abbiamo parlato in precedenza, la rilevazione dei contorni e così via. Al fine di separare le regioni dell’immagine che corrispondono al codice che vogliamo analizzare e nel contempo ottenere un’informazione su scala dei grigi utile per l’elaborazione, la funzione di adattamento di soglia permette di “leggere” l’immagine nel migliore dei modi possibili. Si basa su un metodo che implementa una curva gaussiana e una valutazione di media sui singoli punti che sono stati rilevati. Abbiamo detto però che la scansione dei codici a barre e la loro decodifica seguono un processo diverso, se vogliamo un pò più semplice, ed in questa parte del programma avremo due tipi di metodi che convertono l’immagine catturata in un’immagine in bianco e nero.

Di conseguenza, per quello che abbiamo detto, gli algoritmi sono differenti e una volta che è stata ottenuta l’immagine in bianco e nero, la larghezza delle barre viene misurata e quindi se ne ottiene il numero, verificando nel contempo che rispettino lo standard EAN-13 (che, lo ricordiamo, in questo caso è quello su cui si basa l’esperimento). La decodifica dei QR-Code, che mostriamo in Figura 6, si basa sulle librerie di cui abbiamo parlato in precedenza; il programma è in grado di completare l’elaborazione dell’immagine e, in contemporanea, anche di decodificare il codice. Per quanto riguarda la prima parte è necessario, generalmente, filtrare le immagini grezze, in maniera tale da ridurre le componenti di rumore. A questo punto vengono sottoposte ad una operazione di confronto a soglia per diventare nuovamente bianche o nere; di fatto si utilizza quello che si definisce un “hard limiter”, un comparatore a due soglie, ossia stiamo facendo la quantizzazione ad 1 bit. Per quanto riguarda la sezione di decodifica, invece, viene eseguito un metodo generico che prevede prima di tutto che il programma acquisisca la matrice o l’immagine e quindi imposti la versione del QR in funzione delle dimensioni del pattern che è stato identificato. Durante la prima fase, quindi, si cerca di ottenere proprio questa informazione e una volta ottenuta la funzione di pattern, il bit stream può finalmente essere letto.

Figura 6: Diagramma di decodifica del QR-Code

Figura 6: Diagramma di decodifica del QR-Code

 

Figura 7: Prima fase della decodifica QRCode

Figura 7: Prima fase della decodifica QR-Code

 

Figura 8: Fase ulteriore della decodifica QR-Code.

Figura 8: Fase ulteriore della decodifica QR-Code

USO DEL LETTORE E VALUTAZIONI

A questo punto ciò che resta da fare è valutare il funzionamento del dispositivo, provando a far leggere al sensore immagini a distanza variabile, cercando di verificare quanto tempo richieda la messa a fuoco e quale sia il grado di correttezza del riconoscimento che viene effettivamente raggiunto. Il software di base prevede il riconoscimento continuo dopo un certo periodo di tempo. Appena alimentato, come detto inizialmente, lo schermo mostra delle informazioni che non hanno a che fare con la decodifica; non appena arriva un segnale leggibile e che venga effettivamente decodificato, sullo schermo appaiono dei dati concreti. Sostanzialmente la scheda agirà, una volta che il programma è stato caricato, come se fosse una videocamera e quando verrà rilevato un codice valido, l’informazione verrà visualizzata. Come anticipato, il numero di applicazioni per questo genere di scheda, ma soprattutto di librerie, è praticamente infinito. La visione artificiale è un campo che naturalmente non si limita al solo ambito industriale, ma proprio in quest’ultimo trova alcune delle sue più promettenti applicazioni, dal momento che l’impatto economico che questa applicazione può generare è davvero notevole.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend