2012-07-09 22 views
5

Tengo un código simple de escritura para recuperar el número de contornos en una imagen y obtener el número de contornos en la imagen. Pero siempre da una respuesta incorrecta. Por favor, ¿alguien puede explicar sobre esto?¿Número incorrecto de contornos en 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); 

    } 
} 

Ésta es la imagen de ejemplo que utilicé

enter image description here

Pero siempre devuelve código de salida como 8. favor, alguien puede explicar esto?

+0

Obtengo 19 en esta imagen, usando Python API. –

+0

@AbidRahmank ¿Tiene alguna idea sobre su significado? –

+1

Obtuve 19 porque, un límite de imagen completo, luego 9 límites externos y 9 límites internos de 9 cuadrados. Si hubieras invertido la imagen, tendrías 18, creo, porque el límite de la imagen habrá desaparecido. visita: http://opencvpython.blogspot.com/2012/06/hi-this-article-is-tutorial-which-try.html –

Respuesta

1

cvSeq.elem_size() devolverá el tamaño del elemento de secuencia en bytes y no el número de contornos. Es por eso que la salida es 8 cada vez. Consulte el siguiente enlace para obtener más información. http://opencv.willowgarage.com/documentation/dynamic_structures.html#cvseq

Para encontrar el número de contornos puede utilizar fragmento siguiente

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

Con los parámetros que usted ha proporcionado CV_RETR_EXTERNAL sólo proporcionará contorno exterior que es límite de la imagen en su imagen (siempre y cuando no se está invirtiendo la imagen) Puede usar CV_RETR_LIST para obtener todos los contornos. Visite el siguiente enlace para obtener más información sobre los parámetros. http://opencv.willowgarage.com/documentation/structural_analysis_and_shape_descriptors.html#findcontours

Cuestiones relacionadas