[Tutorial] Riconoscimento contorni in OpenCV

Discussioni sulla libreria di Visione Artificiale Open Source creata da Intel e punto di riferimento per moltissimi programmatori

[Tutorial] Riconoscimento contorni in OpenCV

Messaggiodi Myzhar il sab 7 mar 2009, 14:11

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
--------------------
......Myzhar......
...forum admin...
--------------------
Avatar utente
Myzhar
Forum Admin
 
Messaggi: 118
Iscritto il: ven 6 mar 2009, 15:35
Località: Marina di Massa

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi evilmight il dom 8 mar 2009, 11:37

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>>
evilmight
Novello
 
Messaggi: 26
Iscritto il: dom 8 mar 2009, 11:20
Località: Marsciano (PG)

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi Myzhar il dom 8 mar 2009, 13:30

grazie :)
Se ti interessa la visione artificiale ti consiglio di dare un'occhiata a OpenCV.
Ti servirà molto per il futuro
--------------------
......Myzhar......
...forum admin...
--------------------
Avatar utente
Myzhar
Forum Admin
 
Messaggi: 118
Iscritto il: ven 6 mar 2009, 15:35
Località: Marina di Massa

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi evilmight il dom 8 mar 2009, 14:09

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>>
evilmight
Novello
 
Messaggi: 26
Iscritto il: dom 8 mar 2009, 11:20
Località: Marsciano (PG)

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi marduk il dom 3 mag 2009, 10:18

Ciao a tutti!
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

Messaggiodi Myzhar il dom 3 mag 2009, 10:32

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
--------------------
......Myzhar......
...forum admin...
--------------------
Avatar utente
Myzhar
Forum Admin
 
Messaggi: 118
Iscritto il: ven 6 mar 2009, 15:35
Località: Marina di Massa

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi marduk il gio 28 mag 2009, 19:07

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).
marduk
Novello
 
Messaggi: 29
Iscritto il: dom 3 mag 2009, 10:11

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi Myzhar il gio 28 mag 2009, 20:12

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...
--------------------
Avatar utente
Myzhar
Forum Admin
 
Messaggi: 118
Iscritto il: ven 6 mar 2009, 15:35
Località: Marina di Massa

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi marduk il gio 28 mag 2009, 20:16

Si,infatti! ;)
Grazie per il chiarimento.
marduk
Novello
 
Messaggi: 29
Iscritto il: dom 3 mag 2009, 10:11

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi marduk il gio 11 giu 2009, 14:40

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. :roll:
marduk
Novello
 
Messaggi: 29
Iscritto il: dom 3 mag 2009, 10:11

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi Myzhar il gio 11 giu 2009, 17:34

Per arrivare all'ultimo contorno devi fare un qualcosa di simile:
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...
--------------------
Avatar utente
Myzhar
Forum Admin
 
Messaggi: 118
Iscritto il: ven 6 mar 2009, 15:35
Località: Marina di Massa

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi marduk il gio 11 giu 2009, 18:07

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.
marduk
Novello
 
Messaggi: 29
Iscritto il: dom 3 mag 2009, 10:11

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi Myzhar il gio 11 giu 2009, 20:47

Certo, puoi fare tutto quello che vuoi, basta che inizializzi la struttura dati nel modo che più ti conviene
--------------------
......Myzhar......
...forum admin...
--------------------
Avatar utente
Myzhar
Forum Admin
 
Messaggi: 118
Iscritto il: ven 6 mar 2009, 15:35
Località: Marina di Massa

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi marduk il gio 11 giu 2009, 21:11

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

Messaggiodi Myzhar il gio 11 giu 2009, 21:51

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:
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...
--------------------
Avatar utente
Myzhar
Forum Admin
 
Messaggi: 118
Iscritto il: ven 6 mar 2009, 15:35
Località: Marina di Massa

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi marduk il ven 12 giu 2009, 15:22

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 :roll:
marduk
Novello
 
Messaggi: 29
Iscritto il: dom 3 mag 2009, 10:11

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi Myzhar il ven 12 giu 2009, 15:31

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
--------------------
......Myzhar......
...forum admin...
--------------------
Avatar utente
Myzhar
Forum Admin
 
Messaggi: 118
Iscritto il: ven 6 mar 2009, 15:35
Località: Marina di Massa

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi marduk il ven 12 giu 2009, 15:40

E' vero,scusa..... :D
Pero' nonostante cio' si crea la finestra senza disegnare nulla :cry:
marduk
Novello
 
Messaggi: 29
Iscritto il: dom 3 mag 2009, 10:11

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi Myzhar il ven 12 giu 2009, 15:56

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
--------------------
......Myzhar......
...forum admin...
--------------------
Avatar utente
Myzhar
Forum Admin
 
Messaggi: 118
Iscritto il: ven 6 mar 2009, 15:35
Località: Marina di Massa

Re: Tutorial: Riconoscimento contorni in OpenCV

Messaggiodi marduk il ven 12 giu 2009, 16:31

Non funziona.
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


Torna a Libreria OpenCv

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron