开头:对于这个图片识别的功能,其实我对他的一个评价就是,食之无味,弃之可惜,识别中文比较困难,只能识别一些很少的文字,我在本地最多只能成功识别两个字,三个字都会识别不出来,识别出来的东西很low,根本没法用,但是英文识别还可以,比中文识别会好很多;
3个字中文识别模板:
识别出来的文字:
完全没法用
如果大家还是需要使用这个,就可以接着往下看了
第一步,在电脑上安装 Tesseract-OCR
安装包地址
https://digi.bib.uni-mannheim.de/tesseract/
我这里安装的是 tesseract-ocr-setup-3.05.01.exe,因为我安装最新安装包时会出现错误,然后在安装的时候会下载一些文件,然后我在下载的时候开了一个代理,如果不开,速度可能会比较慢。
第二步,配置环境变量
变量名:TESSDATA_PREFIX
再在Path里面配置这个:
做到这里,Tesseract-OCR 差不多就已经安装完毕了;
打开命令行工具,输入 tesseract -v,如果出现下面这个,表示安装成功:
第三步,编写代码
@RestController
public class OCRController {
@PostMapping("/extractText")
public String extractTextFromImage(@RequestParam("file") MultipartFile file) {
try {
String srImage = convertMultipartFileToFile(file);
System.err.println(srImage);
File imageFile = new File(srImage);
if (!imageFile.exists()) {
return "图片不存在";
}
BufferedImage textImage = ImageIO.read(imageFile);
textImage = ImageHelper.convertImageToGrayscale(textImage);// 黑白处理
// textImage = textImage.getSubimage(0,0,300,80);//截图图片
textImage = ImageHelper.getScaledInstance(textImage, textImage.getWidth() * 10, textImage.getHeight() * 10);//放大图片识别
// Tesseract instance = Tesseract.getInstance();
Tesseract instance = new Tesseract();
instance.setDatapath("D:\\Java\\tess-OCR\\Tesseract-OCR\\tessdata");//设置训练库
// if (true)
instance.setLanguage("chi_sim");//中文识别
String result = null;
result = instance.doOCR(textImage);
// result = instance.doOCR(imageFile);
System.out.println(result);
return result;
} catch (Exception e) {
e.printStackTrace();
return "识别失败";
}
}
// 辅助方法:将MultipartFile转换为File
private String convertMultipartFileToFile(MultipartFile file) throws IOException {
if (!file.isEmpty()) {
try {
// 创建一个保存文件的目录
String uploadDir = "E:\\temporaryFile";
// 获取文件的原始名称
String originalFilename = file.getOriginalFilename();
// 构建目标文件对象
File destFile = new File(uploadDir + File.separator + originalFilename);
// 保存文件
file.transferTo(destFile);
// 文件已经保存在目标文件中,你可以在destFile对象中获取文件的路径
String filePath = destFile.getAbsolutePath();
// 打印文件路径
System.out.println("文件保存路径:" + filePath);
// 在这里可以进行其他操作,比如数据库记录等
return filePath;
} catch (IOException e) {
e.printStackTrace();
return "上传文件错误2";
}
} else {
return "上传文件错误"; // 重定向到上传失败页面
}
}
}
做到这里,一个很简单的图片识别就已经完成了,但是,在实际的开发中,使用这个还是有很大的限制,比如说,如果想要使用这个图片识别的功能,就算是识别英文,但是,使用方需要在本地安装 Tesseract-OCR,这对于用户的体验并不友好,所以,这个功能在实际开发中基本上不会使用。如果大家有更好的,开源的一些图片识别的方法,欢迎大家在评论区留言。。。