2012-07-09 11 views
5

Ho scritto codice semplice per recuperare il numero di contorni in un'immagine e ottenere il numero di contorni nell'immagine. Ma dà sempre una risposta errata. Per favore qualcuno può spiegare questo?Numero errato di contorni su javacv?

import com.googlecode.javacpp.Loader; 
import com.googlecode.javacv.CanvasFrame; 
import static com.googlecode.javacpp.Loader.*; 
import static com.googlecode.javacv.cpp.opencv_core.*; 
import static com.googlecode.javacv.cpp.opencv_imgproc.*; 
import static com.googlecode.javacv.cpp.opencv_highgui.*; 
import java.io.File; 
import javax.swing.JFileChooser; 

public class TestBeam { 
    public static void main(String[] args) { 
     CvMemStorage storage=CvMemStorage.create(); 
     CvSeq squares = new CvContour(); 
     squares = cvCreateSeq(0, sizeof(CvContour.class), sizeof(CvSeq.class), storage); 
     JFileChooser f=new JFileChooser(); 
     int result=f.showOpenDialog(f);//show dialog box to choose files 
      File myfile=null; 
      String path=""; 
     if(result==0){ 
      myfile=f.getSelectedFile();//selected file taken to myfile 
      path=myfile.getAbsolutePath();//get the path of the file 
     } 
     IplImage src = cvLoadImage(path);//hear path is actual path to image 
     IplImage grayImage = IplImage.create(src.width(), src.height(), IPL_DEPTH_8U, 1); 
     cvCvtColor(src, grayImage, CV_RGB2GRAY); 
     cvThreshold(grayImage, grayImage, 127, 255, CV_THRESH_BINARY); 
     CvSeq cvSeq=new CvSeq(); 
     CvMemStorage memory=CvMemStorage.create(); 
     cvFindContours(grayImage, memory, cvSeq, Loader.sizeof(CvContour.class), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); 
     System.out.println(cvSeq.elem_size()); 
     CanvasFrame cnvs=new CanvasFrame("Beam"); 
     cnvs.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 
     cnvs.showImage(src); 
     //cvShowImage("Final ", src); 

    } 
} 

Questa è l'immagine di esempio che ho usato

enter image description here

ma il codice restituisce sempre output come 8. Per favore qualcuno può spiegare questo?

+0

ottengo 19 in questa immagine, utilizzando Python API. –

+0

@AbidRahmank Hai qualche idea sul suo significato? –

+1

Ho ottenuto 19 perché, un limite dell'immagine completo, quindi 9 confini esterni e 9 limiti interni di 9 quadrati. Se avessi invertito l'immagine, avresti 18 anni, perché il limite dell'immagine sarebbe sparito. visita: http://opencvpython.blogspot.com/2012/06/hi-this-article-is-tutorial-which-try.html –

risposta

1

cvSeq.elem_size() restituirà dimensioni dell'elemento sequenza in byte e non il numero di contorni. Ecco perché l'output è 8 ogni volta. Fare riferimento al seguente link per ulteriori informazioni. http://opencv.willowgarage.com/documentation/dynamic_structures.html#cvseq

Per trovare il numero di profili è possibile utilizzare seguente frammento

int i = 0; 
while(cvSeq != null){ 
i = i + 1; 
cvSeq = cvSeq.h_next(); 
} 
System.out.println(i); 

Con le richieste che ha fornito CV_RETR_EXTERNAL fornirà solo contorno esterno che è confine immagine nell'immagine (a condizione che non si sta invertendo l'immagine). Puoi usare CV_RETR_LIST per ottenere tutti i contorni. Visita il seguente link per maggiori informazioni sui parametri. http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html#findcontours