找到并消除opencv的轮廓

时间:2017-08-10 14:27:31

标签: java image opencv contour

我正在开发一个程序,它可以提取拼图上的贴纸,然后再找到它们的RGB。目前,我正处于我想删除任何不正确的轮廓的位置。喜欢。我想知道我怎么能做到这一点。

我所做的是加载图像,灰化图像,模糊图像,精确边缘检测,扩展轮廓并绘制它们。

有没有办法可以画出轮廓而不是填充它们?并删除大致相同大小或几乎90度角的轮廓?

public static void main(String[] args) {
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

    Mat capturedFrame = Imgcodecs.imread("first.png");

    //Gray
    Mat gray = new Mat();
    Imgproc.cvtColor(capturedFrame, gray, Imgproc.COLOR_BGR2GRAY);

    //Blur
    Mat blur = new Mat();
    Imgproc.blur(gray, blur, new Size(3,3));
    //Canny image
    Mat canny = new Mat();
    Imgproc.Canny(blur, canny, 20, 40, 3, true);

    Imgcodecs.imwrite("test.png", canny);

    //System.exit(0);
    Mat kernel = Imgproc.getStructuringElement(1, new Size(3,3));
    Mat dilated = new Mat();
    Imgproc.dilate(canny,dilated, kernel);

    List<MatOfPoint> contours = new ArrayList<>();
    //find contours
    Imgproc.findContours(dilated, contours, new Mat(), Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_NONE);
    //draw contours

    Imgproc.cvtColor(capturedFrame, capturedFrame, Imgproc.COLOR_BGR2RGB);
    for(int i = 0; i < contours.size(); i++){
        Imgproc.drawContours(capturedFrame, contours, i, new Scalar(0, 0, 255), -1);
    }

    Imgcodecs.imwrite("after.png", capturedFrame);

    Imshow img = new Imshow("firstImg");    
    img.show(capturedFrame);
}

这是初始图片:

enter image description here

以下是绘制轮廓的图像:

enter image description here

1 个答案:

答案 0 :(得分:1)

要绘制非填充轮廓,请使用非负厚度:Imgproc.drawContours(capturedFrame,contours,i,new Scalar(0,0,255),1);例如。

删除不必要的查找轮廓区域,并在绘图时跳过太大或太小。