工作关系,这一周对ocr进行了一下研究。这里进行一下总结
目前主流的技术有:1、tesseract-ocr
2、sikulix(其底层是tesseract-ocr,只是他的封装用起来很方便)
3、百度-ocr
在这里比较一下他们各自的优缺点和使用场景。
一、tesseract-ocr
tesseract-ocr 主要用来解决英语,数字的文字识别。从3.0开始才加入中文,它对中文的支持相当的不靠谱。如果要用它来识别中文的话,业务场景需要被识别的图片中的文字有相当的规律。因为它提供了训练的功能,可以让ocr不断进行学习。所以也可以用来处理简单的干扰不大的数字加字母的验证码。他还有一个有点是,不需要任何网络请求,直接可以在本机进行处理。最后,他是开源的。
环境搭建:需要安装tesseract-ocr,然后引入jai_imageio.jar和javacsv.jar。
java demo代码,其实原理很简单,通过cmd调用命令即可
private final static String LANG_OPTION = "-l"; //英文字母小写l,并非数字1
private final static String EOL = System.getProperty("line.separator");
private final static String tessPath = "C:\\Program Files (x86)\\Tesseract-OCR";
public static String getString(File imageFile, String imageFormat) throws Exception {
//File tempImage = ImgUtil.createImage(imageFile,imageFormat);
File outputFile = new File(imageFile.getParentFile(),"output");
StringBuffer strB = new StringBuffer();
List<String> cmd = new ArrayList<String>();
if(OS.isWindowsXP()){
cmd.add(tessPath+"//tesseract");
}else if(OS.isLinux()){
cmd.add("tesseract");
}else{
cmd.add(tessPath+"//tesseract");
}
cmd.add("");
cmd.add(outputFile.getName());
cmd.add(LANG_OPTION);
cmd.add("eng");
//cmd.add("eng");
ProcessBuilder pb = new ProcessBuilder();
pb.directory(imageFile.getParentFile());
cmd.set(1, imageFile.getAbsolutePath());
pb.command(cmd);
pb.redirectErrorStream(true);
Process process = pb.start();
System.out.println(cmd);
//tesseract.exe 1.jpg 1 -l chi_sim
int w = process.waitFor();
//删除临时正在工作文件
//tempImage.delete();
imageFile.delete();
if(w==0){
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(outputFile.getAbsolutePath()+".txt"),"UTF-8"));
String str;
while((str = in.readLine())!=nul