2012-03-20 14 views
5

Sto cercando di utilizzare AForge.NET per rilevare una spessa linea bianca su un'immagine.AForge.NET White Blob detection

È come un tubo che ottengo ed è il risultato desiderato dopo l'applicazione di un filtro Soglia.

So come rilevare le forme e lo sto già facendo, ma questo non corrisponde a nessuna forma poiché non ha bordi e non è un cerchio.

Ho codice di esempio da rilevare forme equilatero, ma non so se questo è rilevante.

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(); 
    } 

Ecco l'immagine che sto cercando di rilevare

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

Se qualcuno ha qualche idea di come posso rilevare che blob bianco con AForge o altrimenti utilizzando C# /. NET i' lo apprezzo davvero: O

Il codice sopra rileva solo i bordi, quindi rileverà la forma solo se ha un bordo tagliente, il che sarà raramente il caso.

EDIT

I sorta di averlo lavorare con il seguente metodo

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(); 
    } 

Ci deve essere un modo migliore di utilizzare larghezze fisse (perché possono variare grandemente)

risposta

0

se si desidera ottenere un blob contrassegnato è possibile utilizzare questo codice

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(); 
    } 

chiedimi se vuoi qualcosa di diverso ti aiuterò il più possibile :)