Erkennung mehrerer Objekte mit OpenCV

8

Ich versuche die Position im Bild sowohl der roten Wände als auch der weißen Quadrate im Bild unten von zwei weißen Wänden mit roten Spitzen und weißen "Pfosten" zu erkennen:

Meine Vorgehensweise bestand darin, eine Schwellwertsuche durchzuführen, um die roten Wände zu finden, die ich jetzt leicht an dieser Ausgabe erkennen kann:

Jetzt ist es mein Problem, die Positionen der weißen Quadrate zu erkennen, aber das ist schwieriger in Anbetracht der weißen Wände. Wenn ich einen Schwellenwert auf Weiß basierend habe, behalte ich immer noch die unerwünschten weißen Wände zwischen den weißen quadratischen Pfosten.

Jede Hilfe würde sehr geschätzt werden.

    
salgarcia 11.05.2013, 00:12
quelle

2 Antworten

15

Ein Ansatz besteht in thresholding dem Eingabebild mit cv::inRange() :

%Vor%

Ausgaben :

Wir können cv::findContours verwenden, um die Konturen des mit einem Schwellenwert versehenen Bildes abzurufen, um für sie Begrenzungsrahmen zu erstellen, Dies ist eine Technik, die hier beschrieben wird :

%Vor%

Ausgabe :

Alle Rechtecke, die im obigen Bild angezeigt werden, werden als cv::Rect Objekt im boundRect Vektor gespeichert. Jedes Rechteck besteht aus zwei gegenüberliegenden cv::Point -Objekten, sodass wir auf diesen Vektor iterieren um einen neuen Vektor zu erstellen, der nur aus cv::Point -Objekten besteht:

%Vor%

Die Logik zum Auffinden der weißen Quadrate lautet: Angenommen, 2 Pixel im Abstand von 25x25 definieren ein weißes Quadrat:

%Vor%

Ausgabe :

Dieser Algorithmus ist ziemlich roh und verfehlt die 2 weißen Quadrate an der Unterseite, da keine roten Wände unter ihnen sind, nur über ihnen.

Also überlasse ich es Ihnen, diesen Ansatz zu verbessern:)

Viel Glück.

    
karlphillip 11.05.2013, 06:47
quelle
1

Alle wichtigen Informationen in der Szene scheinen in dem binarisierten Bild der extrahierten roten Balken zu liegen. Ich würde versuchen, das ursprüngliche Bild für diesen Schritt zu ignorieren und nur die Geometrie der Rechtecke zu verwenden, um den Bereich zwischen ihnen zu finden.

Sie können beispielsweise findContours aufrufen, um sie zu erhalten die 8 Blobs in Ihrem Beispielbild. Wenn Sie Punkte auf einer Linie zwischen ihren Massenschwerpunkten prüfen, ist der Punkt, der einen minimalen Wert an pointPolygonTest zurückgibt, der Mittelpunkt eines der weißen Punkte (oder mindestens nahe).

Sie können bekannte Informationen über die Szene und die Bilder, auf die Sie stoßen, verwenden. Zum Beispiel könnten Sie die Konturen in "linke" und "rechte" Balken gruppieren und nur die Liniensuche zwischen bestimmten Konturen durchführen. Allerdings, wenn Sie mehr agnostisch sein müssen. Ihre Eingabe, Sie leiten mehr oder weniger alles (Szenenausrichtung, Anzahl der Wände, Dicke der Rechtecke ...) aus dem Schwellenwertbild sollte durchaus möglich sein.

    
FvD 11.05.2013 05:38
quelle