使用JavaCV在图像中检测图案

时间:2014-05-20 18:57:46

标签: java opencv image-processing detection javacv

我正在尝试创建一个代码,最终应该识别图片中的某些图案/形状。

当我尝试在pic上绘制形状时遇到了一些麻烦(在这种情况下为“Output3”)。 该计划似乎没有结束。我认为while函数有一个无限循环。 程序不显示output3。有什么问题?

INPUT图片:

enter image description here

OUTPUT2图片:

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

我的目标是拍照,将其发送到应该返回的程序:

  • 这是一个正方形
  • 这是一个矩形
  • 这是一个圆圈
  • 这是一个六边形

1 个答案:

答案 0 :(得分:0)

我不使用JavaCV,但我会这样做:

  1. 转换为灰度级,甚至更好的二进制图像(因为背景为白色)
  2. 连接组件标签以分隔每个形状
  3. 使用形状索引对形状进行分类。在我的博士学位期间,我使用形状索引来区分矩形,圆盘,三角形和平行四边形。您只需要采取一些措施来区分正方形与矩形,或磁盘与六边形。