2016-05-23 2 views
0

Ich bin ein Projekt zu tun emgucv mit einfachen geometrischen Formen zu identifizieren. Ich verwende folgenden Code, um Pentagon-Formen zu identifizieren. aber wenn ich es ausführe, zeigt es auch Fünfecke und Kreise. Ich will nur Fünfecke als Ausgang. Ich habe bereits Kreise, Rechtecke und Dreiecke identifiziert. Wie werden nur Fünfecke mit diesem Code angezeigt?
Danke!Wie zu erkennen, Fünf- und Sechsecke in EmguCv

public Image<Bgr, Byte> My_Image; 
    public Image<Gray, Byte> grayImage; 
    public Image<Gray, Byte> cannyEdges;  

    grayImage = My_Image.Convert<Gray, byte>(); 



public void CannyEdgeDetection() 
     { 
      try 
      { 
       double cannyThresholdLinking = 120.0; 
       cannyEdges = grayImage.Canny(cannyThreshold, cannyThresholdLinking); 
       lines = cannyEdges.HoughLinesBinary(
        1, //Distance resolution in pixel-related units 
        Math.PI/45.0, //Angle resolution measured in radians. 
        20, //threshold 
        10, //min Line width 
        10 //gap between lines 
        )[0]; //Get the lines from the first channel 
      } 
      catch (Exception ex) 
      { 

       throw ex; 
      } 

     } 

    public void DetectPentagons() 
      { 

       try 
       { 

        CannyEdgeDetection(); 

        using (MemStorage storage = new MemStorage()) 
         for (
          Contour<Point> contours = cannyEdges.FindContours(
           Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, 
           Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL, 
           storage); 
          contours != null; 
          contours = contours.HNext) 
         { 
          Contour<Point> currentContour = contours.ApproxPoly(contours.Perimeter * 0.05, storage); 

          if (currentContour.Area > 100) 
          { 
           if (currentContour.Total == 5) 
           { 

            grayImage.Draw(contours, new Bgr(Color.Red), 10); 
            pictureBox2.Image = obj.grayImage.Bitmap; 
           } 
          } 
         } 

       } 

       catch (Exception ex) 
       { 
        throw ex; 
       } 

      } 
+0

Randbemerkung: 'catch (Exception ex) { Wurf ab; } 'ist als nutzlos schlimmer, weil es den Stack-Trace tilgt. Wenn Sie eine Ausnahme nicht sinnvoll behandeln, sollten Sie sie besser nicht abfangen - entfernen Sie einfach den try/catch-Block vollständig. Wenn Sie einen Haltepunkt in der Lage sein, dort zu setzen oder es oder etwas einzuloggen, dann rufen Sie einfach 'werfen,', 'nicht werfen ex', und der Stapel-Spur bleiben erhalten. – Blorgbeard

+0

ok habe es. Weißt du, wie man mit diesem Code nur Fünfecke anstelle anderer Formen anzeigt? – RuwanH

Antwort

0

Sie nicht auf der Anzahl der Segmente einer Kontur eine Form zu erkennen, verlassen sollten, da die Kontur (gezackt) aliased wird gefunden werden, und jede Polygon-Näherung („Glättung“) kann die Kontur zu viel ändern .

Ein Merkmal, das Sie verwenden können, Formen zu erkennen ist circularity. Kreisförmigkeit ist ein Faktor, der bestimmt, wie eng die Form zu einem Kreis ist.

circularity ~= 1, shape is a circle 
circularity < 1, shape is convex 
circularity > 1, shape is concave 

Die Formel dafür lautet:

circularity = (4 * PI * contour_area)/contour_perimeter^2 

Jede Form hat seine eigene erwartet Zirkularität Wert, zum Beispiel ein Quadrat mit einer Zirkularität von 0,7853 haben sollte, und Sie diesen Wert verwenden können Konturen filtern für Quadrate. Sie sollten jeden Wert über die FindContours-Methode verfügbar haben.