Próbuję opracować prostą aplikację na PC do rozpoznawania tablic rejestracyjnych (Java + OpenCV + Tess4j). Obrazy nie są naprawdę dobre (w dalszej kolejności będą dobre). Chcę wstępnie przetworzyć obraz dla tesseract i utknąłem na wykryciu tablicy rejestracyjnej (wykrywanie prostokąta).Przygotowanie obrazu z OpenCV przed wykonaniem rozpoznawania znaków (tesseract)
Moje kroki:
1) Źródło zdjęcia
Mat img = new Mat();
img = Imgcodecs.imread("sample_photo.jpg");
Imgcodecs.imwrite("preprocess/True_Image.png", img);
2) Skala szarości
Mat imgGray = new Mat();
Imgproc.cvtColor(img, imgGray, Imgproc.COLOR_BGR2GRAY);
Imgcodecs.imwrite("preprocess/Gray.png", imgGray);
3) Gaussian Blur
Mat imgGaussianBlur = new Mat();
Imgproc.GaussianBlur(imgGray,imgGaussianBlur,new Size(3, 3),0);
Imgcodecs.imwrite("preprocess/gaussian_blur.png", imgGaussianBlur);
4) adaptacyjnego progu
Mat imgAdaptiveThreshold = new Mat();
Imgproc.adaptiveThreshold(imgGaussianBlur, imgAdaptiveThreshold, 255, CV_ADAPTIVE_THRESH_MEAN_C ,CV_THRESH_BINARY, 99, 4);
Imgcodecs.imwrite("preprocess/adaptive_threshold.png", imgAdaptiveThreshold);
tu będzie 5-te etap, który jest wykrywanie obszarze części płytowej (prawdopodobnie nawet bez pochylenia teraz).
I croped potrzebne region z obrazem (po 4. etapie) z Paint, i otrzymała:
Potem zrobiłem OCR (poprzez tesserakt, tess4j):
File imageFile = new File("preprocess/adaptive_threshold_AFTER_PAINT.png");
ITesseract instance = new Tesseract();
instance.setLanguage("eng");
instance.setTessVariable("tessedit_char_whitelist", "acekopxyABCEHKMOPTXY");
String result = instance.doOCR(imageFile);
System.out.println(result);
i dostał (wystarczająco dobry?) wynik - "Y841ox EH" (prawie prawda)
Jak mogę wykryć i przyciąć region płytki po 4 kroku? Czy muszę wprowadzić pewne zmiany (poprawki) w 1-4 krokach? Chciałbym zobaczyć przykład implementowany przez Javę + OpenCV (nie JavaCV).
Z góry dziękuję.
EDIT (dzięki za odpowiedź @Abdul Fatir) Cóż, zapewniają pracę (dla mnie conajmniej) próbki kodu (Netbeans + Java + OpenCV + Tess4j) dla tych, którzy interesują się tym pytaniem. Kod nie jest najlepszy, ale zrobiłem to tylko dla nauki.
http://pastebin.com/H46wuXWn (nie zapomnij umieścić tessdata folderu do folderu projektu)
Możesz spróbować analizować kontury. Jednak bardziej wiarygodne może być użycie [klasyfikatora kaskadowego] (http://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html) w celu zlokalizowania tablicy rejestracyjnej (przetestuj swój algorytm za pomocą białego samochodu i Zobacz jak to działa). Wyrównaj płytę, aby była horyzontalna. Powinieneś również dodać dodatkową fazę przed tesseract - posegmentuj tablicę rejestracyjną na pojedyncze znaki (projekcja pionowa prawdopodobnie będzie dobrze działać, biorąc pod uwagę jakość twojego obrazu) i karm ją tylko dla tesseract .. –
Czy możesz opublikować zdjęcie po kroku 4 jako dobrze? Myślę, że powinieneś być w stanie wykryć granicę płyty poprzez wyodrębnianie konturów i filtrowanie ich na rozmiarze i proporcji h/w. Jeśli masz kontur (ponieważ wiesz, że jest to prostokąt, możesz cofnąć przekształcenie rzutowania) – RobAu
@RobAu, Tak, oczywiście: http://i.imgur.com/chrNMYX.png – DocC