2012-07-11 27 views
7

Estoy desarrollando un proyecto en javacv y necesito saber cómo identificar la siguiente imagen y llenar esa imagen con un color particular?Cómo identificar y rellenar Contornos de forma en javacv?

trato de pasar por este question y esta es la imagen que utilizo

enter image description here

intento ir a través de este código y he desarrollado un código 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_highgui.*; 
import static com.googlecode.javacv.cpp.opencv_imgproc.*; 
import java.io.File; 
import javax.swing.JFileChooser; 

public class PolyGonIdentification { 
    public static void main(String[] args) { 
     CanvasFrame cnvs=new CanvasFrame("Polygon"); 
     cnvs.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 

     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 gry=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); 
     cvCvtColor(src, gry, CV_BGR2GRAY); 
     cvThreshold(gry, gry, 230, 255, CV_THRESH_BINARY_INV); 
     cvFindContours(gry, storage, squares, Loader.sizeof(CvContour.class), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); 
     System.out.println(squares.total()); 
     for (int i=0; i<squares.total(); i++) 
     { 
      cvDrawContours(gry, squares, CvScalar.ONE, CvScalar.ONE, 127, 1, 8); 
     } 
     IplConvKernel mat=cvCreateStructuringElementEx(7, 7, 3, 3, CV_SHAPE_RECT, null); 
     cvDilate(gry, gry, mat, CV_C); 
     cvErode(gry, gry, mat, CV_C); 
     cnvs.showImage(gry); 

    } 
} 

Mi el resultado final debería ser como esta imagen

enter image description here

Poner encima del código resultó este tipo de imagen. Por favor, ¿alguien puede ayudarme a resolver este problema?

enter image description here

Respuesta

1

puede archivar que el uso de este código

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_highgui.*; 
    import static com.googlecode.javacv.cpp.opencv_imgproc.*; 
    import java.io.File; 
    import javax.swing.JFileChooser; 

    public class Ishape { 
     public static void main(String[] args) { 
      CanvasFrame cnvs=new CanvasFrame("Polygon"); 
      cnvs.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); 

      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 gry=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1); 
      cvCvtColor(src, gry, CV_BGR2GRAY); 
      cvThreshold(gry, gry, 230, 255, CV_THRESH_BINARY_INV); 
      cvFindContours(gry, storage, squares, Loader.sizeof(CvContour.class), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); 
      CvSeq ss=null; 
      for (int i=0; i<1; i++) 
      { 
       cvDrawContours(gry, squares, CvScalar.WHITE, CV_RGB(248, 18, 18), 1, -1, 8); 
       ss=cvApproxPoly(squares, sizeof(CvContour.class), storage, CV_POLY_APPROX_DP, 8, 0); 
      } 
      IplConvKernel mat=cvCreateStructuringElementEx(7, 7, 3, 3, CV_SHAPE_RECT, null); 
      cvDilate(gry, gry, mat, CV_C); 
      cvErode(gry, gry, mat, CV_C); 
      cnvs.showImage(gry); 

     } 
    } 

Resultado

enter image description here

Esto se dio hacia fuera puesto y yo creo que esto podría ayudar a resolver su problema.

1

El código hace exactamente lo que se supone que debe hacer:

// as stated [in the answer to your previous question][1], findContours leaves gry set to 0, or black 
cvFindContours(gry, storage, squares, Loader.sizeof(CvContour.class), 
     CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); 

    System.out.println(squares.total()); // nothing interesting 

    for (int i = 0; i < squares.total(); i++) 
    { 
     // draw a gray contour (127) on a black image 
     cvDrawContours(gry, squares, CvScalar.ONE, CvScalar.ONE, 127, 1, 8); 
    } 

Para corregirlo, usted tiene que fijar juegos a 255 (blanco, antes de cualquier llamada a drawContours, y dibujar contornos negros ! que es 0, no 127.)

+0

Hay ¿podría explicar cómo acceder a los valores de Puntos de contornos encontrados? –

+0

Hay muchos ejemplos en los documentos y ejemplos de código. – Sam

1

Usted sólo tiene que encontrar el modo de recuperación de contornos utilizando externa:

CV_RETR_EXTERNAL retrives only the extreme outer contours 

En su situación, este es el mejor modo porque tiene un contorno externo y este contorno es lo que está buscando. Here's documantation.

Después de esto simplemente dibuje usando drawContours con CV_FILLED como parámetro de espesor para rellenar el polígono externo.

Cuestiones relacionadas