2011-05-10 2 views
10

मैं नीचे दी गई छवि में प्रत्येक आयताकार के लिए रेक्ट्स का एक सरणी ढूंढने और प्राप्त करने के लिए देख रहा हूं। मैं इसे सी # में कैसे कर सकता हूं?सी # छवि में आयताकारों का पता लगाएं

असल में मैं स्क्रीन से ली गई छवि को स्कैन करने और विंडोज़ की सरणी को पार्स करने की कोशिश कर रहा हूं।

रेक्ट का कुछ रूप (xloc, yloc, xsize, ysize) लौटा हुआ सरणी: आयताकार = पारसेक्ट (छवि);

Image

+0

अच्छा EVE ऑनलाइन स्क्रीनशॉट तुम वहाँ है;) –

+0

@PicMickael;)। –

उत्तर

15

आपका सबसे अच्छा विकल्प AForge.Net library उपयोग करने के लिए किया जाएगा।

निम्नलिखित कोड ShapeChecker कक्षा के लिए प्रलेखन से लिया गया है, और आप स्वयं को परिचित करने के लिए दस्तावेज़ों को देखना चाह सकते हैं।

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

मूल इनपुट: original input

परिणामी छवि: enter image description here

+0

हे! मैं वास्तव में एक ही कार्यक्रम का उपयोग कर, लगभग इस परिणाम प्राप्त करने में कामयाब रहे। मैं आपका जवाब स्वीकार कर रहा हूं लेकिन अगर आप इसे देंगे तो मैं अधिक इनपुट प्राप्त करना चाहता हूं, क्या आपको लगता है कि सभी रंगों को फ़िल्टर करना है, लेकिन खिड़कियां बेहतर हैं? मुझे इसके पीछे एक यादृच्छिक पृष्ठभूमि पेश करने की ज़रूरत है और यह अभी भी विंडोज़ को पहचानने में सक्षम है। आपके क्या विचार हैं? –

+3

@ क्रिस्टियन मैं पूरी तरह से ईमानदार रहूंगा: यादृच्छिक पृष्ठभूमि कठिन होने जा रहे हैं। आप शायद मेरे उत्तर में ब्लॉब डिटेक्शन का उपयोग कर सकते हैं, लेकिन पृष्ठभूमि घटाव स्वयं में एक विज्ञान है। मुझे लगता है कि यह यादृच्छिक पृष्ठभूमि एनिमेटेड है, इसलिए मैं दो फ्रेम लेगा, और एक्सओआर उन्हें उपयोग करने के लिए एक स्थिर छवि प्राप्त करने के लिए। –

+0

@ ग्रेगबुहलर: ब्लॉब काउंटर क्लास कुछ डीएल से आ रहा है? यदि हां, तो कृपया डीएलएल स्थान साझा करें..धन्यवाद। –