簡體   English   中英

OpenCV刪除較小的輪廓

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM