Sto cercando di sviluppare una semplice applicazione per PC per il riconoscimento delle targhe (Java + OpenCV + Tess4j). Le immagini non sono molto buone (in più andranno bene). Voglio preelaborare l'immagine per tesseract e sono bloccato al rilevamento della targa (rilevamento rettangolo).Preelaborazione delle immagini con OpenCV prima di eseguire il riconoscimento dei caratteri (tesseract)
miei passi:
1) Fonte immagine
Mat img = new Mat();
img = Imgcodecs.imread("sample_photo.jpg");
Imgcodecs.imwrite("preprocess/True_Image.png", img);
2) Scala di grigi
Mat imgGray = new Mat();
Imgproc.cvtColor(img, imgGray, Imgproc.COLOR_BGR2GRAY);
Imgcodecs.imwrite("preprocess/Gray.png", imgGray);
3) Controllo sfocatura
Mat imgGaussianBlur = new Mat();
Imgproc.GaussianBlur(imgGray,imgGaussianBlur,new Size(3, 3),0);
Imgcodecs.imwrite("preprocess/gaussian_blur.png", imgGaussianBlur);
4) Soglia Adaptive
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);
Qui dovrebbe essere 5 ° passo, che è il rilevamento della regione di piastra (probabilmente anche senza raddrizzamento per ora).
ho croped zona necessaria da immagine (dopo il 4 ° passo) con Paint, ed ha ottenuto:
Poi ho fatto 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", "acekopxyABCEHKMOPTXY");
String result = instance.doOCR(imageFile);
System.out.println(result);
e ottenuto (abbastanza buono?) risultato - "Y841ox EH" (quasi vero)
Come è possibile rilevare e ritagliare la regione della piastra dopo il 4 ° passaggio? Devo apportare alcune modifiche (miglioramenti) in 1-4 passaggi? Vorrei vedere qualche esempio implementato tramite Java + OpenCV (non JavaCV).
Grazie in anticipo.
EDIT (grazie alla risposta di @Abdul Fatir) Beh, fornisco di lavoro (per me atleast) esempio di codice (Netbeans + Java + OpenCV + Tess4j) per chi interessato a questa domanda. Il codice non è il massimo, ma l'ho fatto solo per studiare.
http://pastebin.com/H46wuXWn (non dimenticate di mettere tessdata cartella nella cartella del progetto)
Si potrebbe provare ad analizzare i contorni. Tuttavia potrebbe essere più affidabile utilizzare un [classificatore a cascata] (http://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html) per individuare la targa (testare il proprio algoritmo con una macchina bianca e vedere come funziona). Allineare il piatto in modo che sia orizzonatale. Dovresti anche aggiungere una fase addizionale prima di tesseract - segmentare la targa in caratteri individuali (la proiezione verticale probabilmente funzionerà bene data la qualità della tua immagine) e darle solo a tesseract. –
Puoi postare l'immagine dopo il passo 4 come bene? Penso che dovresti essere in grado di rilevare il bordo della placca estraendo i contorni e filtrandoli sulle dimensioni e sul rapporto h/w. Se hai il contorno (dal momento che sai che è un rettangolo, puoi annullare la trasformazione di proiezione) – RobAu
@RobAu, Sì sicuro: http://i.imgur.com/chrNMYX.png – DocC