Ich machte ein lustiges Projekt: Lösen eines Sudoku aus einem Eingabebild mit OpenCV (wie in Google Goggles usw.). Und ich habe die Aufgabe abgeschlossen, aber am Ende habe ich ein kleines Problem gefunden, für das ich hierher gekommen bin.
Ich habe die Programmierung mit Python API von OpenCV 2.3.1 gemacht.
Unten habe ich getan:
- Lesen Sie das Bild
- Finden Sie die Konturen
- Wählen Sie die mit der maximalen Fläche aus (und auch etwas Äquivalent zum Quadrat) .
Finde die Eckpunkte.
zB unten angegeben:
(Beachten Sie hier, dass die grüne Linie korrekt mit der wahren Grenze des Sudoku übereinstimmt, sodass das Sudoku korrekt verzerrt werden kann. Nächstes Bild prüfen)
Bild zu einem perfekten Quadrat verzerren
zB Bild:
Führe OCR durch (für die ich die Methode verwendet habe, die ich habe gegeben in Simple Digit Recogn ition OCR in OpenCV-Python )
Und die Methode hat gut funktioniert.
Problem:
Sehen Sie sich dieses Bild an.
Das Ausführen von Schritt 4 auf diesem Bild ergibt das folgende Ergebnis:
Die gezeichnete rote Linie ist die ursprüngliche Kontur, die der wahre Umriss der Sudoku-Grenze ist.
Die gezeichnete grüne Linie ist die ungefähre Kontur, die es sein wird der Umriss des verzerrten Bildes.
Was natürlich ein Unterschied zwischen grüner und roter Linie am oberen Rand des Sudoku ist. Beim Verzerren erhalte ich also nicht die ursprüngliche Grenze des Sudoku.
Meine Frage:
Wie kann ich das Bild auf die korrekte Grenze von verzerren das Sudoku, also die rote Linie ODER wie kann ich den Unterschied zwischen roter und grüner Linie aufheben? Gibt es dafür eine Methode in OpenCV?