Kante folgt mit der Kamera

9

Ich möchte der rechten Kante im folgenden Bild mit einer Linie folgen, die dem Roboter folgt.

Ich habe versucht, einfach "Schwellwert", aber leider enthält es den verschwommenen weißen Halo:

Der Grund, warum die Schwelle eine saubere Linie vom Sobel-Kantendetektor ist:

Gibt es einen guten Algorithmus, mit dem ich diese Kante isolieren / entlang dieser Kante bewegen kann? Der, den ich gerade benutze, scheint fehleranfällig zu sein, aber es ist der beste, den ich bisher herausgefunden habe.

Hinweis: Die Kante kann sich in jeder Richtung krümmen oder ausgerichtet sein, aber ein Punkt an der Kante wird immer sehr nahe an der Mitte des Bildes liegen. Hier ist ein Video von dem, was ich versuche zu tun. Es folgt nicht der Kante nach (1:35) richtig aufgrund des Halos, der die Schwelle hochschraubt.

Hier ist ein weiteres Beispiel:

Hier flute ich die Mitte der Kante, um sie von der kleinen Beule in der unteren rechten Ecke zu trennen:

    
Mateen Ulhaq 21.04.2016, 22:10
quelle

1 Antwort

1

Einfachste Methode (vertikale Linie)

Wenn Sie wissen, dass Ihr Bild auf der rechten Seite der Linie schwarz ist, ist hier eine einfache Methode:

1) Wenden Sie den Sobel-Operator an, um die erste Ableitung in x-Richtung zu finden. Das Ergebnis ist ein Bild, das am stärksten negativ ist, wenn Ihr Farbverlauf am stärksten ist. (Verwenden Sie eine große Kerngröße, um den Halo-Effekt auszugleichen. Sie können sogar zuerst eine Gaußsche Unschärfe auf das Bild anwenden, um noch mehr Mittelwerte zu erhalten, wenn der 7x7-Kernel nicht ausreicht.)

2) Suchen Sie für jede Zeile des Bildes den Index des kleinsten (d. h. am stärksten negativen) Wertes. Das ist Ihre Schätzung der Zeilenposition in dieser Zeile.

3) Mach was du willst damit. (Nehmen Sie vielleicht den Median dieser Linienpositionen in der oberen Hälfte und in der unteren Hälfte des Bildes, um eine Schätzung von 2 Punkten zu erhalten, die die Linie beschreiben.)

Etwas weiter fortgeschritten (willkürliche Linie)

Verwenden Sie dies, wenn Sie die Richtung der Linie nicht kennen, aber Sie wissen, dass es gerade genug ist, dass Sie es mit einer geraden Linie annähern können.

1)

%Vor%

Sie haben jetzt an jedem Punkt in Ihrem Bild den Winkel (im Bogenmaß) und die Stärke des Farbverlaufs.

2) Von hier aus können Sie grundlegende numpy Operationen verwenden, um die Linie zu finden: Filtern Sie die Punkte, um nur Punkte zu behalten, wo betragsgrößeSquared & gt; eine Schwelle. Dann greifen Sie den häufigsten Winkel (np.bincount () ist dafür nützlich). Jetzt weißt du den Winkel deiner Linie.

3) Filtern Sie die Punkte weiter, um nur Punkte zu behalten, die nahe an diesem Winkel liegen. Sie haben jetzt alle Punkte auf Ihrer Linie. Füge eine Linie durch die Koordinaten dieser Punkte.

Am weitesten fortgeschritten und spröde (willkürliche Kurve)

Wenn Sie wirklich mit einer Kurve umgehen müssen, gibt es eine Möglichkeit:

1) Verwenden Sie Ihre Methode oben, um das Bild zu schwellen. Stellen Sie den Schwellenwert manuell ein, bis die Weiß / Schwarz-Teilung ungefähr an der gewünschten Stelle erfolgt. (Wahrscheinlich ist 127 nicht der richtige Schwellenwert. Aber wenn Ihre Beleuchtungsbedingungen konsistent sind, können Sie möglicherweise einen Schwellenwert finden, der funktioniert. Vergewissern Sie sich, dass er über mehrere Bilder hinweg funktioniert.)

2) Verwenden Sie OpenCVs findcontours () , um eine Kurve anzupassen zur weiß / schwarzen Grenze. Wenn es zu abgehackt ist, verwenden Sie approxPolyDP () , um es zu vereinfachen.

    
Luke 22.04.2016, 23:22
quelle