4

I'm trying to create a code which should at the end recognize some pattern/shape in a picture.

I've had some trouble when I tried to draw the shape on the pic ("Output3" in this case). The program seems not to end. I think there is a infinite loop with the while function. The program doesn't display the output3. What's the issue?

INPUT image:

enter image description here

OUTPUT2 image:

enter image description here


public class Hello {

/**
 * @param args
 * @throws IOException 
 */

public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub

    // Memory storage
    CvMemStorage memory = CvMemStorage.create();
    CvSeq contours = new CvSeq(null);

    // Display original contour image .png, then GRAYSCALE and display in CanvasFrame
    IplImage image = cvLoadImage("contour.jpg", CV_LOAD_IMAGE_GRAYSCALE);   
    CanvasFrame canvas = new CanvasFrame("Output", 1);
    CanvasFrame canvas2 = new CanvasFrame("Output2", 1);
    CanvasFrame canvas3 = new CanvasFrame("Output3", 1);
    canvas.showImage(image);

    // thresholding
    cvSmooth(image, image, CV_BLUR, 9 , 9, 2, 2);
    cvThreshold(image, image, 155, 255, CV_THRESH_BINARY);

    cvCanny(image, image, 20*7*7, 40*7*7, 7);
    cvDilate(image, image, null, 1);


    canvas2.showImage(image);
    cvSaveImage("output2.jpg", image);

    // finding contours
    cvFindContours(image, memory, contours, Loader.sizeof(CvContour.class), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

    while(contours != null && !contours.isNull()) {
        if(contours.elem_size() > 0) {
            CvSeq approx = cvApproxPoly(contours, Loader.sizeof(CvContour.class), memory, CV_POLY_APPROX_DP, (int) cvContourPerimeter(contours)*0.02, 0);
            cvDrawContours(image, approx, CvScalar.BLUE, CvScalar.BLUE, -1,1, CV_AA);
        }
        contours.h_next();
    }

    canvas3.showImage(image);
}

My goal is to take a photo, send it to the program which should return:

  • This is a square
  • This is a rectangle
  • This is a circle
  • This is an hexagon
Slayer
  • 81
  • 7

1 Answers1

0

I don't use JavaCV, but here is what I would do:

  1. Conversion to gray level, or even better binary image (because the background is white)
  2. Connected component labeling in order to separate each shape
  3. Use shape index to classify the shapes. During my PhD I used shape indexes to distinguish rectangles, disks, triangles and parallelograms. You just have to had some measures to differentiate squares from rectangles, or disks from hexagons.
FiReTiTi
  • 5,597
  • 12
  • 30
  • 58