Bildvorverarbeitung mit OpenCV, bevor Sie Texterkennung (tesseract)

Ich versuche zu entwickeln, die einfache PC-Anwendung zur Nummernschilderkennung (Java + OpenCV + Tess4j). Bilder sind nicht wirklich gut (im weiteren werden Sie gut). Ich möchte Vorverarbeiten Bild für tesseract, und ich bin stecken geblieben auf der Erkennung der Lizenz-Platte (Rechteck-Erkennung).

Meine Schritte:

1) Quelle Bild

Bildvorverarbeitung mit OpenCV, bevor Sie Texterkennung (tesseract)

Mat img = new Mat();
img = Imgcodecs.imread("sample_photo.jpg"); 
Imgcodecs.imwrite("preprocess/True_Image.png", img);

2) Graustufen

Mat imgGray = new Mat();
Imgproc.cvtColor(img, imgGray, Imgproc.COLOR_BGR2GRAY);
Imgcodecs.imwrite("preprocess/Gray.png", imgGray);

3) Gaußscher Weichzeichner

Mat imgGaussianBlur = new Mat(); 
Imgproc.GaussianBlur(imgGray,imgGaussianBlur,new Size(3, 3),0);
Imgcodecs.imwrite("preprocess/gaussian_blur.png", imgGaussianBlur);  

4) Adaptive Threshold

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);

Hier sollte der 5. Schritt, die Erkennung der Platte-region (wahrscheinlich auch ohne Entzerrung bis jetzt).

Ich croped benötigt-region aus Bild (nach dem 4. Schritt) mit der Farbe, und bekam:

Bildvorverarbeitung mit OpenCV, bevor Sie Texterkennung (tesseract)

Dann habe ich mit OCR (via tesseract, tess4j):

File imageFile = new File("preprocess/adaptive_threshold_AFTER_PAINT.png");
ITesseract instance = new Tesseract();
instance.setLanguage("eng");
instance.setTessVariable("tessedit_char_whitelist", "acekopxyABCEHKMOPTXY0123456789");
String result = instance.doOCR(imageFile); 
System.out.println(result);

und bekam (gut genug?) Ergebnis - "Y841ox EH" (fast wahre)

Wie kann ich erkennen und Ernte-Platte, region nach der 4. Schritt? Habe ich einige änderungen (Verbesserungen) in 1-4 Schritte? Würde gerne einige Beispiel implementiert, die über Java + OpenCV (nicht JavaCV).
Vielen Dank im Voraus.

BEARBEITEN (danke an @Abdul Fatir Antwort)
Gut, ich arbeite (für mich wenigstens) code-Beispiel (Netbeans+Java+OpenCV+Tess4j) für diejenigen, die an dieser Frage interessiert. Code ist nicht der beste, aber ich machte es nur für ein Studium.
http://pastebin.com/H46wuXWn (vergessen Sie nicht tessdata Ordner in Ihrem Projekt-Ordner)

Sie könnten versuchen, die Analyse der Konturen. Aber es vielleicht sicherer sein ein cascade classifier suchen, um die Lizenz-Platte (testen Sie Ihren Algorithmus mit einem weißen Auto und sehen, wie es funktioniert). Das exakte ausrichten der Platte, so ist es liegenden. Sie sollten auch eine zusätzliche phase vor tesseract -- segment des Kennzeichens in einzelne Zeichen (vertikale Projektion wird wahrscheinlich gut funktionieren, angesichts der Qualität des Bildes) und ernähren sich nur diejenigen zu tesseract..
Kannst du das Bild nach Schritt 4? Ich denke, Sie sollten in der Lage sein, zu erkennen den Teller-Rand durch extrahieren von Konturen und filtern Sie nach Größe und h/w-Verhältnis. Wenn Sie die Kontur (da Sie wissen, es ist ein Rechteck, "rückgängig" können Sie die Projektions-transformation)
Ja sicher: i.imgur.com/chrNMYX.png

InformationsquelleAutor DocC | 2016-05-18

Schreibe einen Kommentar