Java调用OCR进行图片识别
如何在Java中进行图像识别和人工智能模型的部署

如何在Java中进行图像识别和人工智能模型的部署在Java中进行图像识别和人工智能模型的部署通常涉及以下几个步骤:1.数据准备:首先,需要准备用于训练和测试的图像数据集。
这可能涉及到从互联网上下载图像、收集自己的图像数据或使用现有的公开数据集。
2.搭建模型:选择一个适用于图像识别任务的模型架构,例如卷积神经网络(Convolutional Neural Network,CNN)。
使用Java的深度学习库,如DL4J(Deep Learning for Java)或Deeplearning4j,可以方便地搭建模型并进行训练。
3.数据预处理:在将数据输入模型之前,通常需要对图像进行一些预处理操作,如缩放、裁剪、归一化等。
这可以通过Java图像处理库,如OpenCV(Open Source Computer Vision Library)来实现。
4.模型训练:使用准备好的数据集和搭建好的模型,开始进行模型的训练。
在DL4J或Deeplearning4j中,可以使用提供的API和工具来训练模型。
训练过程需要选择合适的损失函数、优化算法和超参数,并对模型进行迭代训练。
5.模型评估与调优:在训练过程中,需要对模型进行评估以了解其性能。
通过计算准确率、精确率、召回率等指标,可以评估模型在训练集和测试集上的表现。
根据评估结果,可能需要进行调优,如增加数据集的大小、调整模型的架构、改变超参数等。
6.导出模型:在模型训练完成后,将模型导出为可用的格式,以便在部署时加载和使用。
一般来说,可以将模型保存为文件(如HDF5格式或ONNX格式)或序列化为字节流。
7.模型部署:将导出的模型集成到Java应用程序中,并编写代码以加载和使用模型。
可以使用Java的深度学习库来加载模型,并将待预测的图像输入到模型中进行推理。
根据模型的输出结果,可以进行相应的后续处理,如分类标签的解码、物体边界框的绘制等。
8.性能优化:在部署过程中,可能需要对性能进行优化,以提高模型的推理速度和使用效率。
paddleocr中java的使用示例

paddleocr中java的使用示例PaddleOCR 是一个使用快速、准确和强大的端到端中文文本OCR工具,可提供丰富的模型和算法选择,适用于各种OCR场景。
本文将详细介绍如何在Java环境下使用PaddleOCR。
1. 准备环境首先,我们需要安装Java环境。
确保您已经安装了JDK,并设置了Java 的环境变量。
接下来,我们需要下载PaddleOCR的Java版本。
您可以在PaddleOCR 的GitHub仓库中找到Java版本的代码和示例。
将代码克隆到本地,并导入Java项目。
2. 加载和初始化模型PaddleOCR提供了多个预训练模型供选择。
这些模型在不同的OCR场景下都表现出色,如文字检测、文本方向检测、识别等。
在Java中,我们可以通过以下方式加载和初始化模型:javaimport paddleocr.*;import java.util.*;public class Main {public static void main(String[] args) {加载模型OCR ocr = OCR.getInstance();初始化ocr.init();}}在上面的示例中,我们使用OCR.getInstance()方法来获取OCR的实例,并调用init()方法来初始化模型。
3. 图片预处理在对图片进行OCR之前,需要对图片进行预处理。
预处理可以包括图片旋转、缩放和灰度化等操作。
在PaddleOCR中,可以使用以下方法对图片进行预处理:javaArrayList<String> images = new ArrayList<>();images.add("path/to/image.jpg"); 图片的路径ArrayList<Mat> mats = new ArrayList<>();for (String image : images) {Mat mat = Imgproc.imread(image,Imgproc.IMREAD_GRAYSCALE); 灰度化mats.add(mat);}在上面的代码中,我们首先创建一个ArrayList来存储需要处理的图片路径。
java调用身份证识别OCR

java调用身份证识别OCR
调用身份证识别OCR即服务器版身份证OCR识别软件,该软件可部署在客户私有服务器中(私有本地服务器或云服务器均可),APP和业务系统可通过web service接口调用该识别服务,设备端只负责拍摄图像后上传,上传到已部署java调用身份证识别OCR软件的服务器中进行识别,识别完成后再返回标准的XML数据。
整个识别过程和我公司没有任何交互,均在企业自有的服务器上完成识别。
java 调用身份证识别OCR软件目前支持Windows、Linux等主流服务器。
java调用身份证识别OCR示意图
(除服务器身份证识别软件外,我司还提供服务器版银行卡识别识别软件、服务器版行驶证识别软件,服务版名片识别软件,服务器版名片识别软件)
java调用身份证识别OCR主要特点功能:
1.识别身份证种类多:可识别汉族身份证、少数民族身份证、台湾身份证、澳门身份证、香港身份证及部分国外身份证;
2.识别时间快:识别一张身份证的速度小于1秒,包含整网络交换过程也可在2秒内完成。
3.支持多进程识别方式:可在客户同一服务器中部署多套服务版OCR识别软件,并支持多进程同时识别。
4.支持负载均衡,自动分发。
5.提供多种接口调用方式:目前提供WebService、Rest Service、Http等多种接口方式。
[java调用身份证识别OCR]。
java实现百度云OCR文字识别高精度OCR识别身份证信息

java实现百度云OCR⽂字识别⾼精度OCR识别⾝份证信息本⽂为⼤家分享了java实现百度云OCR识别的具体代码,⾼精度OCR识别⾝份证信息,供⼤家参考,具体内容如下1.通⽤OCR⽂字识别这种OCR只能按照识别图⽚中的⽂字,且是按照⾏识别返回结果,精度较低。
⾸先引⼊依赖包:<dependency><groupId>com.baidu.aip</groupId><artifactId>java-sdk</artifactId><version>4.6.0</version></dependency>通过OCR⼯具类:package util;import com.baidu.aip.ocr.AipOcr;import org.json.JSONObject;import java.util.HashMap;public class OcrApi {private static final String APP_ID = "你的 App ID";private static final String API_KEY = "Xb12m5t4jS2n7";private static final String SECRET_KEY = "9XVx9GPcSbSUTZ";private static AipOcr getAipClient() {return getAipClient(API_KEY, SECRET_KEY);}public static AipOcr getAipClient(String apiKey, String secretKey) {AipOcr client = new AipOcr(APP_ID, apiKey, secretKey);// 可选:设置⽹络连接参数client.setConnectionTimeoutInMillis(2000);client.setSocketTimeoutInMillis(60000);return client;}public static String result(AipOcr client) {// 传⼊可选参数调⽤接⼝HashMap<String, String> options = new HashMap<>();options.put("language_type", "CHN_ENG");options.put("detect_direction", "true");options.put("detect_language", "true");options.put("probability", "true");JSONObject res = client.basicGeneralUrl("https:///1.png", options);return res.toString(2);}public static void main(String[] args) {System.out.println(result(getAipClient()));}}结果如下,识别有两⾏信息(words即是识别的信息):2.⾼精度OCR识别⾝份证信息这种就⽐较⾼精度,且按照分类显⽰,返回数据更友好,⾼可⽤。
java 识别图片相似度及图片是否相同

1.比较MD5值判断图片是否相同package com.zerdoor.util;import java.io.File;import java.io.FileInputStream;import java.math.BigInteger;import java.security.MessageDigest;import java.util.HashMap;import java.util.Map;public class FileDigest {/*** 获取单个文件的MD5值!* @param file* @return*/public static String getFileMD5(File file) {if (!file.isFile()){return null;}MessageDigest digest = null;FileInputStream in=null;byte buffer[] = new byte[1024];int len;try {digest = MessageDigest.getInstance("MD5");in = new FileInputStream(file);while ((len = in.read(buffer, 0, 1024)) != -1) { digest.update(buffer, 0, len);}in.close();} catch (Exception e) {e.printStackTrace();return null;}BigInteger bigInt = new BigInteger(1, digest.digest()); return bigInt.toString(16);}/*** 获取文件夹中文件的MD5值* @param file* @param listChild ;true递归子目录中的文件* @return*/public static Map<String, String> getDirMD5(File file,boolean listChild) {if(!file.isDirectory()){return null;}//<filepath,md5>Map<String, String> map=new HashMap<String, String>();String md5;File files[]=file.listFiles();for(int i=0;i<files.length;i++){File f=files[i];if(f.isDirectory()&&listChild){map.putAll(getDirMD5(f, listChild));} else {md5=getFileMD5(f);if(md5!=null){map.put(f.getPath(), md5);}}}return map;}public static void main(String[] args) {File file1 = newFile("F:\\workspace_acg\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0 \\wtpwebapps\\acgweb\\uploads\\task\\1495872495006.jpg");String s = file1.getPath();File file2 = newFile("F:\\workspace_acg\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0 \\wtpwebapps\\acgweb\\uploads\\task\\1\\20170527\\1495872475363.jpg"); System.out.println(getFileMD5(file1).equals(getFileMD5(file2)));System.out.println(s);}}2.比较每一个的图片的像素相似度(效率较低)package com.zerdoor.util;import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.io.File;public class CompareImg {// 改变成二进制码public static String[][] getPX(String args) {int[] rgb = new int[3];File file = new File(args);BufferedImage bi = null;try {bi = ImageIO.read(file);} catch (Exception e) {e.printStackTrace();}int width = bi.getWidth();int height = bi.getHeight();int minx = bi.getMinX();int miny = bi.getMinY();String[][] list = new String[width][height];for (int i = minx; i < width; i++) {for (int j = miny; j < height; j++) {int pixel = bi.getRGB(i, j);rgb[0] = (pixel & 0xff0000) >> 16;rgb[1] = (pixel & 0xff00) >> 8;rgb[2] = (pixel & 0xff);list[i][j] = rgb[0] + "," + rgb[1] + "," + rgb[2];}}return list;}public static int compareImage(String imgPath1, String imgPath2) { String[] images = { imgPath1, imgPath2 };if (images.length == 0) {System.out.println("Usage >java BMPLoader ImageFile.bmp"); System.exit(0);}// 分析图片相似度 beginString[][] list1 = getPX(images[0]);String[][] list2 = getPX(images[1]);int xiangsi = 0;int busi = 0;int i = 0, j = 0;for (String[] strings : list1) {if ((i + 1) == list1.length) {continue;}for (int m = 0; m < strings.length; m++) {try {String[] value1 = list1[i][j].toString().split(",");String[] value2 = list2[i][j].toString().split(",");int k = 0;for (int n = 0; n < value2.length; n++) {if (Math.abs(Integer.parseInt(value1[k]) - Integer.parseInt(value2[k])) < 5) { xiangsi++;} else {busi++;}}} catch (RuntimeException e) {continue;}j++;}i++;}list1 = getPX(images[1]);list2 = getPX(images[0]);i = 0;j = 0;for (String[] strings : list1) {if ((i + 1) == list1.length) {continue;}for (int m = 0; m < strings.length; m++) {try {String[] value1 = list1[i][j].toString().split(",");String[] value2 = list2[i][j].toString().split(",");int k = 0;for (int n = 0; n < value2.length; n++) {if (Math.abs(Integer.parseInt(value1[k]) - Integer.parseInt(value2[k])) < 5) { xiangsi++;} else {busi++;}}} catch (RuntimeException e) {continue;}j++;}i++;}String baifen = "";try {baifen = ((Double.parseDouble(xiangsi + "") / Double.parseDouble((busi + xiangsi) + "")) + "");baifen = baifen.substring(baifen.indexOf(".") + 1, baifen.indexOf(".") + 3);} catch (Exception e) {baifen = "0";}if (baifen.length() <= 0) {baifen = "0";}if (busi == 0) {baifen = "100";}System.out.println("相似像素数量:" + xiangsi + " 不相似像素数量:" + busi + " 相似率:" + Integer.parseInt(baifen) + "%");return Integer.parseInt(baifen);}public static void main(String[] args) {String file1 ="F:\\workspace_acg\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtp webapps\\acgweb\\uploads\\task\\1\\20170526\\1495780364826.png";String file2 ="F:\\workspace_acg\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtp webapps\\acgweb\\uploads\\task\\1495610591334.png";int compareImage = pareImage(file1, file2);System.out.println(compareImage);}}3.通过汉明距离计算相似度,取值范围 [0.0, 1.0]package com.zerdoor.util;import java.awt.Color;import java.awt.Graphics2D;import java.awt.Image;import java.awt.color.ColorSpace;import java.awt.image.BufferedImage;import java.awt.image.ColorConvertOp;import java.io.File;import java.io.IOException;import javax.imageio.ImageIO;public class ImgSimilarity{// 全流程public static void main(String[] args) throws IOException {// 获取图像File imageFile1 = newFile("F:\\workspace_acg\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0 \\wtpwebapps\\acgweb\\uploads\\task\\1496212755337.jpg");File file2 = newFile("F:\\workspace_acg\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0 \\wtpwebapps\\acgweb\\uploads\\task\\1496212755337.jpg");getSimilarity(imageFile1, file2);}public static double getSimilarity(File imageFile1, File file2) throws IOException {int[] pixels1 = getImgFinger(imageFile1);int[] pixels2 = getImgFinger(file2);// 获取两个图的汉明距离(假设另一个图也已经按上面步骤得到灰度比较数组)int hammingDistance = getHammingDistance(pixels1, pixels2);// 通过汉明距离计算相似度,取值范围 [0.0, 1.0]double similarity = calSimilarity(hammingDistance)*100;System.out.println("相似度:"+similarity+"%");return similarity;}private static int[] getImgFinger(File imageFile) throws IOException {Image image = ImageIO.read(imageFile);// 转换至灰度image = toGrayscale(image);// 缩小成32x32的缩略图image = scale(image);// 获取灰度像素数组int[] pixels1 = getPixels(image);// 获取平均灰度颜色int averageColor = getAverageOfPixelArray(pixels1);// 获取灰度像素的比较数组(即图像指纹序列)pixels1 = getPixelDeviateWeightsArray(pixels1, averageColor);return pixels1;}// 将任意Image类型图像转换为BufferedImage类型,方便后续操作public static BufferedImage convertToBufferedFrom(Image srcImage) {BufferedImage bufferedImage = new BufferedImage(srcImage.getWidth(null), srcImage.getHeight(null), BufferedImage.TYPE_INT_ARGB);Graphics2D g = bufferedImage.createGraphics();g.drawImage(srcImage, null, null);g.dispose();return bufferedImage;}// 转换至灰度图public static BufferedImage toGrayscale(Image image) {BufferedImage sourceBuffered = convertToBufferedFrom(image);ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); ColorConvertOp op = new ColorConvertOp(cs, null);BufferedImage grayBuffered = op.filter(sourceBuffered, null);return grayBuffered;}// 缩放至32x32像素缩略图public static Image scale(Image image) {image = image.getScaledInstance(32, 32, Image.SCALE_SMOOTH);return image;}// 获取像素数组public static int[] getPixels(Image image) {int width = image.getWidth(null);int height = image.getHeight(null);int[] pixels = convertToBufferedFrom(image).getRGB(0, 0, width, height, null, 0, width);return pixels;}// 获取灰度图的平均像素颜色值public static int getAverageOfPixelArray(int[] pixels) {Color color;long sumRed = 0;for (int i = 0; i < pixels.length; i++) {color = new Color(pixels[i], true);sumRed += color.getRed();}int averageRed = (int) (sumRed / pixels.length);return averageRed;}// 获取灰度图的像素比较数组(平均值的离差)public static int[] getPixelDeviateWeightsArray(int[] pixels,final int averageColor) {Color color;int[] dest = new int[pixels.length];for (int i = 0; i < pixels.length; i++) {color = new Color(pixels[i], true);dest[i] = color.getRed() - averageColor > 0 ? 1 : 0;}return dest;}// 获取两个缩略图的平均像素比较数组的汉明距离(距离越大差异越大)public static int getHammingDistance(int[] a, int[] b) {int sum = 0;for (int i = 0; i < a.length; i++) {sum += a[i] == b[i] ? 0 : 1;}return sum;}// 通过汉明距离计算相似度public static double calSimilarity(int hammingDistance){int length = 32*32;double similarity = (length - hammingDistance) / (double) length;// 使用指数曲线调整相似度结果similarity = ng.Math.pow(similarity, 2);return similarity;}}。
java从图片中识别文字

java从图⽚中识别⽂字package mon;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.util.Iterator;import java.util.Locale;import javax.imageio.IIOImage;import javax.imageio.ImageIO;import javax.imageio.ImageReader;import javax.imageio.ImageWriteParam;import javax.imageio.ImageWriter;import javax.imageio.metadata.IIOMetadata;import javax.imageio.stream.FileImageInputStream;import javax.imageio.stream.ImageInputStream;import javax.imageio.stream.ImageOutputStream;import com.github.jaiimageio.plugins.tiff.TIFFImageWriteParam;/*** 识别图⽚中的⽂字** @author zlj**/public class ImageIOHelper {/*** 创建临时图⽚⽂件** @param imageFile* @return* @throws IOException*/public File createImage(File imageFile) throws IOException {Iterator<ImageReader> readers = ImageIO.getImageReaders(new FileImageInputStream(imageFile));ImageReader reader = readers.next();ImageInputStream iis = ImageIO.createImageInputStream(imageFile);reader.setInput(iis);IIOMetadata streamMetadata = reader.getStreamMetadata();TIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(Locale.CHINESE);tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED);Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("tiff");ImageWriter writer = writers.next();BufferedImage bi = reader.read(0);IIOImage image = new IIOImage(bi, null, reader.getImageMetadata(0));File tempFile = tempImageFile(imageFile);ImageOutputStream ios = ImageIO.createImageOutputStream(tempFile);writer.setOutput(ios);writer.write(streamMetadata, image, tiffWriteParam);ios.close();iis.close();writer.dispose();reader.dispose();return tempFile;}/*** 添加后缀 tempfile** @param imageFile* @return* @throws IOException*/private File tempImageFile(File imageFile) throws IOException {String path = imageFile.getPath();StringBuffer strB = new StringBuffer(path);strB.insert(stIndexOf('.'), "_text_recognize_temp");String s = strB.toString().replaceFirst("(?<=//.)(//w+)$", "tif");Runtime.getRuntime().exec("attrib " + "\"" + s + "\"" + " +H"); // 设置⽂件隐藏return new File(strB.toString());}}package mon;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;import org.jdesktop.swingx.util.OS;/*** 从图⽚中识别⽂字* @author zlj**/public class OCRUtil {private final String LANG_OPTION = "-l"; // 英⽂字母⼩写l,并⾮数字1private final String EOL = System.getProperty("line.separator");private String tessPath = "C://Program Files (x86)//Tesseract-OCR";// ocr默认安装路径private String transname = "chi_sim";// 默认中⽂语⾔包,识别中⽂/*** 从图⽚中识别⽂字* @param imageFile* @param imageFormat* @return text recognized in image* @throws Exception*/public String recognizeText(File imageFile) throws Exception {File tempImage = new ImageIOHelper().createImage(imageFile);return ocrImages(tempImage, imageFile);}/*** 识别图⽚中的⽂字* @param tempImage* @param imageFile* @return* @throws IOException* @throws InterruptedException*/private String ocrImages(File tempImage, File imageFile) throws IOException, InterruptedException {File outputFile = new File(imageFile.getParentFile(), "output");Runtime.getRuntime().exec("attrib " + "\"" + outputFile.getAbsolutePath() + "\"" + " +H"); // 设置⽂件隐藏 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(transname);ProcessBuilder pb = new ProcessBuilder();pb.directory(imageFile.getParentFile());cmd.set(1, tempImage.getName());mand(cmd);pb.redirectErrorStream(true);Process process = pb.start();int w = process.waitFor();tempImage.delete();// 删除临时正在⼯作⽂件if (w == 0) {BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(outputFile.getAbsolutePath() + ".txt"), "UTF-8"));String str;while ((str = in.readLine()) != null) {strB.append(str).append(EOL);}in.close();} else {String msg;switch (w) {case 1:msg = "Errors accessing files.There may be spaces in your image's filename.";break;case 29:msg = "Cannot recongnize the image or its selected region.";break;case 31:msg = "Unsupported image format.";break;default:msg = "Errors occurred.";}tempImage.delete();throw new RuntimeException(msg);}new File(outputFile.getAbsolutePath() + ".txt").delete();return strB.toString();}public static void main(String[] args) throws Exception {System.out.println("begin");String path = "F://test1.png";String valCode = new OCRUtil().recognizeText(new File(path)); System.out.println(valCode);System.out.println("end");}}。
pdfocr 基于java

PDFOCR是一个基于Java的开源OCR(光学字符识别)工具,它可以将扫描的PDF文件转换为可编辑和可搜索的文本格式。
PDFOCR使用Tesseract OCR引擎进行字符识别,并使用Apache PDFBox库处理PDF文件。
它还支持多种语言,并具有良好的性能和准确性。
使用PDFOCR,您可以通过Java代码将PDF文件转换为文本格式,或者将其集成到您的Java应用程序中,以便在用户上传扫描的PDF文件时自动执行OCR操作。
以下是使用PDFOCR将PDF文件转换为文本的简单示例代码:
java复制代码
import net.sourceforge.pdfocr.PdfOcr;
public class PdfOcrExample {
public static void main(String[] args) {
String inputFilePath = "path/to/input/pdf/file.pdf";
String outputFilePath = "path/to/output/text/file.txt";
PdfOcr pdfOcr = new PdfOcr();
pdfOcr.setInputFile(inputFilePath);
pdfOcr.setOutputFile(outputFilePath);
pdfOcr.process();
}
}
在此示例中,我们创建了一个PdfOcr对象,并设置了输入和输出文件的路径。
然后,我们调用process()方法执行OCR操作,并将结果写入输出文件中。
Java使用Tess4J进行图片文字识别笔记

Java使用Tess4J进行图片文字识别笔记最近的工作中需要使用到从图片中识别文字的操作,就在网上找到到Tess4j.那么,现在来总结一下使用中遇到的问题.关于Tess4J简价:/ (需要翻墙)很简洁的项目主页.一个从Java角度使用JNA封闭的针对Tesseract ORC 的开源项目,使用 Apache License, v2.0 协议.支持TIFF, JPEG, GIF, PNG, and BMP image formats,Multi-page TIFF images,PDF document format.(支持Tiff是一个很大的亮点) 那就再了解一下 Tesseract ORC.https:///p/tesseract-ocr/ 是一个Google支持的开源的OCR图文识别开源项目.去持多语言(当前3.02 版本支持包括英文,简体中文,繁体中文),支持Windows,Linux,Mac OSX 多平台.使用中Tesseract 的识别率非常高. ( 自己仅对数字,使用中图片清析的情况下没发生错误 )网上传的代码示例大多是在Windows下安装Tesseract ORC后通过CMD命令操作进行图识别操作.而 Tess4j 针对Tesseract 提供了JNI支持,同时还提供了一些图片操作的工具类,提供比如图片放大,旋转,黑白处理,锐化等用来提高识别率的操作.操作十分方便. Tess4j 简单到超乎想象,只是自己在使用环境比较特殊,遇到很多问题,这里一一道来.1 依赖包.tess4j.jar Tess4j的本尊,用于Tesseract 的JNA支持,并提供相关操作工具类jna.jar 看到Tesseract 的第一反应是要用cmd或JNI来操作它,了解了一下 Tess4j 使用的JNA,有点JNI高级版的感觉,CMD什么的,玩蛋蛋去吧.jai_imageio.jar 图片操作的工具类,支持Tiff就靠它了. 它的META-INF 里有文章,这个后面详说.还有其它几个包,是用于操作PDF用的吧,没有引用,也没有发生错误.所以的包可以在 Tess4j 的文件目录里面找到.2 操作代码.官方的示例中给出了一个超级简单有效的示例,不足20行代码我和小伙伴们都被震惊了关键代码如下:File imageFile = new File("eurotext.tif");Tesseract instance = Tesseract.getInstance(); // JNA Interface MappingString result = instance.doOCR(imageFile);实际使用中为了提高识别率还要对图片作一些处理来提高识别率,使用Tess4j 自带的工具类即可完成,这样识别率就大大的提高了.( 这里无法解决验证码中干扰线问题,干扰线的清理,网上有其它方式处理 ) // 这里对图片黑白处理,增强识别率.这里先通过截图,截取图片中需要识别的部分BufferedImage textImage = ImageHelper.convertImageT oGrayscale(ImageHelper.getSubIma ge(panel.image, startX, startY, endX, endY));// 图片锐化,自己使用中影响识别率的主要因素是针式打印机字迹不连贯,所以锐化反而降低识别率// textImage = ImageHelper.convertImageT oBinary(textImage);// 图片放大5倍,增强识别率(很多图片本身无法识别,放大5倍时就可以轻易识,但是考滤到客户电脑配置低,针式打印机打印不连贯的问题,这里就放大5倍)textImage = ImageHelper.getScaledInstance(textImage, endX * 5, endY * 5);3 使用中遇到的问题3.1 相关DLL文件,相关字库文件liblept168.dll,libtesseract302.dll 其中 liblept168.dll 要先加载.tessdata 存放的是字库文件,如果需要数字,英文以外的支持需要Tesseract 页面下载相关字库.因为公司使用时是将文件打成Jar布署,然后提供客户端下载,所以就把以上两个文件一起打进tess4j.jar里面,然后客户端使用时tessdata 直接可用,而 liblept168.dll,libtesseract302.dll 需要释放到临时目录然后加载.相关代码:loadDLL("liblept168.dll");//注意加载先后顺序loadDLL("libtesseract302.dll");//注意加载先后顺序private static void loadDLL(String libFullName) {try {String nativeTempDir = System.getProperty("java.io.tmpdir");InputStream in = null;FileOutputStream writer = null;BufferedInputStream reader = null;File extractedLibFile = new File(nativeTempDir + File.separator + libFullName);if (!extractedLibFile.exists()) {try {in = Tesseract.class.getResourceAsStream("/" + libFullName); Tesseract.class.getResource(libFullName);reader = new BufferedInputStream(in);writer = new FileOutputStream(extractedLibFile);byte[] buffer = new byte[1024];while (reader.read(buffer) > 0) {writer.write(buffer);buffer = new byte[1024];}in.close();writer.close();System.load(extractedLibFile.toString());} catch (IOException e) {e.printStackTrace();} finally {if (in != null) {in.close();}if (writer != null) {writer.close();}}} else {System.load(extractedLibFile.toString());}} catch (IOException e) {logger.error("初始化 " + libFullName + " DLL错误", e);}}3.2 相关异常错误信息:null错误详细堆栈信息:java.util.NoSuchElementException: nullat:javax.imageio.spi.FilterIterator.next(ServiceRegistry.java:808) 这个错误在开发环境下没有报错,但是在使用环境下出错,网上说出错原因是因为 jai_imageio.jar 丢失.如果在操作中遇到错误,很可能是这个原因,但是在前面的代码的工具类里使用了 jai_imageio.jar ,如果报错,可能会报某类找不到的错误自己这里显然不是.查看JDK中关于报错位置的代码,大概问题是因为注册的类没找到的原因.根据JDK文档的说明在jai_imageio.jar 的META-INF 的 service 包里面找到了相关的注册代码.分析了下,可能是因为金蝶EAS客户端使用自定义的类文件加载器,导至 META-INF 中的注册信息未能读取.这里手动注册一下.代码如下:// FUCK,客户端加载jar的方式很特殊,所以第三方包注册的serve 无法生效,这里就行动注册了,事儿真多IIORegistry registry = IIORegistry.getDefaultInstance();// registry.registerServiceProvider(new ImageReadWriteSpi(), OperationRegistrySpi.class);//这个,注册不了registry.registerServiceProvider(new ChannelImageInputStreamSpi(), ImageInputStreamSpi.class);registry.registerServiceProvider(new ChannelImageOutputStreamSpi(), ImageOutputStreamSpi.class);// ---------registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader Spi(), ImageReaderSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.png.CLibPNGImageReaderSpi(), ImageReaderSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReaderS pi(), ImageReaderSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReaderC odecLibSpi(), ImageReaderSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.wbmp.WBMPImageReader Spi(), ImageReaderSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.bmp.BMPImageReaderSpi(), ImageReaderSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.pnm.PNMImageReaderSpi(), ImageReaderSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.raw.RawImageReaderSpi(), ImageReaderSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.tiff.TIFFImageReaderSpi(), ImageReaderSpi.class);//registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageWriterS pi(), ImageWriterSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageWriterS pi(), ImageWriterSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.png.CLibPNGImageWriterS pi(), ImageWriterSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.jpeg2000.J2KImageWriterS pi(), ImageWriterSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.jpeg2000.J2KImageWriterC odecLibSpi(), ImageWriterSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.wbmp.WBMPImageWriterS pi(), ImageWriterSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.bmp.BMPImageWriterSpi(), ImageWriterSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.gif.GIFImageWriterSpi(), ImageWriterSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.pnm.PNMImageWriterSpi(), ImageWriterSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.raw.RawImageWriterSpi(), ImageWriterSpi.class);registry.registerServiceProvider(newcom.sun.media.imageioimpl.plugins.tiff.TIFFImageWriterSpi(), ImageWriterSpi.class);世界终于安静了…..。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
tempImage.delete();
if(w==0){
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(outputFile.getAbsolutePath()+".txt"),"UTF-8"));
import javax.imageio.stream.ImageOutputStream;
import com.sun.media.imageio.plugins.tiff.TIFFImageWriteParam;
public classቤተ መጻሕፍቲ ባይዱImageIOHelper {
/**
* 图片文件转换为tif格式
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");
* @param imageFile 文件路径
* @param imageFormat 文件扩展名
* @return
*/
public static File createImage(File imageFile, String imageFormat) {
File tempFile = null;
try {
ImageWriter writer = writers.next();
BufferedImage bi = reader.read(0);
IIOImage image = new IIOImage(bi,null,reader.getImageMetadata(0));
tempFile = tempImageFile(imageFile);
ImageOutputStream ios = ImageIO.createImageOutputStream(tempFile);
writer.setOutput(ios);
writer.write(streamMetadata, image, tiffWriteParam);
ios.close();
Java调用OCR进行图片识别
使用Java语言,通过Tesseract-OCR对图片进行识别。
1.Tesseract-OCR
下载windows版本并安装。
2.程序如下:
a.ImageIOHelper类
package OCR;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.List;
import org.jdesktop.swingx.util.OS;
public class OCR {
private final String LANG_OPTION = "-l"; //英文字母小写l,并非数字1
private final String EOL = System.getProperty("line.separator");
Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(imageFormat);
ImageReader reader = readers.next();
ImageInputStream iis = ImageIO.createImageInputStream(imageFile);
File tempImage = ImageIOHelper.createImage(imageFile,imageFormat);
File outputFile = new File(imageFile.getParentFile(),"output");
StringBuffer strB = new StringBuffer();
writer.dispose();
reader.dispose();
} catch (IOException e) {
e.printStackTrace();
}
return tempFile;
}
private static File tempImageFile(File imageFile) {
String path = imageFile.getPath();
reader.setInput(iis);
//Read the stream metadata
IIOMetadata streamMetadata = reader.getStreamMetadata();
//Set up the writeParam
TIFFImageWriteParam tiffWriteParam = new TIFFImageWriteParam(Locale.CHINESE);
StringBuffer strB = new StringBuffer(path);
strB.insert(stIndexOf('.'),0);
return new File(strB.toString().replaceFirst("(?<=//.)(//w+)$", "tif"));
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageInputStream;
}
tempImage.delete();
//throw new RuntimeException(msg);
}
new File(outputFile.getAbsolutePath()+".txt").delete();
return strB.toString();
}
}
C main
package OCR;
cmd.set(1, tempImage.getName());
mand(cmd);
pb.redirectErrorStream(true);
Process process = pb.start();
//tesseract.exe 1.jpg 1 -l chi_sim
int w = process.waitFor();
try {
String valCode = new OCR().recognizeText(new File(path), "bmp");
System.out.println(valCode);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
import java.io.IOException;
import java.util.Iterator;
import java.util.Locale;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED);
//Get tif writer and set output to file
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("tiff");
import java.io.File;
import java.io.IOException;
public class TestOcr {
/**
* @param args
*/
public static void main(String[] args) {
//输入图片地址
String path = "d://test//test.bmp";
break;
case 29:
msg = "Cannot recongnize the image or its selected region.";
break;
case 31:
msg = "Unsupported image format.";
break;
default:
msg = "Errors occurred.";
}
}
b.OCR核心类
package OCR;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;