简体   繁体   中英

Pattern detection in an image with JavaCV

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:

在此输入图像描述

OUTPUT2 image:

在此输入图像描述


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

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.

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