[英]OpenCV Remove smaller contours
我想使用OpenCV和C ++識別並提取以下圖像的最大葉子的輪廓。
我將Canny邊緣檢測器應用於圖像,並得到以下結果。
Canny(img_src, img_edge_detected, 20, 60, 3);
現在,我想從圖像中提取最大輪廓(最大葉子)並繪制輪廓線,但是這里的問題是最大葉子的邊緣線不連續。 因此,我檢查了撥號和形態學的緊密性,但是使用這些功能提取區域時效果不佳。 有什么方法可以在這種圖像中獲得最大的輪廓嗎?
請注意,在這里我不能使用模板匹配或任何掩蓋之類的東西,因為我的最終目的是建立一個系統,用戶可以在該系統上上傳圖像並獲取植物的種類。 因此,系統對於用戶要上傳的葉子的形狀沒有任何先驗想法。
如果可以的話,請告訴我如何找到並繪制最大輪廓。
謝謝。
您不能使用hsv顏色閾值追蹤僅跟蹤該葉子,然后可以立即使用minmaxloc函數來獲取最大輪廓的區域。只是一個主意嘗試這樣做,那樣就可以了。
我將在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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.