首页 文章

OpenCV删除较小的轮廓

提问于
浏览
0

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

enter image description here

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

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

enter image description here

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

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

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

谢谢 .

2 回答

  • 0

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

  • 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;
    

相关问题