2012-07-11 13 views
7

Pracuję nad projektem na javacv i muszę wiedzieć, jak rozpoznać następujący obraz i wypełnić obraz za pomocą określonego koloru?Jak rozpoznać i wypełnić I kształty Kontury w javacv?

staram się przejść przez ten question i jest to obraz, który używam

enter image description here

staram się przejść przez ten kod i opracowałem kod w 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); 

    } 
} 

My końcowy wynik powinien być podobny do tego zdjęcia:

enter image description here

Powyższy kod wygenerował tego rodzaju obraz. Czy ktoś może mi pomóc rozwiązać ten problem?

enter image description here

Odpowiedz

1

można archiwizować, że za pomocą tego kodu

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); 

     } 
    } 

Wynik

enter image description here

To będzie wynikał się położyć i wierzę, że to może pomóc w rozwiązaniu problemu.

1

Kod robi dokładnie to, co ma robić:

// 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); 
    } 

Aby to poprawić, trzeba ustawić gry do 255 (biały, przed każdym wywołaniu drawContours i rysować czarne kontury ! to jest 0, a nie 127.)

+0

Hay, proszę wyjaśnić, jak uzyskać dostęp do znalezionych wartości punktów konturu? –

+0

Istnieje wiele przykładów w dokumentach i próbkach kodu. – Sam

1

Po prostu trzeba znaleźć kontury za pomocą zewnętrznego trybu pobierania:

CV_RETR_EXTERNAL retrives only the extreme outer contours 

W twojej sytuacji jest to najlepszy tryb, ponieważ masz jeden kontur zewnętrzny i ten kontur jest tym, czego szukasz. Here's dokumantacja.

Po tym wystarczy narysować za pomocą drawContours z CV_FILLED jako parametr grubości, aby wypełnić zewnętrzny wielokąt.

Powiązane problemy