Robiłem fajny projekt: rozwiązywanie Sudoku z obrazu wejściowego za pomocą OpenCV (jak w goglach Google itp.). I zadanie wykonałem, ale w końcu znalazłem mały problem, po który tu trafiłem.
Programowałem za pomocą Pythonowego API OpenCV 2.3.1.
Poniżej to, co zrobiłem :
- Przeczytaj obraz
- Znajdź kontury
- Wybierz ten z maksymalnym obszarem (i nieco równoważny kwadratowi) .
Znajdź punkty narożne.
Np. podane poniżej:
(Zauważ, że zielona linia prawidłowo pokrywa się z prawdziwą granicą Sudoku, więc Sudoku może być poprawnie zniekształcone. Sprawdź następny obraz)
zamień obraz do idealnego kwadratu
np. obraz:
Wykonaj OCR (dla którego użyłem metody, którą mam podane w Proste Rozpoznawanie Cyfr OCR w OpenCV-Pythonie )
A metoda zadziałała dobrze.
Problem:
Sprawdź ten obraz.
Wykonanie kroku 4 na tym obrazie daje następujący wynik:
Narysowana czerwona linia jest oryginalnym konturem, który jest prawdziwym zarysem granicy sudoku.
Narysowana zielona linia jest przybliżonym konturem, który zostanie zarys zniekształconego obrazu.
Która oczywiście jest różnica między zieloną a czerwoną linią na górnej krawędzi sudoku. Tak więc podczas wypaczania nie otrzymuję oryginalnej granicy Sudoku.
Moje pytanie:
Jak mogę zniekształcić obraz na prawidłowej granicy Sudoku, czyli czerwona linia LUB jak usunąć różnicę między czerwoną a zieloną linią? Czy jest na to jakaś metoda w OpenCV?