Wie kann man mit javacv ein Quadrat oder ein Rechteck mit variabler Länge und Breite identifizieren?

8

Ich entwickle Projekt mit Java, um Komponenten mit opencv Paket zu identifizieren, aber ich bin neu bei javacv und ich möchte nur wissen, wie man Rechtecke in einem bestimmten Quellbild identifizieren kann bitte einige Erfahrung Person geben einige grundlegende Richtlinie zu archivieren diese Aufgabe. Ich versuche hier den Template-Abgleich zu verwenden, aber es kann nur ein Rechteck mit exakter Größe identifizieren. Aber in meinem Fall muss ich Rechteck mit variabler Länge identifizieren?

%Vor%

Bitte kann jemand helfen, dies zu erreichen

    
Andrey Rubshtein 19.06.2012, 02:33
quelle

1 Antwort

9

(So ist es als Quadrat fixiert.)

Für die Square-Erkennung enthält OpenCV einige Beispiele dafür. Codes sind in C ++, C, Python. Ich hoffe, Sie können dies auf JavaCV portieren.

C ++ - Code , Python - Code .

Ich werde nur illustrieren, wie es funktioniert:

1 - Zuerst teilen Sie das Bild in die R-, G-, B-Ebenen.

2 - Führen Sie dann für jede Ebene die Kantenerkennung durch, und zusätzlich Schwelle für verschiedene Werte wie 50, 100, .... usw.

3 - Und in all diesen binären Bildern finden Sie Konturen finden (denken Sie daran, es verarbeitet eine Menge Bilder, so kann ein bisschen langsam sein, wenn Sie nicht wollen, können Sie einige entfernen Schwellenwerte).

4 - Nachdem Sie Konturen gefunden haben, entfernen Sie einige kleine unerwünschte Geräusche durch Filtern nach Bereich .

5 - Dann approximiere die Kontur . ( Mehr zur Konturenapproximation ).

6 - Für ein Rechteck erhalten Sie die vier Ecken. Für andere werden entsprechende Ecken angegeben.

Filtern Sie diese Konturen in Bezug auf die Anzahl der Elemente in der angenäherten Kontur, die vier sein sollte, was der Anzahl der Ecken entspricht. Erste Eigenschaft von Rechteck.

7 - Als nächstes gibt es einige Formen mit vier Ecken, aber keine Rechtecke. Also nehmen wir zweite Eigenschaft von Rechtecken, dh alle inneren Winkel sind 90 . So finden wir den Winkel an allen Ecken mit der folgenden Beziehung:

Und wenn cos (Theta) & lt; 0,1, dh Theta & gt; 84 Grad, das ist ein Rechteck.

8 - Was ist dann mit dem Platz? Verwenden Sie die Eigenschaft, dass alle Seiten gleich sind.

Sie können den Abstand zwischen zwei Punkten anhand der oben gezeigten Beziehung finden. Überprüfen Sie, ob alle gleich sind, dann ist das Rechteck ein Quadrat.

So funktioniert der Code.

Unten ist der Ausgang, den ich oben erwähnten Code auf einem Bild anwendete:

BEARBEITEN:

Es wurde gefragt, wie das an der Grenze erkannte Rechteck entfernt werden kann. Das liegt daran, dass opencv weiße Objekte in schwarzem Hintergrund findet, also auch Border. Wenn Sie einfach das Bild mit der Funktion cv2.bitwise_not () invertieren, wird das Problem gelöst. wir erhalten das Ergebnis wie folgt:

Hier finden Sie weitere Informationen zur Kontur: Konturen - 1: Erste Schritte

    
Abid Rahman K 19.06.2012, 15:15
quelle