2012-03-20 4 views
5

AForge.NETを使用して画像全体の太い白線を検出しようとしています。AForge.NETホワイトブロブの検出

スレッショルドフィルタを適用した後、私が得ているパイプのようなものです。

私は形を検出する方法を知っていますが、私はすでにそれをやっていますが、エッジがなく円ではないので、どの形状でも一致しません。

私は正三角形を検出するためのサンプルコードを持っていますが、それが適切かどうかわかりません。

public void DetectQuadrilateralType(Bitmap bitmap) 
    { 
     BlobCounter blobCounter = new BlobCounter(); 
     blobCounter.ProcessImage(bitmap); 
     Blob[] blobs = blobCounter.GetObjectsInformation(); 
     //Graphics object to draw 
     Pen pen; 
     Graphics g = Graphics.FromImage(bitmap); 
     SimpleShapeChecker shapeChecker = new SimpleShapeChecker(); 

     for (int i = 0; i < blobs.Length; i++) 
     { 
      List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blobs[i]); 
      List<IntPoint> corners; 

      if (i < edgePoints.ToArray().Length && i > -1) 
      { 
       try 
       { 
        if (shapeChecker.IsConvexPolygon(edgePoints, out corners)) 
        { 
         PolygonSubType subType = shapeChecker.CheckPolygonSubType(corners); 

         pen = new Pen(colors[subType], 2); 
         g.DrawPolygon(pen, ToPointsArray(corners)); 
         pen.Dispose(); 
        } 
       } 
       catch (Exception e) { } 
      } 
     } 
     g.Dispose(); 
    } 

ここで私は誰もが私はAForgeとその白いブロブを検出あるいはC#の/を使用することができますどのように任意のアイデアを持っている場合

http://i206.photobucket.com/albums/bb29/cheater1034/pipe.png

を検出しようとしているイメージがあります。私は「NET O

上記のコードはエッジのみを検出するため、エッジが鋭い場合は検出されませんが、ほとんどそのようなことはありません。

EDIT

私は一種のそれは次のような方法で作業している

public void DetectBigBlobs(Bitmap bitmap) 
    { 
     BlobCounter blobCounter = new BlobCounter(); 
     blobCounter.ProcessImage(bitmap); 
     Rectangle[] rects = blobCounter.GetObjectsRectangles(); 
     //Graphics object to draw 
     Pen pen = new Pen(Color.Red, 2); 
     Graphics g = Graphics.FromImage(bitmap); 

     foreach (Rectangle rect in rects) 
     { 
      if (rect.Width > 200 && rect.Height > 150) 
      { 
       g.DrawRectangle(pen, rect); 
      } 
     } 

     pen.Dispose(); 
     g.Dispose(); 
    } 

答えて

0

あれば(彼らは大きく異なる可能性があるため)、固定幅を使用するよりも良い方法があるに違いありませんあなたはこのコードを使用することができます表示されたブロブを取得したい

public void DetectBigBlobs(Bitmap bitmap) 
    { 
     BlobCounter blobCounter = new BlobCounter(); 

     Graphics g = Graphics.FromImage(bitmap); 

     //filtering the blobs before searching for blobs 
     blobCounter.FilterBlobs = true; 
     blobCounter.MinHeight = bitmap.Height/3; 
     blobCounter.MinWidth = bitmap.Width/3; 

     blobCounter.ProcessImage(bitmap); 
     Blob[] blobs = blobCounter.GetObjectsInformation(); 

     foreach (Blob b in blobs) 
     { 
      //getting the found blob edgepoints 
      List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(b); 
      //if you want to mark every edge point RED 
      foreach (IntPoint point in edgePoints) 
       bitmap.SetPixel(point.X, point.Y, Color.Red); 
      //if you want to draw a rectangle around the blob 
      g.DrawRectangle(Pens.Blue,b.Rectangle); 

     } 

     g.Dispose(); 
    } 

あなたが何か違うものをしたいのであれば私は尋ねます。私はできる限り手助けします:)

関連する問題