ナンバー プレート認識用のシンプルな PC アプリケーション (Java + OpenCV + Tess4j) を開発しようとしています。画像はあまり良くありません (さらに良くなるでしょう)。tesseract の画像を前処理したいのですが、ナンバー プレートの検出 (長方形の検出) に行き詰まっています。
私の手順:
1) ソース画像
Mat img = new Mat();
img = Imgcodecs.imread("sample_photo.jpg");
Imgcodecs.imwrite("preprocess/True_Image.png", img);
2) グレースケール
Mat imgGray = new Mat();
Imgproc.cvtColor(img, imgGray, Imgproc.COLOR_BGR2GRAY);
Imgcodecs.imwrite("preprocess/Gray.png", imgGray);
3) ガウスぼかし
Mat imgGaussianBlur = new Mat();
Imgproc.GaussianBlur(imgGray,imgGaussianBlur,new Size(3, 3),0);
Imgcodecs.imwrite("preprocess/gaussian_blur.png", imgGaussianBlur);
4) 適応閾値
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);
これは、プレート領域の検出である(おそらく今のところデスキューなしでも)5番目のステップです。
ペイントを使用して (4 番目のステップの後) 画像から必要な領域を切り取り、次のように取得しました。
次に、OCRを行いました(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);
そして得られた(十分?)結果 - "Y841ox EH"(ほぼ真)
4 番目のステップの後にプレート領域を検出してトリミングするにはどうすればよいですか? 1 ~ 4 ステップで変更 (改善) を行う必要がありますか? Java + OpenCV (JavaCV ではない) を介して実装された例を見たいと思います。
前もって感謝します。
編集(@Abdul Fatirの回答に感謝)まあ、この質問に興味のある人のために、(少なくとも私にとっては)動作するコードサンプル(Netbeans + Java + OpenCV + Tess4j)を提供します。コードは最高ではありませんが、勉強のためだけに作成しました。
http://pastebin.com/H46wuXWn ( tessdataフォルダーをプロジェクト フォルダーに入れることを忘れないでください)