2014-02-26 81 views
2

我在Opencv中使用閾值來查找輪廓。我的輸入是一個手形象。有時門檻不好,所以我找不到輪廓。opencv中閾值的替代

我已經應用了以下的預處理步驟
1. Grabcut

cv::grabCut(image, result,rectangle,bgModel,fgModel, 3,cv::GC_INIT_WITH_RECT); 
  • 灰度變換

    cvtColor(handMat,handMat,CV_BGR2GRAY);

  • meadianblur

    medianBlur(handMat,handMat,MEDIAN_BLUR_K);

  • 我用下面的代碼中查找門檻

    threshold(handMat, handMat, 141, 255, THRESH_BINARY||CV_THRESH_OTSU); 
    

    有時我得到很好的輸出,有時閾值輸出是不好的。我附上了兩個輸出圖像。

    除了可以找到輪廓的閾值外,還有其他方法嗎?

    良好的閾值輸出:

    enter image description here

    壞門檻輸出

    enter image description here

    +0

    您是否將圖像轉換爲HSV色彩空間?看看下面的鏈接.. 1.http://stackoverflow.com/questions/12968576/opencv-skin-detection?rq = 1 2. http://stackoverflow.com/questions/8753833/exact-skin-color- hsv-range – G453

    +2

    'THRESH_BINARY || CV_THRESH_OTSU == 1'。你可能想說:'THRESH_BINARY | CV_THRESH_OTSU',但是,這兩個標誌都是異或 – berak

    +0

    你能不能顯示輸入圖像? – Rethunk

    回答

    1

    的一個問題是,試圖找到輪廓沒有二值化圖像。 如果您的輸入是彩色的,您可以嘗試更改色彩空間以增強手部和背景之間的差異。

    大津試圖找到一個最佳的閾值,你也可以嘗試手動設置它,但大津是有用的,因爲如果照度變化,閾值會自動適應。

    還有很多其他種類的二值化:Sauvola,Bradley,Niblack,Kasar ...但是Otsu很簡單,並且運作良好。如果你想提高二值化結果,我建議你做預處理或後處理。

    +0

    OpenCV函數是adaptiveThreshold:http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html –

    +0

    嗨,我已經更新了這個問題。請看一看。我已經使用了像1)Grabcut 2)灰度3)中等模糊的預處理技術。 – user2727765

    +0

    您是否嘗試使用Canny檢測邊緣?在Canny之後,您還可以嘗試使用[findContours](http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html)。 –

    5

    你試過adaptive threshold嗎?閾值的單值很少適用於實際應用。另一個真理 - 門限是非線性操作,因此非穩定。另一方面,漸變是線性的,所以如果背景是平滑且純色的,您可能需要通過跟蹤漸變來查找輪廓。漸變在照度變化或陰影中比閾值更可靠。

    搶切,順便說一下,使用顏色信息來提高邊界分割時,你已經發現 90%左右的段,所以它是一個後處理一步。此外,您用矩形切割的初始化會讓背景顏色產生大量污染。代替矩形,使用一個掩碼,您可以在您確定手所在的初始段深處標記爲GC_FGD;將GC_BGD標記在您確定背景所在的細分區域之外;在其他地方標記GC_PR_FGD或可能是前景 - 這將由grab cut進行改進。總結起來 - 抓鬥的初始化看起來像一個俄羅斯娃娃,有三層指示前景(灰色),可能是前景(白色)和背景(黑色)。您可以使用dilate and erode創建這些層,見下面

    enter image description here

    總的來說我的建議是定義你想先做些什麼。你在任意移動背景上尋找任意物體的輪廓嗎?如果你正在尋找一個手的輪廓在相對均勻的背景上找到手指,我會: 1. use connected componentsMSER分割出一隻手。使用保守面具進行初始化,而不是矩形,可能會改善結果! 2.如果這是您的目標,請使用convexity defects找到手指;