大家都知道到处都在收集苏康码,个人只管上传,管理者统计起来有点麻烦。虽然看一眼知道大家传过来都是绿色的没问题,有问题肯定被拉走了。但是不能这么汇报,还是要统计出来哪些人上传。好吧,这里就要用OCR (Optical Character Recognition,光学字符识别),电脑自动识别图片,输出结果是哪些人提交来了图片。

新建个maven版本的java工程,将依赖放入pom文件

<dependency>
        <groupId>net.sourceforge.tess4j</groupId>
        <artifactId>tess4j</artifactId>
        <version>4.3.1</version>
    </dependency>

准备图文识别的文字训练库,有这个能识别的更准确


训练库下载 https://github.com/tesseract-ocr/tesseract * 将 tessreact 项目里面的 tessdata 文件夹剪切到 "/home/tessdata"待用。 * 语言包下载 https://github.com/tesseract-ocr/tessdata * 如果是简单的英文数字验证码识别,解压后将 eng.traineddata 放到上面 tessdata 文件夹里即可。 * 要识别中文,还需要将 chi 开头的 traineddata 复制到上面 tessdata 文件夹里。


下面是参考java调用代码,路径是linux下自己新建文件夹,可自定义

/**
   
     * 识别图片中文字
    */
    public void identifyTextFromImg(String srcFile){
        File imageFile = new File(srcFile );
        Tesseract tessreact = new Tesseract();
        tessreact.setLanguage("chi_sim");
        tessreact.setDatapath("/home/tessdata/");
        String result;
        try {
            result = "识别结果:" + tessreact.doOCR(imageFile);
            System.out.println(result);
            identifyText(result);
        } catch (TesseractException e) {
            e.printStackTrace();
        }
    }

经过使用发现人名不易识别,通过比较结论部分,发现是苏康码人名部分底色加大了识别难度,好吧,那就把图片更新为单色位图

/**
     * 转图片为单色位图
     */
    public void changeImg(String srcFile , String desFile){
        try {
            BufferedImage src = ImageIO.read(new File(srcFile));
            int width = src.getWidth();
            int height = src.getHeight();
            Image image = src.getScaledInstance((int) (width), (int) (height), Image.SCALE_DEFAULT);
            BufferedImage tag = new BufferedImage((int) (width), (int) (height), BufferedImage.TYPE_BYTE_GRAY);
            Graphics2D g = tag.createGraphics();
            g.drawImage(image, 0, 0, null);
            g.dispose();
            OutputStream out = new FileOutputStream(desFile);
            ImageIO.write(tag, "JPG", out);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

经过试用发现这样识别率大大提高,基本上能得到人名一行和结论那一行,下面就把这2行分析出来

/**
     * 分析文字
     */
    public void identifyText(String text){
        String[] lines=text.split("\n") ;
        for(String str : lines){
            if(str.contains("******")){
                String[] names=str.split(" ");
                System.out.println(names[0]);
            }
            if(str.contains("色")){
                if(str.contains("绿")||str.contains("手")||str.contains("风")||str.contains("口")){
                    System.out.println("绿");
                }else if(str.contains("黄")||str.contains("时")||str.contains("关")||str.contains("自")){
                    System.out.println("黄");
                }else if(str.contains("红")||str.contains("医")||str.contains("学")||str.contains("天")){
                    System.out.println("红");
                }else{
                    System.out.println("其他");
                }
            }
        }
    }

这样就基本完成了,实际使用的话可能是要分析一个文件夹下文件,把所有图片文件转成单色位图放到另一个文件夹,然后循环识别单色位图,最后输出结果。如果使用发现中文识别还是有问题的话就自建人名和身份证号对应关系,人名不易识别,但是身份证号前3位加后3位还是基本上都能识别到。