使用opencv在Android中绘制轮廓

时间:2017-08-03 09:24:29

标签: java opencv

我在Android中有代码处理图像并返回二进制图像。

  Imgproc.cvtColor(source, middle, Imgproc.COLOR_RGB2GRAY);
    Mat element  = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(15, 15), new Point(0, 0));
    Imgproc.morphologyEx(middle, middle, MORPH_TOPHAT, element, new Point(0, 0));
    Imgproc.threshold(middle, middle, 20, 255, Imgproc.THRESH_BINARY);

enter image description here

[enter image description here] [2

现在,我的要求是,我需要突出原始图像上的凹痕,而不是二进制图像。像这样:

enter image description here

我想到的是使用

   Core.findnonzero() 

获取凹痕的坐标,然后在原始图像上使用drawcontours。这只是一个想法。

我的问题是: 1.最好的方法是什么? 2.什么是matofpoint?

1 个答案:

答案 0 :(得分:0)

您可以在二进制图像上使用findContours() OpenCV函数(middle,如代码中所示),然后遍历列表中的顶级轮廓并在原始图像上绘制它们(源代码) )图像,就像这样:

List<MatOfPoint> contours = new ArrayList<>();
Mat hierarchy = new Mat();
Imgproc.findContours(middle, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);

// now iterate over all top level contours
for(int idx = 0; idx >= 0; idx = (int) hierarchy.get(0, idx)[0]) {
    MatOfPoint matOfPoint = contours.get(idx);
    Rect rect = Imgproc.boundingRect(matOfPoint);
    Imgproc.rectangle(originalImage, rect.tl(), rect.br(), new Scalar(0, 0, 255));
}