2012-03-20 51 views
5

Estoy tratando de utilizar AForge.NET para detectar una línea blanca gruesa en una imagen.AForge.NET Detección de Blob blanco

Es como la tubería que obtengo y es mi resultado deseado después de aplicar un filtro de umbral.

Sé cómo detectar formas y ya lo estoy haciendo, pero esto no concuerda con ninguna forma ya que no tiene bordes y no es un círculo.

Tengo código de muestra de la detección de formas equiláteras, pero no sé si eso es relevante.

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

Aquí es la imagen que estoy tratando de detectar

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

Si alguien tiene alguna idea de cómo puedo detectar que mancha blanca con AForge o de otra manera usando C# /. NET i' Realmente lo aprecio: O

El código anterior solo detecta los bordes, por lo que solo detectará la forma si tiene un borde afilado, lo que rara vez será el caso.

EDITAR

en cierto modo me he que trabajar con el siguiente método

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

Tiene que haber una mejor manera de utilizar anchos fijos (ya que pueden variar en gran medida)

Respuesta

0

si desea obtener un blob marcado, puede usar este código

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

pregúntame si quieres algo diferente voy a ayudar tanto como pueda :)