在执行字符识别之前使用 OpenCV 进行图像预处理(镶嵌)
我正在尝试开发用于车牌识别的简单PC应用程序(Java + OpenCV + Tess4j)。图像不是很好(进一步说它们会很好)。我想为镶嵌预处理图像,但我被困在车牌检测(矩形检测)上。
我的步骤:
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步,即检测板区域(甚至可能暂时没有纠偏)。
我用Paint从图像中裁剪了所需的区域(在第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”(几乎为真)
第四步后如何检测和裁剪板块区域?我是否需要在1-4个步骤中进行一些更改(改进)?希望看到一些通过Java + OpenCV(不是JavaCV)实现的示例。
提前致谢。
编辑(感谢@Abdul Fatir的回答)好吧,我为那些对这个问题感兴趣的人提供了工作(至少对我来说)代码示例(Netbeans+ Java + OpenCV + Tess4j)。代码不是最好的,但我只是为了学习而制作的。
http://pastebin.com/H46wuXWn(不要忘记将tessdata文件夹放入项目文件夹中)