java如何实现识别图片上的文字
1、概述
除了文本的敏感词识别,我们还会遇到识别图片上的问题,以及过滤敏感词的需求。
2、图片文字识别技术OCR
OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程。备选方案有以下几种:
我这里选用tess4J的方案。
3、tess4J方案示例
3.1、引入依赖
<dependency> <groupId>net.sourceforge.tess4j</groupId> <artifactId>tess4j</artifactId> <version>4.1.1</version> </dependency>
3.2、导入中文字体库
中文字体库下载链接 链接:https://pan.baidu.com/s/1oTJEK6lVpL0jgenKfmFbdg 提取码:epa8 下载后解压,把tessdata文件夹拷贝到指定的文件夹下,比如:D: essdata
3.3、封装tess4J图片识别工具类
在yml配置文件中添加tess4J的相关配置
tess4j: data-path: D: essdata language: chi_sim
@Getter @Setter @Component @ConfigurationProperties(prefix = "tess4j") public class Tess4jClient { private String dataPath; private String language; // 入参:图片流 public String doOCR(BufferedImage image) throws TesseractException { //创建Tesseract对象 ITesseract tesseract = new Tesseract(); //设置中文字体库路径 tesseract.setDatapath(dataPath); //中文识别 tesseract.setLanguage(language); //执行ocr识别 String result = tesseract.doOCR(image); //替换回车和tal键 使结果为一行 result = result.replaceAll("\r|\n", "-").replaceAll(" ", ""); return result; } }
3.4、使用示例
try { for (String image : images) { byte[] bytes = fileService.downLoadFile(image); //从byte[]转换为butteredImage ByteArrayInputStream in = new ByteArrayInputStream(bytes); BufferedImage imageFile = ImageIO.read(in); //识别图片的文字 String result = tess4jClient.doOCR(imageFile); //再结合敏感词过滤算法,审核图片中的文字是否包含敏感词 boolean isSensitive = sensitiveScan(result); } }catch (Exception e){ e.printStackTrace(); }
fileService部分代码,使用MinIO下载图片
public byte[] downLoadFile(String pathUrl) { String key = pathUrl.replace(minIOConfigProperties.getEndpoint()+"/",""); int index = key.indexOf("/"); String bucket = key.substring(0,index); String filePath = key.substring(index+1); InputStream inputStream = null; try { inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(minIOConfigProperties.getBucket()).object(filePath).build()); } catch (Exception e) { log.error("minio down file error. pathUrl:{}",pathUrl); e.printStackTrace(); } ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buff = new byte[100]; int rc = 0; while (true) { try { if (!((rc = inputStream.read(buff, 0, 100)) > 0)) break; } catch (IOException e) { e.printStackTrace(); } byteArrayOutputStream.write(buff, 0, rc); } return byteArrayOutputStream.toByteArray(); }
下一篇:
java流程控制——嵌套循环