2012-03-20 11 views
5

Próbuję użyć AForge.NET do wykrycia grubej białej linii na obrazku.Wykrywanie białych plam AForge.NET

To jest jak rura, którą dostaję i jest moim pożądanym rezultatem po zastosowaniu filtru Progu.

Wiem, jak wykrywać kształty i robię to, już, ale to nie pasuje pod dowolnym kształtem, ponieważ nie ma krawędzi i nie jest okręgiem.

Mam przykładowy kod wykrywający kształty równoboczne, ale nie wiem, czy to istotne.

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

Oto obraz Próbuję wykryć

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

Jeśli ktoś ma jakiś pomysł jak mogę wykryć tę białą plamę z AForge lub w inny sposób przy użyciu C# /. NET i” naprawdę to doceniamy: O

Powyższy kod wykrywa tylko krawędzie, więc wykrywa kształt tylko wtedy, gdy ma ostry brzeg, co rzadko ma miejsce.

EDIT

I jakby się pracowało z następującym sposobem

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

Musi być lepszy sposób niż przy użyciu stałych szerokościach (ponieważ mogą one znacznie różnić)

Odpowiedz

0

jeśli chcesz uzyskać zaznaczony obszar blob, możesz użyć tego kodu:

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

zapytaj mnie, czy chcesz czegoś innego, pomogę ci jak tylko mogę :)

Powiązane problemy