2012-11-09 16 views
7

Ho un set di immagini binarie, su cui ho bisogno di trovare la croce (esempi in allegato). Io uso findcontours per estrarre i bordi dall'immagine binaria. Ma non riesco a capire come posso determinare se questa croce (di confine) forma o no? Forse opencv ha alcuni metodi incorporati, che potrebbero aiutare a risolvere questo problema. Ho pensato di risolvere questo problema usando Machine learning, ma penso che ci sia un modo più semplice per farlo. Grazie!Trovare croce sull'immagine

Cross on binary image

cross on binary image 2

risposta

2

Viola-Jones object detection potrebbe essere un buon inizio. Sebbene l'utilizzo principale dell'algoritmo (AFAIK) sia il rilevamento dei volti, è stato effettivamente progettato per qualsiasi rilevamento di oggetti, come il cross.

L'algoritmo è un algoritmo basato sull'apprendimento automatico (quindi, sarà necessario un set di "croci" classificate e un set di "non incrociati" classificati, e sarà necessario identificare le "caratteristiche" significative (schemi) questo aiuterà l'algoritmo a riconoscere le croci.

L'algoritmo è implementato in OpenCV come cvHaarDetectObjects()

0

A seconda delle esigenze, si potrebbe provare un po 'di rivelatore caratteristica locale come SIFT o SURF. Controlla OpenSURF che è un'implementazione interessante di quest'ultimo.

+0

ciò non funzionerebbe perché i diversi punti che si trovano sul bordo della linea incrociata avranno gli stessi descrittori SIFT. –

+0

Oh capisco ... quindi il cerchio intorno alla croce non è sempre presente? (entrambi gli esempi mostrano una croce all'interno di un cerchio) –

0

dopo alcuni giorni di lotta, sono giunto alla conclusione che l'unico modo valido qui è usare SVM + HOG. È tutto.

2

Dall'immagine originale, diciamo che hai estratto set di poligoni che potenzialmente potrebbero essere la tua croce. Supponendo che tutta la croce sia visibile, nella misura in cui tutti gli spigoli possono essere distinti come aventi una lunghezza, puoi provare quanto segue.

  • rifiutare tutti i poligoni che non hanno esattamente 12 i vertici necessari per formare poligono.

  • Riordinare i vertici in modo che la lunghezza del bordo più breve sia la prima.

  • Creare una misura migliore perspective transformation che mappa i tuoi vertici su una croce di dimensioni uniformi

  • Esaminare i residui generati utilizzando questa trasformazione per proiettare la tua croce indietro sulla croce divisa, dove il residuo per ogni punto è la distanza tra il punto proiettato e il punto uniforme corrispondente.

  • Se tutti i residui rientrano nella tolleranza definita, è stata trovata una croce.

Nota che questo funziona principalmente a causa della semplicità della forma geometrica che stai cercando. Anche i contorni dovranno essere rimossi dal rumore per far funzionare tutto ciò, ad es. ogni linea all'interno della croce deve essere convertita in una singola linea semplice.

0

È possibile erodere ciascun blob e analizzare il loro numero di pixel che sta diminuendo. Non importa il ridimensionamento della rotazione delle croci che dovrebbero sempre scendere con lo stesso rapporto, tranne quando stai chiudendo il centro rimanente. Di nuovo, quando il blob è abbastanza piccolo dovresti aspettarti che si trovi al centro del blob originale. Non è necessario alcun algoritmo di apprendimento automatico o dati di allenamento per risolvere questo problema.