java实现识别图片上的文字(OCR识别身份证等证件信息)

利用第三方jar包,实现识别图片上的文字。第三方支持地址:Spire.OCR for Java | 专业的图文识别组件,用以读取图片格式中的文本Spire.OCR for Java 是专为 Java 开发者设计的强大OCR库,提供高效的文字识别功能,能够从图像中准确识别和提取文本。icon-default.png?t=N7T8https://www.e-iceblue.cn/Introduce/Spire-OCR-JAVA.html

1.maven项目,添加依赖

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.ocr</artifactId>
    <version>1.9.0</version>
</dependency>

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>

2.根据服务器类型,下载相关依赖文件

linux

windows

3.编写demo代码

    @Test
    public void getText() throws OcrException {
        //指定依赖文件的路径
        String dependencies = "dependencies/";
        //指定要需要扫描的图片的路径
        String imageFile = "C:\\Users\\user\\Desktop\\3.jpg";
        //指定输出文件的路径
        String outputFile = "test.txt";

        //创建OcrScanner对象,并设置其依赖文件路径
        OcrScanner scanner = new OcrScanner();
        scanner.setDependencies(dependencies);

        //扫描指定的图像文件
        scanner.scan(imageFile);
        //获取扫描的文本内容
        String scannedText = scanner.getText().toString();
        System.out.println(scannedText);
    }

4.扩展

根据图片OCR识别,来获取身份证等证件图片上的信息,并用正则表达式解析识别的文字

    @Test
    public void testIdcard() throws OcrException {
        String filePath = "C:\\Users\\85753\\user\\idcard\\";
        for (int i = 1; i < 11; i++) {
            long startTime = System.currentTimeMillis();
            HashMap<String, String> hashMap = idCardOCR(filePath + i + ".jpg");
            long endTime = System.currentTimeMillis();
            System.out.println(hashMap);
            System.out.println("一共耗时:" + (startTime - endTime) + "毫秒!");
        }
    }

    public HashMap<String, String> idCardOCR(String filePath) throws OcrException {
        //指定依赖文件的路径
        String dependencies = "dependencies/";
        //指定要需要扫描的图片的路径
        String imageFile = filePath;

        //创建OcrScanner对象,并设置其依赖文件路径
        OcrScanner scanner = new OcrScanner();
        scanner.setDependencies(dependencies);
        scanner.scan(imageFile);//扫描指定的图像文件

        //获取扫描的文本内容
        String scannedText = scanner.getText().toString();

        // 去除换行,去除无用数据
        String result = scannedText.replaceAll("\r", "").replaceAll("\n", "");
        result = result.replaceAll("Evaluation Warning : The version can be used only for     evaluation purpose...", "");
        System.out.println(result);

        HashMap<String, String> map = new HashMap<>();
        map = this.dealIDCardText(result);

        return map;
    }

    /**
     * 正则处理识别的身份证数据
     *
     * @param result
     * @return
     */
    public static HashMap<String, String> dealIDCardText(String result) {
        HashMap<String, String> map = new HashMap<>();
        String name = "";
        String sex = "";
        String nation = "";
        String birth = "";
        String address = "";
        String idCard = "";
        // 处理数据(正则表达式获取身份证信息,满足以下一条即可)
        String regex = "姓名(\\S+)民族(\\S+)性别(\\S+)出生(\\d{4}年\\d{1,2}月\\d{1,2}日)住址(\\S+)公民身份号码(\\d{17}[0-9Xx])";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(result);
        String regex2 = "(\\S+)姓名民族(\\S+)性别(\\S+)出生(\\d{4}年\\d{1,2}月\\d{1,2}日)住址(\\S+)(\\d{17}[0-9Xx])公民身份号码";
        Pattern pattern2 = Pattern.compile(regex2);
        Matcher matcher2 = pattern2.matcher(result);
        String regex3 = "姓名(\\S+)性别(\\S+)民族(\\S+)出生(\\d{4}年\\d{1,2}月\\d{1,2}日)住址(\\S+)公民身份号码(\\d{17}[0-9Xx])";
        Pattern pattern3 = Pattern.compile(regex3);
        Matcher matcher3 = pattern3.matcher(result);
        String regex4 = "姓名(\\S+)性别(\\S+)民族(\\S+)出生(\\d{4}年\\d{1,2}月\\d{1,2}日)住址(\\S+)(\\d{17}[0-9Xx])公民身份号码";
        Pattern pattern4 = Pattern.compile(regex4);
        Matcher matcher4 = pattern4.matcher(result);
        String regex5 = "姓名(\\S+)民族(\\S+)性别(\\S+)出生(\\d{4}年\\d{1,2}月\\d{1,2}日)住址(\\S+)(\\d{17}[0-9Xx])公民身份号码";
        Pattern pattern5 = Pattern.compile(regex5);
        Matcher matcher5 = pattern5.matcher(result);
        String regex6 = "(\\S+)姓名性别(\\S+)民族(\\S+)出生(\\d{4}年\\d{1,2}月\\d{1,2}日)住址(\\S+)(\\d{17}[0-9Xx])公民身份号码";
        Pattern pattern6 = Pattern.compile(regex6);
        Matcher matcher6 = pattern6.matcher(result);

        if (matcher.find()) {
            name = matcher.group(1);
            nation = matcher.group(2);
            sex = matcher.group(3);
            birth = matcher.group(4);
            address = matcher.group(5);
            idCard = matcher.group(6);
        } else if (matcher2.find()) {
            name = matcher2.group(1);
            nation = matcher2.group(2);
            sex = matcher2.group(3);
            birth = matcher2.group(4);
            address = matcher2.group(5);
            idCard = matcher2.group(6);
        } else if (matcher3.find()) {
            name = matcher3.group(1);
            sex = matcher3.group(2);
            nation = matcher3.group(3);
            birth = matcher3.group(4);
            address = matcher3.group(5);
            idCard = matcher3.group(6);
        } else if (matcher4.find()) {
            name = matcher4.group(1);
            sex = matcher4.group(2);
            nation = matcher4.group(3);
            birth = matcher4.group(4);
            address = matcher4.group(5);
            idCard = matcher4.group(6);
        } else if (matcher5.find()) {
            name = matcher5.group(1);
            nation = matcher5.group(2);
            sex = matcher5.group(3);
            birth = matcher5.group(4);
            address = matcher5.group(5);
            idCard = matcher5.group(6);
        } else if (matcher6.find()) {
            name = matcher6.group(1);
            sex = matcher6.group(2);
            nation = matcher6.group(3);
            birth = matcher6.group(4);
            address = matcher6.group(5);
            idCard = matcher6.group(6);
        }

        map.put("name", name);
        map.put("sex", sex);
        map.put("nation", nation);
        map.put("birth", birth);
        map.put("address", address);
        map.put("idCard", idCard);

        return map;
    }

注意:因图片识别后的身份证数据顺序不固定,经过多次测试,将可能的结果通过正则表达式来解析。如果符合其中一个正则,就将匹配的数据返回。

参考:如何在 Java 项目中扫描识别图片中的文字

  • 11
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Java可以使用Tesseract OCR库来实现OCR图片识别。下面是一个简单的示例: 1. 下载Tesseract OCR库。可以从官网(https://github.com/tesseract-ocr/tesseract)下载最新版本的Tesseract OCR库。 2. 导入Tesseract OCR库。将下载的Tesseract OCR库导入Java项目中。 3. 安装语言数据。Tesseract OCR库需要使用语言数据才能进行识别。可以从官网下载相应语言的数据文件,并在项目中指定语言数据的路径。 4. 编写Java代码。以下是一个简单的Java代码示例: ```java import net.sourceforge.tess4j.*; public class OCRTest { public static void main(String[] args) { ITesseract instance = new Tesseract(); // JNA Interface Mapping instance.setDatapath("C:/tessdata"); //设置语言数据路径 instance.setLanguage("chi_sim"); //设置识别语言为简体中文 try { String result = instance.doOCR(new File("test.png")); //识别图片 System.out.println(result); //输出识别结果 } catch (TesseractException e) { System.err.println(e.getMessage()); } } } ``` 在上面的代码中,首先创建了一个Tesseract实例,并设置语言数据路径和识别语言。然后使用doOCR方法识别指定的图片,并输出识别结果。 5. 运行代码。将以上代码保存为OCRTest.java文件,然后在命令行中执行以下命令编译和运行代码: ``` javac -cp tess4j.jar OCRTest.java java -cp tess4j.jar;. OCRTest ``` 其中,tess4j.jar是Tesseract OCR库的Java包。注意需要将tess4j.jar和OCRTest.class文件放在同一目录下,并在命令行中设置类路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值