OpenCV删除较小的轮廓

时间:2014-07-02 14:37:45

标签: c++ opencv image-processing contour edge-detection

我想使用OpenCV和C ++识别并提取下图中最大叶子的轮廓。

enter image description here

我将Canny边缘检测器应用于图像并得到以下结果。

    Canny(img_src, img_edge_detected, 20, 60, 3);

enter image description here

现在我想从图像中提取最大轮廓(最大叶子)并绘制轮廓线,但这里的问题是最大叶子的边缘线不连续。所以我研究了dialate和morphological close,但是使用这些函数我无法获得良好的结果来提取区域。有没有办法在这样的图像中获得最大的轮廓?

请注意这里我不能使用模板匹配或任何掩盖类型的东西,因为我的最终目的是建立一个系统,用户可以上传图像并获取植物的种类。因此,系统对用户要上传的叶子的形状没有任何先验的想法。

如果有可能,请告诉我如何找到并绘制最大轮廓。

感谢。

2 个答案:

答案 0 :(得分:0)

你不能使用hsv颜色阈值来跟踪那个叶子,然后你可以直接使用minmaxloc函数来获得最大轮廓的区域。只是一个想法尝试这样做。它将work.good运气

答案 1 :(得分:0)

我将在java中做同样的事情请将其转换为c ++,这里BGR转换为HSV然后应用黄色,绿色和棕色与指定范围的组合,只需按位或按操作。它将使用opencv函数Core.findNonZero(Mat src,Mat dst)给你不是零像素;


    Imgproc.cvtColor(mRgba, mHSV, Imgproc.COLOR_BGR2HSV, 4);

    //Yellow
    Core.inRange(mHSV, new Scalar(25, 80, 80), new Scalar(36, 255, 255), yellow);
    //Green
    Core.inRange(mHSV, new Scalar(37, 80, 80), new Scalar(70, 255, 255), green);
    //Brown
    Core.inRange(mHSV, new Scalar(10, 80, 80), new Scalar(30, 200, 200), brown);

    // logical OR mask
    Core.bitwise_or(yellow, green, green);
    Core.bitwise_or(green, brown, mask);

    Imgproc.dilate(mask, mask, new Mat());

    // Find non zero pixels
    pts = Mat.zeros(mask.size(), mask.type());
    Core.findNonZero(mask, pts);

    return mask;