PDA

View Full Version : [c/c++ & OpenCV] riconoscimento oggetti da archivio immagini


andrea86re
04-05-2011, 09:55
Ciao a tutti,

Sono un ingegnere meccatronico e sto entrando solo adesso nel mondo del computer vision per necessità di integrare un "semplice" applicativo di object detection su un braccio robotico.

Quello che devo fare è, avendo a disposizine un archivio di immagini di oggetti da identificare (una immagine JPG per ogni oggetto, per esempio bottiglie di bibite), rilevare la posizione nell'immagine ottenuta dalla telecamera di ognuna di queste bottiglie, se presente.
Immagino che il problema sia di facile soluzione per chiunque con un minimo di esperienza, e spero che possiate darmi consigli e magari qualche link a codici esempio simili.

Il problema è molto più semplice di un face detector basato su classificatori, in quanto l'oggetto da rilevare è uno ed è definito da una singola immagine campione.

Grazie in anticipo

NA01
04-05-2011, 10:46
di che tipo di oggetti si tratta e in che ambiente ti aspetti di trovarli?

a meno che la luce, la vista e l'ambiente non siano controllati un problema di detection è tutto tranne che semplice (il fatto che l'esempio sia solo uno non migliora le cose).

Chiaramente poi la palla rossa su sfondo verde si trova facile facile :sofico:

andrea86re
04-05-2011, 11:11
Gli oggetti possono essere cartoni o bottiglie di bibite, mentre l'ambiente può essere vario, ma partirei da un armadio a mensole.
L'illuminazione rimane abbastanza costante (luogo interno con luce artificiale + luce naturale dalle finestre ma mai diretta).

Le variabili possono essere la distanza dell'oggetto dalla telecamera (comunque determinata tra un minimo ed un massimo) e la parziale rotazione dell'oggetto.

Non è una palla rossa su fondo verde :doh:

sottovento
04-05-2011, 14:03
Gli oggetti possono essere cartoni o bottiglie di bibite, mentre l'ambiente può essere vario, ma partirei da un armadio a mensole.
L'illuminazione rimane abbastanza costante (luogo interno con luce artificiale + luce naturale dalle finestre ma mai diretta).

Le variabili possono essere la distanza dell'oggetto dalla telecamera (comunque determinata tra un minimo ed un massimo) e la parziale rotazione dell'oggetto.

Non è una palla rossa su fondo verde :doh:

Se non ricordo male ci sono gia' degli esempi di riconoscimento nella directory di installazione di OpenCV. Hai dato un'occhiata? Normalmente trovi gia' quello che ti serve (sono sempre stato piuttosto fortunato :D ). Ci sono anche esempi di riconoscimento di persone, quindi dovresti trovare quello che ti serve.

C'e' anche un esempio di riconoscimento di un semplice rettangolo: nonostante la semplicita', ti mostra i vari passaggi che servono per arrivare al riconoscimento (miglioramento del contrasto, soglia, erosioni/dilatazioni, selezione delle aree, calcolo del perimetro e controllo della forma)

E poi... c'e' il sito di Flavio Bernardotti, puoi trovare quello che ti serve ed un aiuto (magari in italiano)

andrea86re
04-05-2011, 15:01
Ho guardato nella directory che dicevi e ho visto molti esempi a dir poco stuzzicanti!
Per quello che riguarda la mia applicazione, l'unica idea che mi viene è quella di prendere spunto dal camshift...

In realtà però io non devo fare il tracking di un oggetto su video, devo solo riconoscerlo all'interno di un contesto.

Stavo anche provando a realizzare un codice che giri attorno alla funzione cvmatchtemplate, però la cosa mi risulta molto ardua pensando alla distorsione dell'oggetto da riconoscere dovuta alla diversa posizione spaziale (quindi oggetto più grande o più piccolo del template) e alla semi-rotazione.

Farò qualche prova... Intanto grazie delle risposte! e qualunque idea/consiglio è ben accetta

NA01
04-05-2011, 20:20
non ho mai usato la parte di template matching, ma immagino che anche in quel caso un solo esempio non sia il massimo.

la parte di object detection che io sappia è tutta fatta per addestramento, sia che siano svm (il caso degli HOG con i pedoni), sia che sia adaboost (caso delle feature di Haar sulle facce).

Forse l'idea migliore è fare del matching con delle SIFT, in opencv dovrebbero esserci

andrea86re
04-05-2011, 20:36
Forse l'idea migliore è fare del matching con delle SIFT, in opencv dovrebbero esserci

Si infatti stavo parlando oggi con un collega e mi ha accennato proprio alla SIFT o SURF come possibile strada da seguire.. Non ho ancora ben chiaro di cosa si tratti, ma venerdì ci lavorerò un pò su...
Intanto grazie per la info.