OpenCV在JAVA(Android)中绘制轮廓

时间:2017-05-18 12:35:46

标签: java android opencv

我试图在JAVA(Android)中绘制图像的轮廓但它似乎没有做任何事情(函数不能绘制任何东西)这里是代码:

  public Mat contours(Mat mat)
    {
        ArrayList<MatOfPoint> contours = new ArrayList<MatOfPoint>();
        Mat hierarchy = new Mat();

        Mat balele = new Mat();
        mat.convertTo(balele, CvType.CV_32SC1);
        // find contours:
        Imgproc.findContours(balele, contours, hierarchy, Imgproc.RETR_FLOODFILL, Imgproc.CHAIN_APPROX_SIMPLE);


        Mat source = new Mat(balele.size(), balele.type());
        for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++)
        {
            Imgproc.drawContours(source, contours, contourIdx, new Scalar(0,0,255), -1);
        }

        return source;
    }

当我们将mat图像传递给方法时,mat图像已经是二进制格式。

您是否发现任何错误?

更新: 我更新了代码,它看起来像这样:

公共垫轮廓(垫垫) {

ArrayList<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();

// find contours:
Imgproc.findContours(mat, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);
System.out.println(contours.size() + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");

Mat source = new Mat();
for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++)
{
    Imgproc.drawContours(source, contours, contourIdx, new Scalar(0,0,255), -1);
}

return source;

}

结果: ORIGINAL PICTURE

FINAL PICTURE

我仍然没有得到所有的轮廓,我得到一个浅白色。有任何纠正的想法吗?

2 个答案:

答案 0 :(得分:0)

Imgproc.findContours在内部更改创建工件的输入Mat,如上所示,您可以将Mat作为克隆对象传递,以便更改不会反映在输入{{ 1}}。我不确定是否存在更好的解决方案,因为克隆Mat肯定会有一些时间和空间(不是太多)。所以你可以使用:

Mat

答案 1 :(得分:0)

我发现了问题。这确实是 OpenCV 库中的一个错误。下面的代码正是 OpenCV 在 java 中实现 drawContours() 的方式。它总是使用包含 R、G、B 和 Alpha 的四个值标度。

http {
    upstream lbc {
        server localhost:5010;
        server localhost:5020;
    }
    server {
        listen 8090;
        location / {
            proxy_pass http://lbc;
        }
    }
}

现在,让我们考虑一下 alpha 的默认值是多少。零,对吗?这就是为什么你总是用黑色画画。解决方案是使用四个值标量,例如 new Scalar(0, 0, 255, 1)