2012-07-02 16 views
5

Sto tentando di utilizzare la funzione findcontours() in OpenCV sull'immagine sottostante.OpenCV findcontours restituisce 2 contorni per ogni cerchio

findContours(img, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE, cvPoint(0,0));

Quando faccio questa domanda: contours.size() restituisce 18, in modo che sembra 2 contorno per ogni cerchio. I cerchi sono come si può vedere 1 pixel di spessore, come sono 2 contorni? È uno per esterno e uno per interno, se è così, come posso forzare questa funzione per rilevare un solo contorno per ogni cerchio? Ho pensato che un contorno fosse definito come una sequenza connessa di pixel, 1 pixel di spessore.

Says there are 18 contours!!

risposta

4

non posso confermare questo, ma credo che l'algoritmo utilizzato da questa funzione fa qualcosa di equivalente a calcolare la pendenza per ogni funzione. Ciò significa che ci sarà un contorno trovato sul bordo esterno e uno sul bordo interno, proprio come hai suggerito tu. A conferma di ciò, si può provare ad usare un'immagine in ingresso, dove i cerchi sono stati riempiti con il bianco (elimininating profilo interno)

si può anche provare con diversi parametri sui findContours funzionare

Ad esempio, provate utilizzando CV_RETR_EXTERNAL invece di CV_RETR_TREE suppongo che il cerchio interno è nidificato all'interno quella esterna, quindi questo dovrebbe costringerlo a restituire solo quelli esterni

+0

Ma quando guardo questo esempio [qui] (http://jmpelletier.com/a-simple-opencv-tutorial/) sembra che non stia contando separatamente l'interno e l'esterno. Ma l'esempio è la versione C dei findcontours. C'è una differenza tra le vecchie e le nuove implementazioni? –

+0

no, non dovrebbero esserci differenze tra la versione C e la versione C++ che influenzerebbero il risultato finale. Infatti da quello che ricordo, uno è solo un involucro per l'altro. Tuttavia, guardando le immagini da quel collegamento, vedo esattamente l'opposto di quello che hai detto. sembra che stia rilevando sia il contorno interno che quello esterno per ciascun cerchio, il che rende ancora più sensato l'immagine mostrata lì – Naps62

+1

In effetti, l'uso del flag CV_RETR_EXTERNAL dovrebbe risolvere il problema. Vedi qui per un elenco completo di flag: http://opencv.itseez.com/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#void findContours (InputOutputArray image, OutputArrayOfArrays contorni, OutputArray hierarchy, int mode, int metodo, Point offset) –

0

si potrebbe già capito questo, ma ...

findContours riguarda solo gli oggetti bianchi e quindi riconosce ciascun cerchio vuoto come una banda, quindi produce due contorni.

Il modo migliore è creare un'altra immagine con cerchi pieni e applicare findContoours per quell'immagine. Ti darà quello che vuoi.

Problemi correlati