2011-01-16 11 views
16

Sto sviluppando un'applicazione per leggere lettere e numeri da un'immagine usando opencv in C++. Ho prima cambiato l'immagine a colori e il modello di colore in un'immagine binaria, quindi ho chiamato il metodo cvMatchTemplate(). Questo metodo ha appena evidenziato le aree in cui il modello corrisponde .. Ma non è chiaro .. Io non voglio vedere l'area .. Devo analizzare i caratteri (lettere & numeri) dall'immagine. Sono nuovo di OpenCV. Qualcuno conosce qualche altro metodo per ottenere il risultato ??legge numeri e lettere da un'immagine usando openCV

alt text

L'immagine è catturata dalla fotocamera. l'immagine di esempio è mostrata sopra. Ho bisogno di ottenere tutti i testi dal display a LED (130 e Delft Tanthaf).

Amici Ho provato con l'applicazione di esempio di rilevamento del volto, Rileva i volti. il file HaarCascade viene fornito con openCV. Ho appena caricato quel file e chiamato il metodo cvHaarDetectObjects(); Per rilevare le lettere ho creato il file xml utilizzando l'applicazione letter_recog.cpp fornita da openCV. Ma quando carico questo file, mostra qualche errore (errore OpenCV: Errore non specificato> in funzione sconosciuta, file ........ \ ocv \ opencv \ src \ cxcore \ cxpersistence.cpp, riga 4720). Ho cercato nel web questo errore e ho ottenuto le informazioni sui file lib usati. L'ho fatto, ma l'errore rimane ancora. È l'errore con il mio file xml o chiamare il metodo per caricare questo file xml ((CvHaarClassifierCascade *) cvLoad ("nome file xml compilato", 0,0,0);) ?? Si prega di aiuto ...

Grazie in anticipo

risposta

4

Vedere la mia risposta a How to read time from recorded surveillance camera video? È possibile/consigliabile utilizzare cvMatchTemplate() per farlo.

+0

ma la posizione di cifre dell'immagine può variare, quindi non posso confrontare per la particolare posizione dell'immagine. L'immagine comparata non è chiara, quindi come otterrò la particolare cifra dall'immagine ??? – asifkt

+0

@asifkt, quindi modifica la tua domanda per fornire ulteriori dettagli sulla tua applicazione. Cosa sai delle lettere (tipi di carattere, dimensioni, prospettiva) della fonte dell'immagine (video, scanner, ecc.) E altro ancora. Ciò contribuirà a concentrarsi sulle possibili soluzioni. –

+0

Ho sviluppato un'applicazione per il rilevamento del volto. In realtà il file cascade haarcascade_frontalface_alt.xml è fornito con opencv. Per il riconoscimento delle lettere ho bisogno di creare un file xml.Così ho usato i file opencv_createsamples.exe, opencv_haartraining.exe per creare questo file. Ho dato un logo come immagine positiva e altre 5 immagini che non contengono il logo come immagini negative. Non ho ricevuto alcun file xml allenandolo. Ho sentito che ci vorranno almeno 3 giorni per l'allenamento di haar. È vero?? Per ottenere un xml intermedio ho bisogno di usare il file convert_cascade.exe. Se lo uso, otterrò il risultato migliore ??? – asifkt

0

Se si lavora con un set fisso di destinazioni del bus, la corrispondenza del modello verrà eseguita.

Tuttavia, se si desidera che il sistema sia più flessibile, immagino che occorra una qualche forma di analisi del profilo/forma per ogni singola lettera.

8

La corrispondenza dei modelli tende a non essere robusta per questo tipo di applicazione a causa di incoerenze dell'illuminazione, cambiamenti di orientamento, cambiamenti di scala, ecc. Il modo tipico per risolvere questo problema è quello di portare l'apprendimento automatico. Quello che stai cercando di fare allenando il tuo classificatore boosting è un approccio possibile. Tuttavia, non penso che tu stia facendo correttamente l'allenamento. Hai detto che hai dato il logo 1 come immagine di allenamento positiva e altre 5 immagini che non contengono il logo come esempi negativi? In genere è necessario che i campioni di addestramento siano nell'ordine di centinaia o migliaia o più. Non è possibile allenarsi con 6 campioni di allenamento e aspettarsi che funzioni.

Se non si ha familiarità con l'apprendimento della macchina, qui è circa cosa si dovrebbe fare:

1) È necessario raccogliere molti campioni di formazione positivi (da centinaia di poi, ma in generale più siamo meglio è) di l'oggetto che stai cercando di rilevare. Se si sta tentando di rilevare singoli caratteri nell'immagine, ottenere immagini ritagliate di singoli caratteri. È possibile iniziare con il database MNIST per questo. Meglio ancora, per addestrare il classificatore per il tuo particolare problema, ottenere molte immagini ritagliate dei personaggi sul bus dalle foto. Se si sta tentando di rilevare l'intero pannello LED rettangolare, utilizzare le immagini come campioni di allenamento positivi.

2) È necessario raccogliere molti campioni di allenamento negativo. Il loro numero dovrebbe essere nello stesso ordine del numero di campioni di allenamento positivi che hai.Queste potrebbero essere le immagini degli altri oggetti che appaiono nelle immagini su cui verrà eseguito il rilevatore. Ad esempio, è possibile ritagliare le immagini della parte anteriore del bus, delle superfici stradali, degli alberi lungo la strada ecc. E utilizzarle come esempi negativi. Questo per aiutare il classificatore a escludere questi oggetti nell'immagine su cui viene eseguito il rilevatore. Quindi, gli esempi negativi sono non solo qualsiasi immagine contenente oggetti che non si desidera rilevare. Dovrebbero essere oggetti che potrebbero essere scambiati per l'oggetto che stai cercando di rilevare nelle immagini su cui viene eseguito il rilevatore (almeno per il tuo caso).

consultare il seguente link su come addestrare la cascata di classificatore e produrre il file del modello XML: http://note.sonots.com/SciSoftware/haartraining.html

Anche se lei ha detto che si desidera solo per rilevare i singoli caratteri invece che l'intero pannello LED sul bus, Consiglierei innanzitutto di rilevare il pannello LED in modo da localizzare la regione contenente i caratteri di interesse. Successivamente, esegui la corrispondenza dei modelli all'interno di questa regione più piccola o esegui un classificatore addestrato a riconoscere i singoli caratteri su patch di pixel in questa regione ottenuti utilizzando l'approccio a finestra scorrevole e, eventualmente, su più scale. (Nota: il classificatore boosting haarcascade che hai menzionato sopra rileverà i caratteri ma non ti dirà quale personaggio ha rilevato a meno che tu non lo addestri solo per rilevare quel particolare carattere ...) Rilevare i caratteri in questa regione in una finestra scorrevole darà l'ordine in cui appaiono i caratteri in modo da poterli stringere in parole, ecc.

Spero che questo aiuti.

EDIT:

mi è capitato di possibilità su questo vecchio post di mine dopo separatamente scoperta del modulo di testo scena in OpenCV 3 citato da @KaolinFire.

Per coloro che sono curiosi, questo è il risultato dell'esecuzione di quel rivelatore sull'immagine campione fornita dall'OP. Si noti che il rilevatore è in grado di localizzare l'area di testo, anche se restituisce più di un riquadro di delimitazione.

Result of OpenCV 3 text detector.

noti che questo metodo non è infallibile (almeno questa implementazione in OpenCV con i parametri di default). Tende a generare falsi positivi, specialmente quando l'immagine di input contiene molti "distrattori". Qui ci sono altri esempi ottenuti utilizzando questo rilevatore di testo OpenCV 3 su Google Street View set di dati:

Negative result 1 Negative result 2 Negative result 3 Negative result 4

noti che si ha la tendenza a trovare "testo" tra le linee parallele (ad esempio, , finestre, pareti ecc.). Poiché l'immagine in ingresso dell'OP probabilmente contiene scene esterne, questo sarà un problema soprattutto se non limiterà la regione di interesse a una regione più piccola intorno ai segni dei LED.

Sembra che se si è in grado di localizzare una regione "approssimativa" contenente solo il testo (ad esempio, solo il segno LED nell'immagine di esempio dell'OP), l'esecuzione di questo algoritmo può aiutare a ottenere un riquadro di selezione più stretto. Ma dovrai affrontare i falsi positivi (magari scartando piccole regioni o raccogliendo tra i riquadri di delimitazione sovrapposti usando un euristico basato sulla conoscenza del modo in cui le lettere appaiono sui segni dei LED).

Qui ci sono più risorse (discussione + codice + set di dati) sul rilevamento del testo.

Codice

Dataset

Troverete le Streetview e MSRA set di dati di Google qui. Sebbene le immagini in questi set di dati non siano esattamente identiche a quelle dei segnali LED sui bus, possono essere utili sia per scegliere l'algoritmo di esecuzione "migliore" tra diversi algoritmi concorrenti, sia per formare un algoritmo di apprendimento automatico da zero.

http://www.iapr-tc11.org/mediawiki/index.php/Datasets_List

12

Come di OpenCV 3.0 (in dev attivo), è possibile utilizzare il modulo di rilevamento degli oggetti "text scena" built-in ~

La rilevazione di testo è costruito su questi due documenti:

Una volta individuato il testo nella scena, è possibile eseguire qualsiasi tipo di OCR standard contro tali sezioni (Tesseract OCR è comune). E c'è ora un campione end-to-end in OpenCV utilizzando la nuova interfaccia di OpenCV per Tesseract:

+0

Né riferimento né esempio sono disponibili –

+2

Hmm. Strano che abbiano spostato tutto. :/Aggiornamento di quello che posso. –

Problemi correlati