python opencv - Bloberkennung oder Kreiserkennung

8

Ich habe Probleme, Kreisbereiche zu erkennen. Ich habe es mit der HoughCircles-Funktion von opencv ausprobiert. Obwohl die Bilder ziemlich ähnlich sind, müssen die Parameter für die Funktion unterschiedlich sein, um die Kreise zu erkennen.

Ein anderer Ansatz, den ich versuchte, war, über jedes Pixel zu iterieren und zu prüfen, ob das aktuelle Pixel weiß ist. Wenn dies der Fall ist, prüfen Sie, ob sich in dem Bereich ein Blob-Objekt befindet (Abstand zum Blob-Zentrum kleiner als ein Schwellenwert). Wenn dies der Fall ist, hängen Sie das Pixel an den Blob an, wenn nicht, erstellen Sie einen neuen Blob. Das hat auch nicht richtig funktioniert.

Hat jemand eine Idee wie ich das machen kann (90% Erkennung)? Ich befestigte ein Beispielbild und ein anderes Bild, wo ich die Kreise markierte. Danke!

UPDATE: Danke für die Hilfe bis jetzt! Dies ist der Code, wo ich die Konturen erhalte und sie nach Fläche filtere:

%Vor%

Das funktioniert ziemlich gut. Ich zeichnete sie auf das Bild:

Dies ist der Teil, bei dem ich nach Kreisförmigkeit gefiltert habe, er geht direkt unter den Code, wo ich nach Bereich filtern kann:

%Vor%

Die neue Liste 'contours_cirles' ist jedoch leer. Ich habe 'Kreisförmigkeit' in der Schleife gedruckt und die Werte liegen alle zwischen 10 000 und 100 000.

UPDATE # 2: Nach Korrektur der fehlenden Klammern funktioniert es jetzt!

%Vor%

Vielen Dank, Jungs! :)

    
cmplx96 13.02.2017, 12:19
quelle

2 Antworten

4

Als Ausgangspunkt können Sie beginnen mit:

  
  • Finde alle Konturen im gegebenen Bild mit cv2.findContours()
  •   
  • Iterate über jede Kontur:      
    • Berechnen Sie den Bereich, wenn der Bereich der Kontur in einem bestimmten Bereich liegt, sagen wir 70 < area < 150 . Dies filtert einige extrem kleinere heraus   große Konturen.
    •   
    • Nachdem Sie die Konturen mit dem Flächenschwellenwert gefiltert haben, müssen Sie die Anzahl der Kanten der Kontur prüfen, was mit folgenden Optionen geschehen kann:    cv2.approxPolyDP() , für einen Kreis len (approx) muss & gt; 8 aber & lt; 23. Oder du darfst   Wenden Sie einige ausgefeiltere Operationen an, um Kreise hier zu erkennen.
    •   
  •   

Sie sollten versuchen, diesen Ansatz zu implementieren und die Frage mit dem Code zu aktualisieren, den Sie fortan schreiben werden.

BEARBEITEN: Wie von @Miki vorgeschlagen, gibt es eine bessere und sauberere Methode, um zu erkennen, ob eine geometrische Form kreisförmig ist, mit circularity = 4pi (Fläche / Umfang ^ 2) , und einen Schwellenwert wie 0,9 zu bestimmen. um zu überprüfen, ob die Form kreisförmig ist. Für perfekten Kreis circularity == 1 . Sie können diese Schwelle nach Ihren Bedürfnissen anpassen.

Sie können arcLength konsultieren, um den Umfang der Kontur und KonturArea , um den Bereich der Kontur zu ermitteln, der zur Berechnung der Kreisform benötigt wird.

    
ZdaR 13.02.2017, 12:28
quelle
1

Wir könnten Hough Transformation auch versuchen, die Kreise im Bild zu erkennen und mit den Schwellenwerten zu spielen, um das gewünschte Ergebnis zu erhalten (erkannte Kreise in grünen Grenzlinien mit roten Punkten als Zentren):

%Vor%

    
Sandipan Dey 14.02.2017 06:04
quelle

Tags und Links