2011-05-10 7 views
10

Aşağıdaki resimde, her bir dikdörtgen için bir tane Rect dizisi algılayıp bulmaya çalışıyorum. Bunu C# nasıl yapabilirim?C# Görüntüdeki Dikdörtgenleri Tespit Et

Temel olarak, ekrandan alınan görüntüyü taramaya ve pencere dizisini ayrıştırmaya çalışıyorum.

(xloc, yloc, xsize, ysize) biçiminde olma rect İade edilen dizi: rectangles = ParseRects (image);

Image

+0

Güzel EVE Online ekran görüntüsü;) –

+0

@PicMickael). –

cevap

15

En iyi seçenek AForge.Net library kullanmak olacaktır.

Aşağıdaki kod, ShapeChecker sınıfının belgelerinden türetilmiştir ve daha fazla bilgi edinmek için belgelere bakmak isteyebilirsiniz.

static void Main(string[] args) 
{ 
    // Open your image 
    string path = "test.png"; 
    Bitmap image = (Bitmap)Bitmap.FromFile(path); 

    // locating objects 
    BlobCounter blobCounter = new BlobCounter(); 

    blobCounter.FilterBlobs = true; 
    blobCounter.MinHeight = 5; 
    blobCounter.MinWidth = 5; 

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

    // check for rectangles 
    SimpleShapeChecker shapeChecker = new SimpleShapeChecker(); 

    foreach (var blob in blobs) 
    { 
     List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blob); 
     List<IntPoint> cornerPoints; 

     // use the shape checker to extract the corner points 
     if (shapeChecker.IsQuadrilateral(edgePoints, out cornerPoints)) 
     { 
      // only do things if the corners form a rectangle 
      if (shapeChecker.CheckPolygonSubType(cornerPoints) == PolygonSubType.Rectangle) 
      { 
       // here i use the graphics class to draw an overlay, but you 
       // could also just use the cornerPoints list to calculate your 
       // x, y, width, height values. 
       List<Point> Points = new List<Point>(); 
       foreach (var point in cornerPoints) 
       { 
        Points.Add(new Point(point.X, point.Y)); 
       } 

       Graphics g = Graphics.FromImage(image); 
       g.DrawPolygon(new Pen(Color.Red, 5.0f), Points.ToArray()); 

       image.Save("result.png"); 
      } 
     } 
    } 
} 

orijinal giriş: original input

çıkan resim: Orada var enter image description here

+0

Hey! Aynı programı kullanarak neredeyse bu sonucu elde etmeyi başardım. Cevabını kabul ediyorum ama eğer vereceksen daha fazla girdi almak istiyorum, tüm renkleri filtrelemeyi düşünüyor musun, ama pencereleri daha iyi olur mu? Arkasında rastgele bir arkaplanı tanıtmam ve SADECE pencereleri tanıyabilmem gerekiyor. Düşüncelerin neler? –

+3

@Christian Tamamen dürüst olacağım: rastgele arka planlar zor olacak. Muhtemelen blob tespitini benim cevabımda kullanabilirsiniz, ancak arkaplan çıkarma işlemi kendi başına bir bilimdir. Sanırım bu rasgele arka plan animasyonlu, bu yüzden iki kare ve kullanmak için statik bir görüntü elde etmek için XOR alacağım. –

+0

@GregBuehler: BlobCounter sınıfı bazı Dll'den mi geliyor? eğer öyleyse, lütfen dll konumunu paylaşın .. Teşekkürler. –