OpenCV删除较小的轮廓 我想用OpenCV和C++来识别和提取下面图像最大叶的轮廓。

OpenCV删除较小的轮廓 我想用OpenCV和C++来识别和提取下面图像最大叶的轮廓。,c++,opencv,image-processing,contour,edge-detection,C++,Opencv,Image Processing,Contour,Edge Detection,我将Canny边缘检测器应用到图像中,得到了以下结果 Canny(img_src, img_edge_detected, 20, 60, 3); 现在我想从图像中提取最大轮廓(最大叶子)并绘制轮廓线,但这里的问题是最大叶子的边缘线不是连续的。因此,我查看了dialate和morphical close,但使用这些函数,我无法得到一个很好的结果来提取区域。有没有办法在这样的图像中获得最大的轮廓 注意,这里我不能使用模板匹配或任何掩蔽类的东西,因为我的最终目的是建立一个系统,用户可以上传

我将Canny边缘检测器应用到图像中,得到了以下结果

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

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

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

如果可能的话,请告诉我如何在这里找到并绘制最大的等高线


谢谢。

<你不能用HSV颜色阈值来追踪那个叶子,然后你可以直接使用MimxLoC函数来获得最大轮廓的面积。只是一个想法,试试这样做。它会工作。好运< < /P> < P>我在java中做的事情,请把它转换成C++。这里BGR转换HSV,然后在指定范围内应用黄色、绿色和棕色的组合,并简单地执行按位or操作。它将使用opencv函数Core.findNonZero(Mat src,Mat dst)为您提供非零像素

Imgproc.CVT颜色(mRgba、mHSV、Imgproc.COLOR_BGR2HSV,4); //黄色的 Core.inRange(mHSV,新标量(25,80,80),新标量(36,255,255),黄色); //绿色的 在范围内(mHSV,新标量(37,80,80),新标量(70,255,255),绿色); //棕色的 核心。在范围内(mHSV,新标量(10,80,80),新标量(30,200,200),棕色); //逻辑或掩码 核心。按位_或(黄色、绿色、绿色); 核心。按位_或(绿色、棕色、遮罩); Imgproc.扩张(面罩,面罩,新垫()); //查找非零像素 pts=Mat.zero(mask.size(),mask.type()); Core.findNonZero(掩码,pts); 返回掩码;
您是否先尝试按颜色进行聚类?至少在这个例子中,它是可行的。对我来说,只处理contour是不可能的,因为它们没有分开。谢谢你的回答。我没有尝试使用聚类,我只是尝试使用边缘检测,你能给我举一个聚类的好例子吗?我对图像处理不熟悉。正如@Mika所说,这确实是一个分割问题,你跳得太快了。你可以先假设感兴趣的叶子在图像中处于中心位置,然后使用分水岭或泛洪填充对其进行分割。你能解释一下如何在这里进行分割或聚类吗?@RogerRowland链接已断开。也许是有用的。 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;