java如何实现识别图片上的文字
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:\tessdata
3.3、封装tess4J图片识别工具类
在yml配置文件中添加tess4J的相关配置
tess4j:
data-path: D:\tessdata
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实现图片文字识别技术,欢迎点赞收藏。
更多推荐
所有评论(0)