使用JavaCV进行图像模式检测

4
我正在尝试创建一段代码,最终目的是识别图片中的某种模式/形状。
当我尝试在图片上画出这个形状(在本例中为“Output3”)时遇到了一些麻烦。程序似乎无法结束。我认为while函数中存在无限循环。该程序未显示output3。问题出在哪里? 输入图片: enter image description here 输出2图片: 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

我不使用JavaCV,但这是我会做的:

  1. 将图像转换为灰度级别,或者更好的二值图像(因为背景是白色)
  2. 连接组件标记以分离每个形状
  3. 使用形状指数对形状进行分类。在我的博士期间,我使用形状指数来区分矩形、圆盘、三角形和平行四边形。您只需要添加一些措施来区分正方形和矩形,或者六边形和圆盘。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接