美文网首页
Java使用test4j识别验证码

Java使用test4j识别验证码

作者: 国内不知名程序员 | 来源:发表于2019-04-16 10:53 被阅读0次

    Java使用test4j识别验证码

    test4j的集成

    • 此处使用了拷入test4j的项目文件集成到自己的项目中去。

    1.去test4j官网下载test4j的zip文件(我下载的是3.4.8的版本);

    2.解压缩文件,得到以下目录


    需要拷贝到项目中的文件.png

    3.把lib里面的jar包加入项目中,scr下的代码文件copy到项目中,tessdata文件copy到项目中(跟src同级目录)。(tessdata就是训练文件,英文识别较为准确,中文识别准确率一般)
    4.dist 目录下的test4j-3.4.8.jar文件添加到项目中;
    5.识别验证码

    import java.io.File;
    
    import net.sourceforge.tess4j.ITesseract;
    import net.sourceforge.tess4j.Tesseract;
    import net.sourceforge.tess4j.TesseractException;
    
    public class Test {
        public static void main(String[] args) {
            System.out.println("HelloWord");
            // 1.创建 ITesseract 验证码识别类
            ITesseract instance = new Tesseract();
            // 2.创建文件
            File newFile = new File("my//我是1.jpg");
            // 3.开始识别
            try {
                String codeString = instance.doOCR(newFile);
                System.out.println("识别内容是:" + codeString);
            } catch (TesseractException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    1. 关于错误:Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'libtesseract304': Native library (win32-x86-64/libtesseract304.dll) not found in resource path;
      只要是按照我这个方法来集成一般不会出现这种问题,出现这种问题有可能是因为test4j的jar文件导致的,一定要去官网下载,尽可能不去copy别人项目中的;
    • 解决方法:你在官网下载的zip文件lib目录中有一个(win32-x86-64)的文件夹,把他拷贝到项目的bin目录下就行了;
    • 注意不同版本的(win32-x86-64)文件下的那个文件名可能不一致;(版本有差异)
      例如:
      test4j 3.4.8版本下(lib/win32-x86-64)文件夹下的名字是:libtesseract3051.dll
      test4j 3.1版本下(lib/win32-x86-64)文件夹下的名字是:libtesseract304.dll

    7.test4j 不识别问题,图片的格式改成 jpg,


    带背景验证码.jpg 简单验证码.png

    能识别带背景的验证码,却不能识别只有几个噪点的验证码,我用ps改成jpg格式的立马就识别出来了

    验证码的预处理

    • 虽然test4j可以识别一些简单验证码,对于复杂的识别率还是不高,为了提高识别成功率,识别前,对图片进行处理,例如去除噪点,去除背景线等;
    • 我这边只需要实现识别简单验证码的功能,所以我的这个预处理不一定适合你。
    • 上面简单验证码的特点分析:验证码数字是红色不会变,背景纯白色,有一些零散的噪点,噪点的颜色不确定,彩色噪点;
    • 实现思路:遍历每一个像素点,判断是不是红色Rgb(255,0,0)的(说明是验证码的颜色),转化为黑色,其他颜色转化为白色,这样识别成功率大大提高,得到的验证码如下:


      改变颜色之后的验证码.jpg
    /**
         * 去除噪点
         * 
         * @param img 需要去除噪点的文件
         */
        private static void getAuthCode() {
            BufferedImage img = ImageIO.read(new File("my//" + fileName));
            // 获取图片的高宽
            int width = img.getWidth();
            int height = img.getHeight();
    
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    Color color = new Color(img.getRGB(x, y));
                    // System.out.println("我是颜色:::" + color + "我是位置x:" + x + ",y=" + y);
    
                    // 判断色值是不等于白色,不等于白色进行下一步判断(其他颜色)
                    if (color.getRGB() != Color.WHITE.getRGB()) {
    
                        // 判断颜色是否等于红色,(红色就是验证码的颜色)
                        if (color.getRGB() == Color.RED.getRGB()) {
                            // 等于红色设置为黑色
                            img.setRGB(x, y, Color.BLACK.getRGB());
                        } else {
                            // img.setRGB(x, y, Color.white.getRGB());
                            // 不等于红色,设置为白色
                            img.setRGB(x, y, Color.WHITE.getRGB());
                        }
                    } else {
                        // 是白色,继续设置为白色
                        img.setRGB(x, y, Color.WHITE.getRGB());
                        // System.out.println("else执行了吗");
                    }
                }
            }
    
        }
    
    //图片转化格式
    BufferedImage img;
                try {
                    img = ImageIO.read(new File("png图片地址xx.png"));
    
                    if (!newFile.exists()) {
                        File dir = newFile.getParentFile();
                        if (!dir.exists()) {
                            dir.mkdirs();
                        }
                        newFile.createNewFile();
                            //保存为jpg格式
                        ImageIO.write(img, "jpg", newFile);
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
    • 欢迎留言沟通交流,下一篇准备写去除噪点的文章。
    • End

    相关文章

      网友评论

          本文标题:Java使用test4j识别验证码

          本文链接:https://www.haomeiwen.com/subject/iisvwqtx.html