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
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:
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)
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist, wie ich schlage vor, Sie tun sollten, diese Aufgabe.
Gelten Sobel-Filter zu finden, die vertikalen Kanten.
Sobel(gray, dst, -1, 1, 0)
minAreaRect
jeder Kontur. Wählen Sie die Rechtecke basierend auf Seitenverhältnis und die minimale und maximale Fläche.adaptiveThreshold
und wenden Sie die OCR-Funktion.a) Ergebnis nach Schritt 5
b) Ergebnis nach Schritt 7. Grün sind alle
minAreaRect
s und die Roten sind diejenigen, die die folgenden Kriterien erfüllen: Aspect-Ratio-Auswahl (2,12) & Bereich (300,10000)c) Ergebnis nach Schritt 9. Ausgewählte Rechteck. Kriterien: Edge-Density - > 0.5
BEARBEITEN
Für Rand-Dichte, was ich in den obigen Beispielen ist die folgende.
Edge Density = Nein. Weiße Pixel in dem Rechteck/Total no. der Pixel in dem Rechteck
HINWEIS: Anstatt die Schritte 1 bis 3 können Sie auch mit dem Binär-Bild aus Schritt 5 für die Berechnung der edge density.
Hi! Bitte überprüfen Sie die bearbeitete Antwort. Bitte upvote und markieren Sie als Antwort, wenn es für Sie arbeitet. 🙂
Ja, ich übersprang die Schritte 1-4 (von Bearbeiten "Absatz") und Zwang Sie zu Schritt 5. Ich beschnitten, jeweils bezogen Rechteck (meist sind es 1-3 "möglich" - Platten) aus einem Bild ( adaptiveThreshold Matte object ). Dann zähle ich amout von weißen Pixeln (countNonZero) und die Summe der Pixel; got Dichte ( >= ~0.6++ - Dichte ist gut) und benötigt Rechteck. Tesseract hat job sowie auch (ich denke, ich werde das segment jedes einzelne Zeichen auf einer Platte für eine bessere Anerkennung in weiter, wie @Dan ratsam).
Froh, dass es geklappt hat!
InformationsquelleAutor Abdul Fatir
Eigentlich OpenCV hat, die vor-geschult-Modell speziell für die Russischen Nummernschilder: haarcascade_russian_plate_number
Gibt es auch open-source-ANPR-Projekt für die Russischen Nummernschilder: plate_recognition. Es ist nicht zu verwenden, tesseract, aber es hat ziemlich gute vor-trainierten neuronalen Netzes.
InformationsquelleAutor sibnick
InformationsquelleAutor RobAu