精华内容
下载资源
问答
  • java识别图片文字
    千次阅读
    2021-02-12 09:53:17

    展开全部

    摘要图像识别是目62616964757a686964616fe59b9ee7ad9431333335313134前很热门的研究领域,涉及的知识很广,包括信息论、模式识别、模糊数学、图像编码、内容分类等等。本文仅对使用Java实现了一个简单的图像文本二值处理,关于识别并未实现。

    步骤

    建立文本字符模板二值矩阵

    对测试字符进行二值矩阵化处理

    代码

    /*

    * @(#)StdModelRepository.java

    *

    * This program is free software; you can redistribute it and/or modify

    * it under the terms of the GNU General Public License as published by

    * the Free Software Foundation; either version 3 of the License, or

    * (at your option) any later version.

    *

    * This program is distributed in the hope that it will be useful,

    * but WITHOUT ANY WARRANTY; without even the implied warranty of

    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

    * GNU Library General Public License for more details.

    * You should have received a copy of the GNU General Public License

    * along with this program; if not, write to the Free Software

    * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

    */

    package cn.edu.ynu.sei.recognition.util;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.logging.Level;import java.util.logging.Logger;import javax.imageio.ImageIO;/** * Hold character charImgs as standard model repository.

    * @author 88250

    * @version 1.0.0.0, Mar 20, 2008

    */

    public class StdModelRepository {

    /** * hold character images

    */ List charImgs = new ArrayList();

    /** * default width of a character

    */ static int width = 16 /** * default height of a character

    */ static int height = 28 /** * standard character model matrix

    */ public int[][][] stdCharMatrix = new int[27][width][height];

    /** * Default constructor.

    */ public StdModelRepository() {

    BufferedImage lowercase = null try {

    lowercase = ImageIO.read(new File("lowercase.png"));

    } catch (IOException ex) {

    Logger.getLogger(StdModelRepository.class.getName()).

    log(Level.SEVERE, null, ex);

    }

    for (int i = 0 i < 26 i++) {

    charImgs.add(lowercase.getSubimage(i * width,

    0,

    width,

    height));

    }

    for (int i = 0 i < charImgs.size(); i++) {

    Image image = charImgs.get(i);

    int[] pixels = ImageUtils.getPixels(image,

    image.getWidth(null),

    image.getHeight(null));

    stdCharMatrix[i] = ImageUtils.getSymbolMatrix(pixels, 0).clone();

    ImageUtils.displayMatrix(stdCharMatrix[i]);

    }

    }

    }

    /*

    * @(#)ImageUtils.java

    *

    * This program is free software; you can redistribute it and/or modify

    * it under the terms of the GNU General Public License as published by

    * the Free Software Foundation; either version 3 of the License, or

    * (at your option) any later version.

    *

    * This program is distributed in the hope that it will be useful,

    * but WITHOUT ANY WARRANTY; without even the implied warranty of

    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

    * GNU Library General Public License for more details.

    * You should have received a copy of the GNU General Public License

    * along with this program; if not, write to the Free Software

    * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

    */

    package cn.edu.ynu.sei.recognition.util;import java.awt.Image;import java.awt.image.PixelGrabber;import java.util.logging.Level;import java.util.logging.Logger;/** * Mainipulation of image data.

    * @author 88250

    * @version 1.0.0.3, Mar 20, 2008

    */

    public class ImageUtils {

    /** * Return all of the pixel values of sepecified image< .>  * @param image the sepecified image

    * @param width width of the image

    * @param height height of the image

    * @return */ public static int[] getPixels(Image image, int width, int height) {

    int[] pixels = new int[width * height];

    try {

    new PixelGrabber(image, 0, 0, width, height, pixels, 0, width).grabPixels();

    } catch (InterruptedException ex) {

    Logger.getLogger(ImageUtils.class.getName()).

    log(Level.SEVERE, null, ex);

    }

    return pixels;

    }

    资源来自:

    http://blog.csdn.net/chief1985/article/details/2229572

    2Q==

    已赞过

    已踩过<

    你对这个回答的评价是?

    评论

    收起

    更多相关内容
  • java识别图片文字英文、中文 tess4j
  • 文件为压缩包,包括多个java识别图片文字的项目,国内网站上资料比较少,项目都整理出了测试类及说明,都包含着源代码及jar包、安装包、训练库。希望用得到的人少走弯路,资源都精心整理测试过,高分是必须的。 java...
  • 主要介绍了java实现图片文字识别ocr ,非常具有实用价值,需要的朋友可以参考下
  • Java识别图片文字所需jar包,收藏,没有积分的可留邮箱单独发送给你
  • JAVA 识别图片中的文字

    千次阅读 2022-03-03 15:09:44
    /** * 识别图片中的文字 * * @author zlj * */ public class ImageIOHelper { /** * 创建临时图片文件 * * @param imageFile * @return * @throws IOException */ public File createImage(File imageFile) ...
    package org.example;
    
    import com.github.jaiimageio.plugins.tiff.TIFFImageWriteParam;
    
    import javax.imageio.*;
    import javax.imageio.metadata.IIOMetadata;
    import javax.imageio.stream.FileImageInputStream;
    import javax.imageio.stream.ImageInputStream;
    import javax.imageio.stream.ImageOutputStream;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.util.Iterator;
    import java.util.Locale;
    
    /**
     * 识别图片中的文字
     * 
     * @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(path.lastIndexOf('.'), "_text_recognize_temp");
    		String s = strB.toString().replaceFirst("(?<=//.)(//w+)$", "tif");
    		Runtime.getRuntime().exec("attrib " + "\"" + s + "\"" + " +H"); // 设置文件隐藏
    		return new File(strB.toString());
    	}
    }
    
    
    

    注意修改他的路径
    private String tessPath = “D:\Download\Tesseract-OCR”;// ocr默认安装路径

    package org.example;
    
    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 java.util.Map;
    
    import org.jdesktop.swingx.util.OS;
    
    /**
     * 从图片中识别文字
     * @author zlj
     *
     */
    public class OCRUtil {
    	private final String LANG_OPTION = "-l"; // 英文字母小写l,并非数字1
    	private final String EOL = System.getProperty("line.separator");
    	private String tessPath = "D:\\Download\\Tesseract-OCR";// ocr默认安装路径
    	private String transname = "chi_sim";// 默认中文语言包,识别中文
    
    	/**
    	 * 从图片中识别文字
    	 *
    	 * @param imageFile
    	 * @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();
    		Map<String, String> env = pb.environment();
    		env.put("TESSDATA_PREFIX", "D:\\Download\\Tesseract-OCR\\tessdata");
    		pb.directory(imageFile.getParentFile());
    		cmd.set(1, tempImage.getName());
    		pb.command(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 = "C:\\Users\\Administrator\\Desktop\\11111.jpg";
    		String valCode = new OCRUtil().recognizeText(new File(path));
    		System.out.println(valCode);
    		System.out.println("end");
    	}
    }
    
    </dependency>
        <!-- https://mvnrepository.com/artifact/com.github.jai-imageio/jai-imageio-core -->
        <dependency>
          <groupId>com.github.jai-imageio</groupId>
          <artifactId>jai-imageio-core</artifactId>
          <version>1.4.0</version>
        </dependency>
    
        <!-- https://mvnrepository.com/artifact/org.swinglabs/swingx -->
        <dependency>
          <groupId>org.swinglabs</groupId>
          <artifactId>swingx</artifactId>
          <version>1.6.1</version>
        </dependency>
    

    在这里插入图片描述

    https://gitee.com/Luo_Jing98358/tesseract-ocr?_from=gitee_search

    结果:

    在这里插入图片描述

    展开全文
  • 主要为大家详细介绍了java图片识别文字的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java识别图片上的文字

    万次阅读 2019-03-15 16:11:00
    一、需要用到Tesseract-OCR所以先下载,并安装 二、配置环境变量,在系统环境变量中,Path添加C:\Program Files (x86)\Tesseract-OCR;新建变量TESSDATA_PREFIX,...三、开始识别 (1)例如C:\Users\dell\Desktop...

    一、需要用到Tesseract-OCR所以先下载,并安装

    二、配置环境变量,在系统环境变量中,Path添加C:\Program Files (x86)\Tesseract-OCR;新建变量TESSDATA_PREFIX,变量值为C:\Program Files (x86)\Tesseract-OCR\tessdata

    三、开始识别

    (1)例如C:\Users\dell\Desktop\test\test.jpg的图片

     

    (2)测试识别效果

    识别图片命令

    tesseract 图片名称 生成的结果文件的名称 字库

    cmd命令行进入图片所在文件夹位置,输入命令(其中chi_sim是中文的字库),result是在当前文件夹下生产一个result.txt文件并写入识别的内容

    tesseract test.jpg result -l chi_sim

    (3)打开result.txt文件,识别的不是很准确,可以对字库进行训练

    四、训练字库

    (1)需要下载jTessBoxEditor工具,jTessBoxEditor是java写的,所以需要安装jdk

    (2)修改图片名字,不能随意命名,有固定的格式,这里我把图片名字改成cs.roy.exp0.jpg

    [lang].[fontname].exp[num]

    (3)利用windows自带的画图工具另存为.tif文件

    (4)生成.box文件,cmd输入命令

    tesseract cs.roy.exp0.tif cs.roy.exp0 -l chi_sim batch.nochop makebox

    (5)打开jTessBoxEditor的train.bat,选择tif文件,可以点击merge按钮进行合并文字,如果没有中文可以在Settings->Font里设置宋体

    (6)优化后点保存

    (7)输入命令

    tesseract  cs.roy.exp0.jpg cs.roy.exp0  nobatch box.train

    (8)输入命令

    unicharset_extractor cs.roy.exp0.box
    

    (9)新建font_properties文件,内容写入roy 0 0 0 0 0 

    :roy对应的是命名规则的[fontname],font_properties文件不是font_properties.txt

    (10)输入命令

    shapeclustering -F font_properties -U unicharset cs.roy.exp0.tr

    (11)输入命令

    mftraining -F font_properties -U unicharset -O unicharset cs.roy.exp0.tr
    
    

    (12)输入命令

    cntraining cs.roy.exp0.tr

    (13)把新生成的五个文件加上前缀roy.

    (14)合并相关文件,输入命令,生成.traineddata文件

    combine_tessdata roy.

    (15)把roy.traineddata文件复制到C:\Program Files (x86)\Tesseract-OCR\tessdata文件夹下

     

    (16)输入命令进行识别测试,-l 后面输入对应的字库

    tesseract cs.roy.exp0.jpg cs.roy.exp0 -l roy
    

    五、java代码调用(其中getImg()方法是把图片二值化处理增加识别效果)

    package springboot;
    
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.*;
    import java.util.ArrayList;
    import java.util.List;
    
    public class OCRHelper {
    	private final String LANG_OPTION = "-l";
    	private final String EOL = System.getProperty("line.separator");
    
    	public static void main(String[] args) {
    		try {
    			//需要被识别的图片
    			File file = new File("C:\\Users\\dell\\Desktop\\test\\cs.roy.exp0.jpg");
    			String recognizeText = new OCRHelper().recognizeText(file);
    			System.out.print(recognizeText + "\t");
    		} catch (IOException e) {
    			e.printStackTrace();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
    	private static void getImg(File read,File write) throws IOException {
    		BufferedImage image = ImageIO.read(read);
    		int w = image.getWidth();
    		int h = image.getHeight();
    		float[] rgb = new float[3];
    		double[][] zuobiao = new double[w][h];
    		int R = 0;
    		float red = 0;
    		float green = 0;
    		float blue = 0;
    		BufferedImage bi= new BufferedImage(w, h, BufferedImage.TYPE_BYTE_BINARY);
    		;
    		for (int x = 0; x < w; x++) {
    			for (int y = 0; y < h; y++) {
    				int pixel = image.getRGB(x, y);
    				rgb[0] = (pixel & 0xff0000) >> 16;
    				rgb[1] = (pixel & 0xff00) >> 8;
    				rgb[2] = (pixel & 0xff);
    				red += rgb[0];
    				green += rgb[1];
    				blue += rgb[2];
    				R = (x+1) *(y+1);
    				float avg = (rgb[0]+rgb[1]+rgb[2])/3;
    				zuobiao[x][y] = avg;
    
    			}
    		}
    		double SW = 170;
    		for (int x = 0; x < w; x++) {
    			for (int y = 0; y < h; y++) {
    				if (zuobiao[x][y] <= SW) {
    					int max = new Color(0, 0, 0).getRGB();
    					bi.setRGB(x, y, max);
    				}else{
    					int min = new Color(255, 255, 255).getRGB();
    					bi.setRGB(x, y, min);
    				}
    			}
    		}
    
    		ImageIO.write(bi, "jpg", write);
    	}
    
    	/**
    	 * Tesseract-OCR的安装路径
    	 */
    	private String tessPath = "C://Program Files (x86)//Tesseract-OCR";
    	//private String tessPath = new File("tesseract").getAbsolutePath();
    
    	/**
    	 * @param imageFile 传入的图像文件
    	 * @return 识别后的字符串
    	 */
    	public String recognizeText(File imageFile) throws Exception {
    		/**
    		 * 设置输出文件的保存的文件目录
    		 */
    		File outputFile = new File(imageFile.getParentFile(), "output");
    
    		StringBuffer strB = new StringBuffer();
    		List<String> cmd = new ArrayList<String>();
    
    		cmd.add(tessPath + "\\tesseract");
    
    		cmd.add("");
    		cmd.add(outputFile.getName());
    		cmd.add(LANG_OPTION);
    //		cmd.add("chi_sim");
    		cmd.add("roy");
    
    		ProcessBuilder pb = new ProcessBuilder();
    		pb.directory(imageFile.getParentFile());
    		cmd.set(1, imageFile.getName());
    		pb.command(cmd);
    		pb.redirectErrorStream(true);
    		long startTime = System.currentTimeMillis();
    		System.out.println("开始时间:" + startTime);
    		Process process = pb.start();
    		int w = process.waitFor();
    		if (w == 0) {// 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();
    			long endTime = System.currentTimeMillis();
    			System.out.println("结束时间:" + endTime);
    			System.out.println("耗时:" + (endTime - startTime) + "毫秒");
    		} 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 recognize the image or its selected region.";
    					break;
    				case 31:
    					msg = "Unsupported image format.";
    					break;
    				default:
    					msg = "Errors occurred.";
    			}
    			throw new RuntimeException(msg);
    		}
    		new File(outputFile.getAbsolutePath() + ".txt").delete();
    		return strB.toString().replaceAll("\\s*", "");
    	}
    }
    

     

    展开全文
  • OCR 识别文字项目 该项目 可以进行两种方式进行身份证识别 1. 使用百度接口 1.1 application-dev.yml配置 ocr: # 使用baiduOcr 需要有Ocr服务器 使用百度需要相应的百度账号即可 useOcrType: baiduOcr # 需要OCR ...

    OCR 识别文字项目

    该项目 可以进行两种方式进行身份证识别

    1. 使用百度接口

    1.1 application-dev.yml配置

    ocr:
      # 使用baiduOcr 需要有Ocr服务器 使用百度需要相应的百度账号即可
      useOcrType: baiduOcr
      # 需要OCR 的文件夹
      ocrFolderPath: E:\ocr-wait-image\16210910333-8e2fa7f52db04a538ed584c919ce33b1
      # 需要OCR 的文件
      ocrFile: H:\Desktop\test\14.jpg
      # 百度OCR 配置  https://cloud.baidu.com/doc/OCR/s/Nkibizxlf
      baiduOcr:
        # 使用token 形式
        useToken: false
        # 使用卡证识别接口 卡证识别一天500次免费(识别率高推荐) 通用识别50000次免费(识别率较低)
        useIdCard: true
        # 使用token 形式调用接口 token 通过接口获取(推荐使用sdk模式)
        token: XXXXXXXX
        idCardUrl: https://aip.baidubce.com/rest/2.0/ocr/v1/idcard
        idCardPrefix: id_card_side=front&image=
        generalBasicUrl: https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic
        generalBasicPrefix: image=
        # 不使用token sak形式调用接口(通过百度账号创建应用获取)
        appId: XXXXXXXXXX
        apiKey: XXXXXXXXXX
        secretKey: XXXXXXXXXX
    

    1.2 创建百度应用

    1609572779516

    填入必填项即可

    再次出来即有一个创建的应用

    1609572947517

    以上配置的appId,apiKey,secretKey 三项在这里获取

    1.3 结果显示

    1609573117096

    获得结果会保存在这个文件夹

    1609573193329

    1.3 使用百度免费OCR 项目配置结束

    1.4 主要代码展示

    package com.ocr.baidu;
    
    import com.baidu.aip.ocr.AipOcr;
    import com.framework.config.OcrConfig;
    import com.utils.Base64Util;
    import com.utils.FileUtil;
    import com.utils.HttpUtil;
    import lombok.extern.slf4j.Slf4j;
    import org.json.JSONObject;
    
    import java.net.URLEncoder;
    import java.nio.charset.StandardCharsets;
    import java.util.HashMap;
    
    @Slf4j
    public class BaiduOCRUtils {
        /**
         * 卡证识别
         */
        public static String idCardByToken(OcrConfig.BaiduOcr baiduOcr,String filePath) {
            String idCardPrefix = baiduOcr.getIdCardPrefix();
            String idCardUrl = baiduOcr.getIdCardUrl();
            String token = baiduOcr.getToken();
            // 请求url
            try {
                // 本地文件路径
    
                byte[] imgData = FileUtil.readFileByBytes(filePath);
                String imgStr = Base64Util.encode(imgData);
                String imgParam = URLEncoder.encode(imgStr, StandardCharsets.UTF_8.name());
    
                String param = idCardPrefix + imgParam;
                // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
                return  HttpUtil.post(idCardUrl, token, param);
            } catch (Exception e) {
                log.error(e.getMessage());
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 通用文字识别
         */
        public static String generalBasicByToken(OcrConfig.BaiduOcr baiduOcr,String filePath) {
            String generalBasicPrefix = baiduOcr.getGeneralBasicPrefix();
            String generalBasicUrl = baiduOcr.getGeneralBasicUrl();
            String token = baiduOcr.getToken();
            // 请求url
            try {
                // 本地文件路径
                byte[] imgData = FileUtil.readFileByBytes(filePath);
                String imgStr = Base64Util.encode(imgData);
                String imgParam = URLEncoder.encode(imgStr, StandardCharsets.UTF_8.name());
    
                String param = generalBasicPrefix + imgParam;
                // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
                return HttpUtil.post(generalBasicUrl, token, param);
            } catch (Exception e) {
                log.error(e.getMessage());
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 通用文字识别 sdk
         */
        public static JSONObject generalBasicBySdk(OcrConfig.BaiduOcr baiduOcr,String filePath) {
            String appId = baiduOcr.getAppId();
            String apiKey = baiduOcr.getApiKey();
            String secredKey = baiduOcr.getSecretKey();
            AipOcr client = new AipOcr(appId, apiKey, secredKey);
            // 可选:设置网络连接参数
            client.setConnectionTimeoutInMillis(2000);
            client.setSocketTimeoutInMillis(60000);
            return client.basicGeneral(filePath, new HashMap<>());
        }
        /**
         * 身份证文字识别 sdk
         */
        public static JSONObject idCardBySdk(OcrConfig.BaiduOcr baiduOcr,String filePath) {
            String appId = baiduOcr.getAppId();
            String apiKey = baiduOcr.getApiKey();
            String secredKey = baiduOcr.getSecretKey();
            AipOcr client = new AipOcr(appId, apiKey, secredKey);
            // 可选:设置网络连接参数
            client.setConnectionTimeoutInMillis(2000);
            client.setSocketTimeoutInMillis(60000);
            return client.idcard(filePath,"front", new HashMap<>());
        }
    }
    
    

    2. 使用百度开源项目PaddleHub

    PS: 识别通过paddle(python 运行) ,JAVA 进行结果处理

    2.1 按照教程安装PaddleHub

    2.2 application-dev.yml配置

    ocr:
      paddleOcr:
        # 使用本地
        url: 192.168.0.106
        port: 8866
        moduleMap:
          # 文字识别OCR 安装 https://www.paddlepaddle.org.cn/hubdetail?name=chinese_ocr_db_crnn_mobile&en_category=TextRecognition
          chinese_ocr_db_crnn_mobile: 1.1.1
          # 人脸识别OCR(识别身份证正面或手持身份证) 安装  https://www.paddlepaddle.org.cn/hubdetail?name=pyramidbox_lite_server&en_category=FaceDetection
          pyramidbox_lite_server: 1.2.0
        # 是否分析
        analysis: false
    
    

    2.3 结果显示

    1609573117096

    获得结果会保存在这个文件夹

    1609573904556

    2.4 主要代码展示

    package com.ocr.paddle;
    
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    import com.google.common.collect.Lists;
    import com.ocr.paddle.domain.LocalHubOcrResultDTO;
    import com.ocr.paddle.domain.OCRHubResultDTO;
    import com.utils.Base64Util;
    import com.utils.FileUtil;
    import com.utils.HttpClientUtils;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.lang3.StringUtils;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    import java.util.Map;
    import java.util.stream.Collectors;
    
    @Slf4j
    public class LocalHubOcrUtils {
    
        public static List<LocalHubOcrResultDTO> localAllOcr(String textUrl, String faceUrl, List<File> allFiles) {
            long l = System.currentTimeMillis();
            List<LocalHubOcrResultDTO> localOcrResultDTOList = Lists.newArrayList();
            int urlCount = 0;
            boolean useTextUrl = false;
            boolean useFaceUrl = false;
            if (StringUtils.isEmpty(textUrl)) {
                log.info("不进行文字识别");
            } else {
                urlCount++;
                useTextUrl = true;
                log.info("需要进行文字识别");
            }
            if (StringUtils.isEmpty(faceUrl)) {
                log.info("不进行人脸识别");
            } else {
                urlCount++;
                useFaceUrl = true;
                log.info("需要进行人脸识别");
            }
            int ocrCount = allFiles.size() * urlCount;
            log.info("预估进行OCR" + ocrCount + "次");
            if (ocrCount == 0) {
                return localOcrResultDTOList;
            }
    
            int textIndex = 0;
            int faceIndex = 0;
            // 本地文件路径
            Map<String, String> partentFile = allFiles.stream().collect(Collectors.toMap(File::getName, File::getParent, (e1, e2) -> e1));
            for (File imageFile : allFiles) {
                List<OCRHubResultDTO> ocrHubResultDTOS = Lists.newArrayList();
    
                byte[] imgData = new byte[0];
                try {
                    imgData = FileUtil.readFileByBytes(imageFile);
                } catch (IOException e) {
                    log.error("图片读取错误");
                    continue;
                }
                String imgStr = Base64Util.encode(imgData);
                JSONObject jsonObject = new JSONObject();
                List<String> imageParams = Lists.newArrayList();
                imageParams.add(imgStr);
                jsonObject.put("images", imageParams);
    
                String textResult = "";
                if (useTextUrl) {
                    textResult = HttpClientUtils.sendJsonStr(textUrl, jsonObject.toJSONString());
                    textIndex++;
                    log.info("已进行文字OCR" + textIndex + "次");
                    if (StringUtils.isEmpty(textResult)) {
                        log.error("获取文字接口失败");
                        log.info("还需进行" + (ocrCount - faceIndex - textIndex) + "次");
                        continue;
                    }
                    JSONObject resultTest = (JSONObject) JSONObject.parse(textResult);
                    JSONArray textResultsArray = resultTest.getJSONArray("results");
                    if (textResultsArray == null){
                        log.error("返回值错误,错误信息为:" + textResult);
                    }
    
                    for (Object o : textResultsArray) {
                        JSONObject j = (JSONObject) o;
                        JSONArray data = j.getJSONArray("data");
                        for (Object datum : data) {
                            JSONObject jo = (JSONObject) datum;
                            jo.remove("text_box_position");
                            OCRHubResultDTO ocrHubResultDTO = jo.toJavaObject(OCRHubResultDTO.class);
                            ocrHubResultDTOS.add(ocrHubResultDTO);
                        }
                    }
    
                }
                int faceCount = 0;
                String faceResult = "";
                if (useFaceUrl) {
                    faceResult = HttpClientUtils.sendJsonStr(faceUrl, jsonObject.toJSONString());
                    faceIndex++;
                    log.info("已进行人脸OCR" + faceIndex + "次");
                    if (StringUtils.isEmpty(faceResult)) {
                        log.error("获取人脸识别接口失败");
                        log.info("还需进行" + (ocrCount - faceIndex - textIndex) + "次");
                        continue;
                    }
                    JSONObject resultFace = (JSONObject) JSONObject.parse(faceResult);
                    JSONArray faceResultsArray = resultFace.getJSONArray("results");
                    for (Object o : faceResultsArray) {
                        JSONObject j = (JSONObject) o;
                        JSONArray data = j.getJSONArray("data");
                        faceCount = data.size();
                    }
                }
    
                log.info("还需进行" + (ocrCount - faceIndex - textIndex) + "次");
                localOcrResultDTOList.add(new LocalHubOcrResultDTO(imageFile.getAbsolutePath(), imageFile.getParent(), ocrHubResultDTOS, faceCount));
            }
            log.info("OCR 总耗时" + (System.currentTimeMillis() - l) / 1000 + "S");
            log.info("OCR 次数" + ocrCount + "次");
            log.info("OCR 平均耗时" + (System.currentTimeMillis() - l) / 1000 / ocrCount + "s");
            return localOcrResultDTOList;
        }
    
        private static void func(File file, List<File> fileList) {
            File[] fs = file.listFiles();
            for (File f : fs) {
                if (f.isDirectory()) {
                    //若是目录,则递归打印该目录下的文件
                    func(f, fileList);
                }
                if (f.isFile()) {
                    String imageName = f.getName();
                    boolean isJpg = imageName.endsWith(".jpg");
                    boolean isJPG = imageName.endsWith(".JPG");
                    boolean isPng = imageName.endsWith(".png");
                    if (isJPG || isPng || isJpg) {
                        //若是图片加入列表
                        fileList.add(f);
                    }
                }
            }
        }
    }
    
    

    sJpg = imageName.endsWith(".jpg");
    boolean isJPG = imageName.endsWith(".JPG");
    boolean isPng = imageName.endsWith(".png");
    if (isJPG || isPng || isJpg) {
    //若是图片加入列表
    fileList.add(f);
    }
    }
    }
    }
    }

    
    
    展开全文
  • java ocr图片文字识别,使用谷歌 tesseract3.02 OCR引擎以及Leptonica库光学字符识别。使用Java包装程序tes4j和Java应用程序,内有英文库,如果需要其他tesseract3.02字体文件,可以访问...
  • java图片识别文字

    2021-03-16 21:19:25
    package ...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...
  • Linux、Windows、Android、Mac各操作平台的jar包。
  • 使用Java识别图片中的文字 包括中文 英文 是用text4j
  • 图片OCR识别文字,通过图片识别文字java -jar jar包名称 运行
  • JAVA识别图片中的文字

    2021-02-12 09:17:38
    最近在需求上有一个识别图片中的文字功能,查询了不少资料,发现可以使用tess4j识别图像文字:话不多说现在开始:首先创建Spring Boot项目:导入以下依赖net.sourceforge.tess4jtess4j3.2.1把下载好的中文识别包放入到...
  • 实现图片中文的识别和获取图片文字的坐标(java实现) 现在利用python来进行图片文字识别较为普遍,但是如果我们利用常用的家庭电脑来识别,需要的时间比较长,达到20~30s,但是如果我们采用javacv这个视觉处理...
  • Tesseract-OCR支持中文识别,并且开源和提供全套的训练工具,是快速低成本开发的首选。前面记录过在java中调用tesseract-orc,该方法的原理是通过在java中调用cmd命令行,来执行tesseract,但是该方式需要下载软件,...
  • java如何实现识别照片中的字符

    千次阅读 2021-02-26 08:54:40
    要么就是只能数字占满整张图片的照片,要么就是类似pdf转成word那样整张照片转换成文本,结果可想而知,全都是乱码。现在主要的问题是这些例子都不能定位出照片中的字符,然后针对这部分字符再单独做识别处理。各位...
  • java文字识别(图片内容转文字)

    千次阅读 2019-03-26 10:39:03
    前两天需要将朋友发的图片上的文字输出到Excel上,结果…因为本人打字本来就不快,所以结果可想而知,所以闲来没事找一找看哪里有图片识别文字的工具,然后在百度ai开放平台上找到了. 话不多说了,就直接上教程: 点进去...
  • 几行java搞定图片提取文字功能
  • java 识别图片中英文

    2018-11-06 13:41:03
    java 识别图片中英文,ocr智能图文识别 tess4j 图文,验证码识别,支持中英文
  • java识别pdf图片中的文字

    热门讨论 2015-03-22 23:26:35
    java识别pdf图片中的文字,代码,demo,都有
  • Java 图片文字识别

    千次阅读 2017-06-13 13:47:04
    连接 Google的 文字识别技术
  • 主要为大家详细介绍了java实现腾讯ocr图片识别接口调用,拍车牌识别车牌号功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java实现图片文字识别的两种方法

    千次阅读 2020-11-04 11:36:50
    一、使用tesseract-ocr  1. https://github.com/tesseract-ocr/tesseract/wiki上...  window64位安装包:tesseract-ocr-w64-setup-v4.1.0.20190314.exe  简体中文训练文件:chi_sim.traineddata 约40M  2.... 3....
  • 您很可能需要执行以下操作:>在整个页面上应用Hough Transform算法,这应该会产生一系列页面...在这种情况下,我建议你看一看JavaCV(OpenCV Java Wrapper),应该允许你处理Hough变换部分。你会需要一些类似于Tess...
  • 识别图片上的文字 相关依赖与工具类 识别效果 目标 根据给定的坐标,在屏幕上截图并保存到指定的目录下; 识别图片中的文字。 概述 利用JDK自带的方法实现截图功能; 利用百度SDK实现文字识别功能。 代码 ...
  • java_批量处理图片文字 开发原因: 最近前端老师布置作业,要求把书上的一章所有案例都抄一遍。本着借鉴的态度,在网上找了一圈资源,没有找到前端书上的案例源代码。因为有扫描版的书籍的pdf文件,想到可以用qq...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,001
精华内容 10,800
关键字:

java识别图片文字