2011-05-03 14 views
17

Sto utilizzando OpenCV su iPhone e devo rilevare i numeri in un'immagine. Ho diviso l'immagine in immagini più piccole, quindi ogni immagine ha un solo numero (1-9). Tutti i numeri sono stampati, NON scritti a mano.OpenCV rileva numeri

Quale sarebbe l'approccio migliore per capire i numeri con OpenCV?

UPDATE:

ho trovato con successo i numeri e li estratto. Sembrano questo:

http://img198.imageshack.us/img198/5671/101ht.jpg
http://img824.imageshack.us/img824/539/606yu.jpg

Quando vengono estratti sono nella stessa dimensione e così via. Ho salvato un po 'di immagini e le ho inserite in una directory OCR dove sono classificate in numeri. Mi piace: ocr/1/100.jpg 101.jpg .... e ocr/2/200.jpg 201.jpg ....

Quindi stavo per utilizzare lo stesso approccio del tutorial OCR di base : http://blog.damiles.com/?p=93

Tuttavia, sto programmando per iPhone e non posso usare codice C++ (errore di compilazione e così via) e non ho accesso a highgui.

Ho provato ad utilizzare cvMatchTemplate() e abbinare una serie di immagini, ma sembra funzionare piuttosto male ...

Tutte le altre idee che posso provare?

+0

@Linues Avete mai provato a differenziare i numeri e i caratteri di un'immagine, cioè ottenere solo numeri dall'immagine O qualcosa nell'array dimensionale di contorni usando: findContours. Sto cercando di differenziare i numeri da char. Per favore fatemi sapere, se il suggerimento dalla tua fine. –

+0

[OCR di base in opencv] (http://blog.damiles.com/?p=93) –

+1

Grazie. L'ho letto prima però. Sta facendo OCR su numeri scritti a mano. Le immagini del treno funzioneranno bene anche per il testo stampato? – Linus

risposta

2

Objective C++? Prova a rinominare i tuoi file .m in .mm e poi puoi usare C++ nel tuo progetto iPhone.

2

Fondamentalmente il tuo problema è solo quello di classificare un vettore di funzionalità, che è l'insieme di intensità dei pixel dopo alcuni passaggi di pre-elaborazione. È possibile utilizzare qualsiasi classificatore per questa attività, come ad es. reti neurali, che dovrebbero avere un'implementazione C all'interno di OpenCV. Si potrebbe anche provare una libreria C libsvm per Support Vector Machines.

C'è un good site relativo a questo problema con molti documenti e un database di addestramento.

4

Se i numeri vengono stampati, il lavoro è abbastanza semplice, è sufficiente trovare un bel set di funzionalità da abbinare. Se i numeri sono un tipo di carattere, è possibile ottenere via con questo approccio:

  • estrarre il numero
  • Trova il rettangolo di selezione
  • Scala l'immagine in basso a qualcosa come 10x8, cerca di far corrispondere le proporzioni
  • fare questo per un piccolo insieme di addestramento, prendere l'immagine 'media' per ogni numero

  • per le nuove immagini, seguire la procedura descritta sopra, ma l'ultimo è solo una differenza un'immagine assoluta con ciascuna di un numero in modelli . Quindi prendi la somma delle differenze (pixel nell'immagine differenza). Quello con il minimo è il tuo numero.

Tutte sopra sono operazioni di base OpenCV.

7

Si potrebbe iniziare con la lettura su Analisi delle Componenti Principali (PCA), Analisi Discriminante Lineare di Fisher (LDA), e supporto Vector Machines (SVM). Questi sono metodi di classificazione che sono estremamente utili per OCR e ci sono librerie in qualsiasi lingua tra cui C++, Python, C# ecc.

Si scopre che OpenCV include già eccellenti implementazioni su PCAs e SVMs. Non ho visto esempi di codice OpenCV per OCR, ma è possibile utilizzare alcune versioni modificate della classificazione delle facce per eseguire la classificazione dei caratteri. Un'eccellente risorsa per il codice di riconoscimento facciale per OpenCV è this website.

0

HOG + SVM (provate a giocare con i kernel)

0

Le reti neurali di convoluzione sono di gran lunga i migliori algoritmi per le cifre scritte a mano. Sono implementati nella maggior parte dei sistemi come USPS ecc. Ecco alcuni documenti che spiegano gli algoritmi. http://yann.lecun.com/exdb/lenet/