2014-06-10 18 views
8

Sto lavorando a un codice di rilevamento QR e ho bisogno di individuare i modelli di ricerca (FP) su un'immagine. Ho creato un modello binario che assomiglia le piazze che si trovano agli angoli di codici QR come:Come rilevare un modello di codice QR in un'immagine?

FP = ones(9); 
FP(2:8,2:8)=0; 
FP(3:7,3:7)=1; 
FP(4:6,4:6)=0; 
figure;imshow(FP) 

E ho provato a cercare i punti dell'immagine con la massima correlazione con questo modello utilizzando xcorr2. Il mio problema è ovvio: il mio modello è molto piccolo rispetto alle dimensioni reali che i codici QR potrebbero avere sulle immagini.

C'è un modo di cercare un modello/maschera senza dover ridimensionarlo? C'è un altro approccio a questo problema?

A titolo di esempio, ecco un'immagine con un codice QR

enter image description here

+0

Potrebbe pubblicare un esempio dell'immagine con il codice QR, per favore? L'immagine reale su cui stai applicando la maschera. – kkuilla

+0

fatto! Ho modificato il mio post e caricato un'immagine di prova –

+2

Alcune parole chiave che potrebbero aiutare: "ridimensionare la corrispondenza del modello invariante" – nkjt

risposta

9

Non è necessario utilizzare xcorr2. Dovresti cercare uno schema 1: 1: 3: 1: 1 (larghezze scure-chiare-scure-chiare-scure) in 1d utilizzando le linee di scansione.

C'è una descrizione di un algoritmo di rilevamento riferimento a pagina 60 di the standard.

Inoltre, ZXing è una libreria open source che implementa il rilevamento/riconoscimento del codice QR. Puoi consultare il loro codice per riferimento.

Edit: Ad ogni linea di scansione, conteggio successivi pixel chiari scuri e successive. Otterrai una lista di numeri interi che rappresentano le lunghezze delle sequenze.

Quindi iniziare dalla più grande sottosuccessione scura e guardare ai lati. Se la lunghezza di sottosuccessioni scure è 300, allora le sottosequenze di luce adiacenti dovrebbero essere di lunghezza 50-150, e le loro sottosuccessioni scure adiacenti dovrebbero essere di lunghezza 50-150 (ciò è dovuto alla tolleranza di 0,5 proposta nello standard). .

Quindi, se si trova una tale sequenza, la si contrassegna con la dimensione 300. Quindi si prova la successiva sottosuccessione più grande e così via.

Giusto per chiarire, il metodo sopra dovrebbe essere utilizzato per trovare i 3 angoli contrassegnati.

+0

OK Proverò questo, ma cosa succede se sto lavorando con un'immagine come quella che ho caricato? In quel caso non posso cercare quel modello (supponendo che sia basato sui pixel), dato che ci sono più pixel coinvolti nella sequenza, giusto? –

+0

Penso che dovrai ridimensionare il tuo pattern o l'immagine di riferimento. Ma dal momento che lo fai in 1d anziché in 2d, sarà molto più veloce. –

+0

Inoltre, vedere la modifica che ho aggiunto. –

Problemi correlati