[Tutorial] Riconoscimento contorni in OpenCV
20 messaggi
• Pagina 1 di 1
[Tutorial] Riconoscimento contorni in OpenCV
Sul mio sito ho pubblicato un tutorial sul riconoscimento contorni utilizzando OpenCV e il linguaggio C++.
Il tutorial è disponibile qui: http://www.robot-home.it/Software/tutor ... ontour.php
Questo thread è a disposizione per chiunque voglia discutere l'argomento e risolvere i propri dubbi
Il tutorial è disponibile qui: http://www.robot-home.it/Software/tutor ... ontour.php
Questo thread è a disposizione per chiunque voglia discutere l'argomento e risolvere i propri dubbi
--------------------
......Myzhar......
...forum admin...
--------------------
......Myzhar......
...forum admin...
--------------------
-

Myzhar - Forum Admin
- Messaggi: 118
- Iscritto il: ven 6 mar 2009, 15:35
- Località: Marina di Massa
Re: Tutorial: Riconoscimento contorni in OpenCV
Ottimo, bel tutorial .
Perl: "Il linguaggio che rende facili le cose facili, e possibili quelle difficili" .
<<Coltiva GNU/Linux, tanto Windows si pianta da solo>>
<<Coltiva GNU/Linux, tanto Windows si pianta da solo>>
- evilmight
- Novello
- Messaggi: 26
- Iscritto il: dom 8 mar 2009, 11:20
- Località: Marsciano (PG)
Re: Tutorial: Riconoscimento contorni in OpenCV
grazie 
Se ti interessa la visione artificiale ti consiglio di dare un'occhiata a OpenCV.
Ti servirà molto per il futuro
Se ti interessa la visione artificiale ti consiglio di dare un'occhiata a OpenCV.
Ti servirà molto per il futuro
--------------------
......Myzhar......
...forum admin...
--------------------
......Myzhar......
...forum admin...
--------------------
-

Myzhar - Forum Admin
- Messaggi: 118
- Iscritto il: ven 6 mar 2009, 15:35
- Località: Marina di Massa
Re: Tutorial: Riconoscimento contorni in OpenCV
Sicuramente la visione artificiale è un argomento bell oquanto vasto. Sto già mettendo da parte dei tutorial sulle opencv XD
Perl: "Il linguaggio che rende facili le cose facili, e possibili quelle difficili" .
<<Coltiva GNU/Linux, tanto Windows si pianta da solo>>
<<Coltiva GNU/Linux, tanto Windows si pianta da solo>>
- evilmight
- Novello
- Messaggi: 26
- Iscritto il: dom 8 mar 2009, 11:20
- Località: Marsciano (PG)
Re: Tutorial: Riconoscimento contorni in OpenCV
Ciao a tutti!
Sapreste spiegarmi a cosa servono le funzioni BoundingRect e MatchContourTree ?
Sapreste spiegarmi a cosa servono le funzioni BoundingRect e MatchContourTree ?
- marduk
- Novello
- Messaggi: 29
- Iscritto il: dom 3 mag 2009, 10:11
Re: Tutorial: Riconoscimento contorni in OpenCV
Volentieri, ma prima apri un thread apposito in questa sezione (viewforum.php?f=23) con titolo "boundingRect e MatchContourTree" e posta lì le due domande.
Se in futuro qualcuno avrà i tuoi stessi "dubbi" sarà più facile per lui trovare risposte
Myzhar
Se in futuro qualcuno avrà i tuoi stessi "dubbi" sarà più facile per lui trovare risposte
Myzhar
--------------------
......Myzhar......
...forum admin...
--------------------
......Myzhar......
...forum admin...
--------------------
-

Myzhar - Forum Admin
- Messaggi: 118
- Iscritto il: ven 6 mar 2009, 15:35
- Località: Marina di Massa
Re: Tutorial: Riconoscimento contorni in OpenCV
Leggendo il codice di uno degli esempi di OpenCV ho notato la seguente istruzione: "img->width &= -(1<<level)" dove level e' un intero e width e' l'ampiezza di un'altra immagine.
Qualcuno sa cosa significa? (quella dopo width sarebbe una e commerciale).
Qualcuno sa cosa significa? (quella dopo width sarebbe una e commerciale).
- marduk
- Novello
- Messaggi: 29
- Iscritto il: dom 3 mag 2009, 10:11
Re: Tutorial: Riconoscimento contorni in OpenCV
Leggendo il codice di uno degli esempi di OpenCV ho notato la seguente istruzione: "img->width &= -(1<<level)" dove level e' un intero e width e' l'ampiezza di un'altra immagine.
Qualcuno sa cosa significa? (quella dopo width sarebbe una e commerciale).
L'istruzione può essere tradotta nel seguente modo:
img->width = img->width&(-(1<<level))
serve in pratica a rendere l'immagine divisibile per 2 N volte dove N è il numero di livelli.
Hai visto il codice sicuramente prima di una chiamata a cvPyrSegmentation
--------------------
......Myzhar......
...forum admin...
--------------------
......Myzhar......
...forum admin...
--------------------
-

Myzhar - Forum Admin
- Messaggi: 118
- Iscritto il: ven 6 mar 2009, 15:35
- Località: Marina di Massa
Re: Tutorial: Riconoscimento contorni in OpenCV
Si,infatti!
Grazie per il chiarimento.
Grazie per il chiarimento.
- marduk
- Novello
- Messaggi: 29
- Iscritto il: dom 3 mag 2009, 10:11
Re: Tutorial: Riconoscimento contorni in OpenCV
Io ho dei contorni disposti ad albero con CV_RETR_TREE. Ho chiamato "contours" il puntatore al primo contorno piu' esterno.E' possibile puntare direttamente all'ultimo contorno esterno (cioe' quello che si ottiene da contours->h_next->h_next........->h_next tale che il successivo h_next sia NULL)senza dover scorrere tutti gli h_next?
Perche' poi dovrei mettere in coda a quest'ultimo contorno esterno, altri contorni
(in modo che siano tutti dello stesso livello).
Per spiegarmi meglio,supposto di essere arrivati a contours(con contours->h_next==NULL),dovrei ottenere: CvSeq* contour_new1=contours->h_next;
CvSeq* contour_new2=contour_new1->h_next e cosi' via....
So che e' scocciante ma sono con l'acqua alla gola.
Perche' poi dovrei mettere in coda a quest'ultimo contorno esterno, altri contorni
(in modo che siano tutti dello stesso livello).
Per spiegarmi meglio,supposto di essere arrivati a contours(con contours->h_next==NULL),dovrei ottenere: CvSeq* contour_new1=contours->h_next;
CvSeq* contour_new2=contour_new1->h_next e cosi' via....
So che e' scocciante ma sono con l'acqua alla gola.
- marduk
- Novello
- Messaggi: 29
- Iscritto il: dom 3 mag 2009, 10:11
Re: Tutorial: Riconoscimento contorni in OpenCV
Per arrivare all'ultimo contorno devi fare un qualcosa di simile:
all'uscita dal while avrai in "last" il puntatore all'ultimo elemento più esterno
- Codice: Seleziona tutto
CvSeq* ptr=contours;
CvSeq* last;
while(ptr)
{
last=ptr;
ptr = ptr->h_next;
}
all'uscita dal while avrai in "last" il puntatore all'ultimo elemento più esterno
--------------------
......Myzhar......
...forum admin...
--------------------
......Myzhar......
...forum admin...
--------------------
-

Myzhar - Forum Admin
- Messaggi: 118
- Iscritto il: ven 6 mar 2009, 15:35
- Località: Marina di Massa
Re: Tutorial: Riconoscimento contorni in OpenCV
Grazie mille Myzhar!
Ti posso chiedere un'altra cosa?
Se creo una sequenza di contorni con cvCreateSeq e inserisco in essa dei contorni con cvSeqPush,e chiamo "seq" questa sequenza,posso disporre di seguito a "last" i contorni contenuti in "seq"?Cioe' come se fossero tutti dello stesso livello di last.
Ti posso chiedere un'altra cosa?
Se creo una sequenza di contorni con cvCreateSeq e inserisco in essa dei contorni con cvSeqPush,e chiamo "seq" questa sequenza,posso disporre di seguito a "last" i contorni contenuti in "seq"?Cioe' come se fossero tutti dello stesso livello di last.
- marduk
- Novello
- Messaggi: 29
- Iscritto il: dom 3 mag 2009, 10:11
Re: Tutorial: Riconoscimento contorni in OpenCV
Certo, puoi fare tutto quello che vuoi, basta che inizializzi la struttura dati nel modo che più ti conviene
--------------------
......Myzhar......
...forum admin...
--------------------
......Myzhar......
...forum admin...
--------------------
-

Myzhar - Forum Admin
- Messaggi: 118
- Iscritto il: ven 6 mar 2009, 15:35
- Località: Marina di Massa
Re: Tutorial: Riconoscimento contorni in OpenCV
Scusa ma non capisco come si fa ad inizializzare la sequenza per trattare i contorni come una successione monolivello.
- marduk
- Novello
- Messaggi: 29
- Iscritto il: dom 3 mag 2009, 10:11
Re: Tutorial: Riconoscimento contorni in OpenCV
Leggi la documentazione OpenCV nello specifico la spiegazione di CvSeq in cxcore.
Ti spiega per bene come è fatta la sequenza e tutti i tipi di sequenza che puoi fare.
Per fare una sequenza di contorni fatti di CvPoint puoi utilizzare questo comando:
Poi renderla monodimensionale o pluridimensionale dipende solo da come inserisci gli elementi.
Se inserisci gli elementi consecutivamente tramite cvSeqPush( CvSeq* seq, void* element=NULL ); la lista sarà monodimensionale e gli elementi inseriti li potrai scorrere tramite il codice che ti ho descritto prima
Ti spiega per bene come è fatta la sequenza e tutti i tipi di sequenza che puoi fare.
Per fare una sequenza di contorni fatti di CvPoint puoi utilizzare questo comando:
- Codice: Seleziona tutto
CvSeq* boxSeq = cvCreateSeq( CV_SEQ_CONTOUR, /* sequence of integer elements */
sizeof(CvSeq), /* header size - no extra fields */
sizeof(CvPoint), /* element size */
mStorage /* the container storage */ );
Poi renderla monodimensionale o pluridimensionale dipende solo da come inserisci gli elementi.
Se inserisci gli elementi consecutivamente tramite cvSeqPush( CvSeq* seq, void* element=NULL ); la lista sarà monodimensionale e gli elementi inseriti li potrai scorrere tramite il codice che ti ho descritto prima
--------------------
......Myzhar......
...forum admin...
--------------------
......Myzhar......
...forum admin...
--------------------
-

Myzhar - Forum Admin
- Messaggi: 118
- Iscritto il: ven 6 mar 2009, 15:35
- Località: Marina di Massa
Re: Tutorial: Riconoscimento contorni in OpenCV
Se creo una sequenza in questo modo:
cvFindContours( img4, storage, &contours, sizeof(CvContour),CV_RETR_TREE, CV_CHAIN_APPROX_NONE );
cvNamedWindow( "Componenti Connessi");
CvMemStorage* storage1 = cvCreateMemStorage(0);
CvSeq* seq;
for( ;contours!=NULL;contours=contours->h_next)
{
seq = cvCreateSeq( CV_SEQ_ELTYPE_GENERIC, sizeof(CvSeq), sizeof(CvSeq), storage1 );
cvSeqPush( seq, &contours );
cvDrawContours( img5, seq, CV_RGB(255,255,255), CV_RGB(255,255,255), 0, 1,4 );
cvShowImage( "Componenti Connessi", img5 );
}
Cosi' non sono inseriti uno di seguito all'altro?Perche' non visualizza nulla?
Ho letto in CXCORE la CvSeq ma dice che se si vuole "personalizzare" la sequenza bisogna aggiungere alla macro CV_SEQUENCE_FIELDS() i campi che interessano,pero' dentro la struttura typedef struct CvSeq{....}CvSeq.
Ho creato allora:
#define CV_CONTOUR\
CV_RETR_TREE. Appena ho provato ad aggiungerlo mi ha dato sempre errore.Boh
cvFindContours( img4, storage, &contours, sizeof(CvContour),CV_RETR_TREE, CV_CHAIN_APPROX_NONE );
cvNamedWindow( "Componenti Connessi");
CvMemStorage* storage1 = cvCreateMemStorage(0);
CvSeq* seq;
for( ;contours!=NULL;contours=contours->h_next)
{
seq = cvCreateSeq( CV_SEQ_ELTYPE_GENERIC, sizeof(CvSeq), sizeof(CvSeq), storage1 );
cvSeqPush( seq, &contours );
cvDrawContours( img5, seq, CV_RGB(255,255,255), CV_RGB(255,255,255), 0, 1,4 );
cvShowImage( "Componenti Connessi", img5 );
}
Cosi' non sono inseriti uno di seguito all'altro?Perche' non visualizza nulla?
Ho letto in CXCORE la CvSeq ma dice che se si vuole "personalizzare" la sequenza bisogna aggiungere alla macro CV_SEQUENCE_FIELDS() i campi che interessano,pero' dentro la struttura typedef struct CvSeq{....}CvSeq.
Ho creato allora:
#define CV_CONTOUR\
CV_RETR_TREE. Appena ho provato ad aggiungerlo mi ha dato sempre errore.Boh
- marduk
- Novello
- Messaggi: 29
- Iscritto il: dom 3 mag 2009, 10:11
Re: Tutorial: Riconoscimento contorni in OpenCV
Posso darti del salame?
seq = cvCreateSeq( CV_SEQ_ELTYPE_GENERIC, sizeof(CvSeq), sizeof(CvSeq), storage1 );
devi metterlo fuori dal for, altrimenti ad ogni iterazione del ciclo crei una NUOVA SEQUENZA buttando via tutto quanto inserito in precedenza... e una marea di memoria
seq = cvCreateSeq( CV_SEQ_ELTYPE_GENERIC, sizeof(CvSeq), sizeof(CvSeq), storage1 );
devi metterlo fuori dal for, altrimenti ad ogni iterazione del ciclo crei una NUOVA SEQUENZA buttando via tutto quanto inserito in precedenza... e una marea di memoria
--------------------
......Myzhar......
...forum admin...
--------------------
......Myzhar......
...forum admin...
--------------------
-

Myzhar - Forum Admin
- Messaggi: 118
- Iscritto il: ven 6 mar 2009, 15:35
- Località: Marina di Massa
Re: Tutorial: Riconoscimento contorni in OpenCV
E' vero,scusa.....
Pero' nonostante cio' si crea la finestra senza disegnare nulla
Pero' nonostante cio' si crea la finestra senza disegnare nulla
- marduk
- Novello
- Messaggi: 29
- Iscritto il: dom 3 mag 2009, 10:11
Re: Tutorial: Riconoscimento contorni in OpenCV
cvDrawContour fallisce se il tipo di sequenza non è CV_SEQ_CONTOUR.
Sostituisci CV_SEQ_ELTYPE_GENERIC con CV_SEQ_CONTOUR, vedrai che ti funziona tutto
Sostituisci CV_SEQ_ELTYPE_GENERIC con CV_SEQ_CONTOUR, vedrai che ti funziona tutto
--------------------
......Myzhar......
...forum admin...
--------------------
......Myzhar......
...forum admin...
--------------------
-

Myzhar - Forum Admin
- Messaggi: 118
- Iscritto il: ven 6 mar 2009, 15:35
- Località: Marina di Massa
Re: Tutorial: Riconoscimento contorni in OpenCV
Non funziona.
Comunque non ti preoccupare,non voglio rubarti altro tempo.
Grazie lo stesso per l'aiuto.
Comunque non ti preoccupare,non voglio rubarti altro tempo.
Grazie lo stesso per l'aiuto.
- marduk
- Novello
- Messaggi: 29
- Iscritto il: dom 3 mag 2009, 10:11
20 messaggi
• Pagina 1 di 1
Chi c’è in linea
Visitano il forum: Nessuno e 1 ospite
