2014-12-29 147 views
1

我想繪製一個最大的輪廓,我正在實時處理每個相機的框架。 我的輸入圖像是手,我有一些限制 - 黑色背景,沒有鏡面光。OpenCV Android,繪製最大的輪廓,有點不對

我期望最大的輪廓要儘可能接近下面的圖像可在網上enter image description here

我的代碼如下,我剛纔提到很多樣,我幾乎一個想法,沒有什麼錯誤的,我碼。

 mRgba = inputFrame.gray(); 
     contours = new ArrayList<MatOfPoint>(); 
     mcontours = new ArrayList<MatOfPoint>(); 
     List<Mat> hull = new ArrayList<Mat>(contours.size()); 

     hierarchy = new Mat(); 
     Imgproc.Canny(inputFrame.gray(), mIntermediateMat, 50, 50); 
     Imgproc.findContours(mIntermediateMat, contours, hierarchy, 
       Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); 


     for (int idx = 0; idx != contours.size(); ++idx) 
     { 
      Mat contour = contours.get(idx); 
      double contourarea = Imgproc.contourArea(contour); 
      Log.i(TAG, "maxAreaIdx =" + idx + "contourarea = " + contourarea); 
      if (contourarea > maxArea) 
      { 
       maxArea = contourarea; 
       maxAreaIdx = idx; 
       Log.i(TAG, "maxAreaIdx =" + maxAreaIdx + "MaxArea = " + maxArea); 

      } 

     } 

     if(maxAreaIdx > 0 && maxAreaIdx < contours.size()) 
      mcontours.add(contours.get(maxAreaIdx)); 
     else 
      break; 

     Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2RGBA, 
       4); 
     hierarchy.release(); 
     Imgproc.drawContours(mRgba, mcontours, -1, CONTOUR_COLOR, -1); 

現在,我得到的只是這個的一小部分。我目前的理解是,OpenCV本身無法檢測到大的連續輪廓。請參考下面的圖片。

enter image description here

不僅如此,我測試了它的其他圖像一樣好,但我不知何故沒能獲得較大的大連續輪廓。

我在申請Canny時錯了嗎?有更好的技術嗎?我希望獲得手輪廓的輪廓。將來,我想將它與保存的類似輪廓數據庫進行比較。我在正確的軌道上嗎?

回答

0

試試這個:

List<MatOfPoint> mContours = new ArrayList<MatOfPoint>(); 
Mat hierarchy = new Mat(); 

//"tes" is binary image from threshold result  
Imgproc.findContours(tes, mContours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0,0)); 
    Mat overlay = contImg; //this is source image RGB 
    for(int i = 0; i < mContours.size(); i++) 
    { 
      Imgproc.drawContours(overlay, mContours, -1, red, 2); //draw contour 
    } 
    return overlay;    

希望這將有助於你