2015-01-07 195 views
2

我需要在Emgu CV中實現框架,但是我沒有成功。 我有下面的網站上提到的一個代碼,但它不工作: Skeletonization using EmguCV ^]Emgu CV - EmguCV中的圖像框架(Skeletonization)

下面不工作這碼:

Image<Gray, Byte> eroded = new Image<Gray, byte>(img2.Size); 
    Image<Gray, Byte> temp = new Image<Gray, byte>(img2.Size); 
    Image<Gray, Byte> skel = new Image<Gray, byte>(img2.Size); 
    skel.SetValue(0); 
    CvInvoke.cvThreshold(img2, img2, 127, 256, 0); 
    StructuringElementEx element = new StructuringElementEx(3, 3, 1, 1, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_CROSS); 
    bool done = false; 

    while (!done) 
    { 
     CvInvoke.cvErode(img2, eroded, element,1); 
     CvInvoke.cvDilate(eroded, temp, element,1); 
     temp = img2.Sub(temp); 
     skel = skel | temp; 
     img2 = eroded; 
     if (CvInvoke.cvCountNonZero(img2) == 0) done = true; 
    } 

此代碼的工作,但在視頻很慢(連續的幀)

Image<Gray, byte> Skeleton(Image<Gray, byte> orgImg) 
    { 
     Image<Gray, byte> skel = new Image<Gray, byte>(orgImg.Size); 
     for (int y = 0; y < skel.Height; y++) 
      for (int x = 0; x < skel.Width; x++) 
       skel.Data[y, x, 0] = 0; 

     imageBoxOutputROI.Image = skel; 

     Image<Gray, byte> img = skel.Copy(); 
     for (int y = 0; y < skel.Height; y++) 
      for (int x = 0; x < skel.Width; x++) 
       img.Data[y, x, 0] = orgImg.Data[y, x, 0]; 

     StructuringElementEx element; 
     element = new StructuringElementEx(3, 3, 1, 1, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_CROSS); 
     Image<Gray, byte> temp; 

     bool done = false; 
     do 
     { 
      temp = img.MorphologyEx(element, Emgu.CV.CvEnum.CV_MORPH_OP.CV_MOP_OPEN, 1); 
      temp = temp.Not(); 
      temp = temp.And(img); 
      skel = skel.Or(temp); 
      img = img.Erode(1); 
      double[] min, max; 
      Point[] pmin, pmax; 
      img.MinMax(out min, out max, out pmin, out pmax); 
      done = (max[0] == 0); 
     } while (!done); 

     return skel; 
    } 

輸入圖像:

enter image description here

我需要一個幫助來實現骨架代碼。

的研究在下面的網站,但我不是腦水腫的成功: http://felix.abecassis.me/2011/09/opencv-morphological-skeleton/[ ^]

https://stackoverflow.com/questions/26850944/skeleton-of-an-image-in-emgucv[ ^]

https://stackoverflow.com/questions/26850944/skeleton-of-an-image-in-emgucv[ ^]

我感謝任何幫助。

Richard J. Algarve

+0

而你的輸入圖像? – kkuilla

+0

嗨,這是我的圖片https://dl.dropboxusercontent.com/u/80529956/EmguCV/skeleton.png –

+0

感謝您的支持 –

回答

3

請嘗試以下代碼。

它適用於我(我的輸入圖像有白色背景)。我認爲你的代碼的問題是Sub或者運營商。

public static Bitmap Skelatanize(Bitmap image) 
    { 
     Image<Gray, byte> imgOld = new Image<Gray, byte>(image); 
     Image<Gray, byte> img2 = (new Image<Gray, byte>(imgOld.Width, imgOld.Height, new Gray(255))).Sub(imgOld); 
     Image<Gray, byte> eroded = new Image<Gray, byte>(img2.Size); 
     Image<Gray, byte> temp = new Image<Gray, byte>(img2.Size); 
     Image<Gray, byte> skel = new Image<Gray, byte>(img2.Size); 
     skel.SetValue(0); 
     CvInvoke.Threshold(img2, img2, 127, 256, 0); 
     var element = CvInvoke.GetStructuringElement(ElementShape.Cross, new Size(3, 3), new Point(-1, -1)); 
     bool done = false; 

     while (!done) 
     { 
      CvInvoke.Erode(img2, eroded, element, new Point(-1, -1), 1, BorderType.Reflect, default(MCvScalar)); 
      CvInvoke.Dilate(eroded, temp, element, new Point(-1, -1), 1, BorderType.Reflect, default(MCvScalar)); 
      CvInvoke.Subtract(img2, temp, temp); 
      CvInvoke.BitwiseOr(skel, temp, skel); 
      eroded.CopyTo(img2); 
      if (CvInvoke.CountNonZero(img2) == 0) done = true; 
     } 
     return skel.Bitmap; 
    }