简体   繁体   中英

How to identify and fill I shape Contours in javacv?

I'm developing project on javacv and I need to know how to identify following image and fill that Image using particular color ?

I try to go through this question and This is the image that I use

在此输入图像描述

I try to go through this code and I developed a code in 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 final result should be like this image

在此输入图像描述

Put above code resulted this kind of image. Please can some one help me to resolve this issue ?

在此输入图像描述

The code does exactly what is supposed to do:

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

To correct it, you have to set gry to 255 (white, before any call to drawContours, and draw black contours! that is 0, not 127.)

You just have to find contours using external retrieval mode:

CV_RETR_EXTERNAL retrives only the extreme outer contours

In your situation this is the best mode because you have one external contour and this contour is what you're looking for. Here's documantation.

After this just draw it using drawContours with CV_FILLED as thickness parameter to fill external polygon.

You can archive that using this code

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

        }
    }

Result

在此输入图像描述

This will be resulted out put and I believe this might help you to solve your problem.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM