我想使用OpenCV和C ++识别并提取下图中最大叶子的轮廓。
我将Canny边缘检测器应用于图像并得到以下结果。
Canny(img_src, img_edge_detected, 20, 60, 3);
现在我想从图像中提取最大轮廓(最大叶子)并绘制轮廓线,但这里的问题是最大叶子的边缘线不连续。所以我研究了dialate和morphological close,但是使用这些函数我无法获得良好的结果来提取区域。有没有办法在这样的图像中获得最大的轮廓?
请注意这里我不能使用模板匹配或任何掩盖类型的东西,因为我的最终目的是建立一个系统,用户可以上传图像并获取植物的种类。因此,系统对用户要上传的叶子的形状没有任何先验的想法。
如果有可能,请告诉我如何找到并绘制最大轮廓。
感谢。
答案 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;