【发布时间】:2016-09-15 02:05:08
【问题描述】:
我正在尝试开发用于车牌识别的简单 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 步,即检测车牌区域(现在可能甚至没有纠偏)。
我用 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”(几乎是真的)
如何在第 4 步后检测和裁剪板块区域?我是否需要分 1-4 个步骤进行一些更改(改进)?希望看到一些通过 Java + OpenCV(不是 JavaCV)实现的示例。
提前致谢。
编辑(感谢@Abdul Fatir 的回答)
好吧,我为那些对这个问题感兴趣的人提供了工作(至少对我来说)代码示例(Netbeans+Java+OpenCV+Tess4j)。代码不是最好的,但我只是为了学习而写的。
http://pastebin.com/H46wuXWn (别忘了把 tessdata 文件夹放到你的项目文件夹中)
【问题讨论】:
-
您可以尝试分析轮廓。然而,使用cascade classifier 来定位车牌可能更可靠(用白色汽车测试你的算法,看看它是如何工作的)。将板歪斜,使其水平。您还应该在 tesseract 之前添加一个额外的阶段——将车牌分割成单个字符(考虑到图像的质量,垂直投影可能会很好地工作)并且只将它们提供给 tesseract..
-
你能在第 4 步之后发布图片吗?我认为您应该能够通过提取轮廓并根据尺寸和 h/w 比过滤它们来检测板边界。如果你有轮廓(因为你知道它是一个矩形,你可以撤消投影变换)
-
@RobAu,当然:i.imgur.com/chrNMYX.png
标签: java opencv tesseract tess4j anpr