Finde verzerrtes Rechteck im Bild (OpenCV)

8

Ich suche nach dem richtigen Satz von Algorithmen, um dieses Bildverarbeitungsproblem zu lösen:

  • Ich habe ein verzerrtes Binärbild mit einem verzerrten Rechteck
  • Ich muss eine gute Annäherung der 4 Eckpunkte dieses Rechtecks ​​finden

Ich kann die Kontur mit OpenCV berechnen, aber da das Bild verzerrt ist, enthält es oft mehr als 4 Eckpunkte. Gibt es einen guten Approximationsalgorithmus (vorzugsweise mit OpenCV-Operationen), um die rechteckigen Eckpunkte mit dem Binärbild oder der Konturbeschreibung zu finden?

Das Bild sieht so aus:

Danke!

Dennis

    
Dennis Kempin 15.06.2011, 11:19
quelle

6 Antworten

5

Verwenden Sie die Funktion cvApproxPoly , um die Anzahl der Knoten Ihrer Kontur zu eliminieren, und filtern Sie dann die Konturen heraus, die vorhanden sind zu viele Knoten oder Winkel, die von 90 Grad stark abweichen. Siehe auch ähnliche Antwort

    
Andrey 15.06.2011, 12:48
quelle
2

etwas andere Antwort, siehe

Ссылка

    
plan9assembler 18.06.2011 12:52
quelle
1

Sehen Sie sich die opencv-Funktion ApproxPoly an. Es nähert sich einem Polygon aus einer Kontur.

    
Sammy 15.06.2011 12:44
quelle
1

Versuchen Sie Harris Corner Detector. Es gibt ein Beispiel im OpenCV-Paket. Sie müssen mit Params für Ihr Bild spielen.

Und sehen Sie sich andere OpenCV-Algorithmen an: Ссылка

    
red1ynx 15.06.2011 13:32
quelle
0

Ich würde versuchen, verallgemeinerte Hough-Transformation, es ist ein bisschen langsam, aber gut mit verzerrten / unvollständigen Formen.

Ссылка

    
Marek 15.06.2011 11:31
quelle
0
  1. Dies funktioniert auch, wenn Sie mit einigen Defekten beginnen, d. h. Ihr approxPolly-Aufruf gibt Pent / Hexagons zurück. Es wird jede Kontur, zB TransContours, auf ein Quad oder was auch immer Poly wünschen.
  2. vector<Point> cardPoly;// Quad storage
    int PolyLines = 0;//PolyPoly counter ;)
    double simplicity = 0.5;//Increment of adjustment, lower numbers may be more precise vs. high numbers being faster to cycle.
    while(PolyLines != 4)//Adjust this 
    {
        approxPolyDP(transContours, Poly, simplicity, true);
        PolyLines = Poly.size();
        simplicity += 0.5;
    }
    
Jash McCunn 26.06.2014 11:18
quelle