大屏25JAVA+selenium+tess4j识别登陆验证码截图与识别 Java 验证码识别库 Tess4j 学习

大屏25JAVA+selenium+tess4j识别登陆验证码截图与识别

https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j javajar
https://jar-download.com/artifacts/org.seleniumhq.selenium/selenium-java/3.4.0/source-code javajar
https://jar-download.com/artifacts/org.seleniumhq.selenium/selenium-java/

 https://mvnrepository.com/artifact/com.github.jai-imageio/jai-imageio-core/1.4.0

Java Tesseract-OCR 4.0 windows 测试图像识别:这里需要注意Tesseract-OCR 3.0.1以上才支持中文。我们拿到网上文章的代码来测试不一定对,但是需要找出为什么不对,哪里不对,从而可以解决很多疑惑。

文字识别可应用于许多领域,如阅读、翻译、文献资料的检索、信件和包裹的分拣、稿件的编辑和校对、大量统计报表和卡片的汇总与分析、银行支票的处理、商品发票的统计汇总、商品编码的识别、商品仓库的管理,以及水、电、煤气、房租、人身保险等费用的征收业务中的大量信用卡片的自动处理和办公室打字员工作的局部自动化等。以及文档检索,各类证件识别,方便用户快速录入信息,提高各行各业的工作效率。

Tesseract-OCR 4.0 windows版本安装

下载地址:
win32 :https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w32-setup-v4.0.0-beta.1.20180608.exe
win64 :https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-v4.0.0-beta.1.20180608.exe
==========================================================================================
Java文字识别程序的关键是寻找一个可以调用的OCR引擎。
tesseract-ocr就是一个这样的OCR引擎,在1985年到1995
年由HP实验室开发,现在在Google。tesseract-ocr 3.0
发布,支持中文。不过tesseract-ocr 3.0不是图形化界面
的客户端,别人写的FreeOCR图形化客户端还不支持导入新
的 3.0 traineddata。但这标志着,现在有*的中文OCR
软件了。
==========================================================================================
参考地址:https://www.jb51.net/article/91499.htm
==========================================================================================
java中使用tesseract-ocr3.01的步骤如下:

1.下载安装tesseract-ocr-setup-3.01-1.exe(3.0以上版本才增加了中文识别)

2.在安装向导中可以选择需要下载的语言包。

3.到网上搜索下载java图形处理所需的2个包:jai_imageio-1.1-alpha.jar,swingx-1.6.1.jar
==========================================================================================
Github:https://github.com/tesseract-ocr/tesseract/wiki/4.0-with-LSTM#400-alpha-for-windows

============================================4.0.0=========================================
安装说明:
https://jingyan.baidu.com/article/219f4bf788addfde442d38fe.html
https://www.cnblogs.com/jianqingwang/p/6978724.html
===========================================================================================
Path环境配置:

变量配置:

Java图像识别测试代码

maven pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.boonya.ocr</groupId>
<artifactId>OcrDemo</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
<!-- https://mvnrepository.com/artifact/com.sun.media/jai_imageio -->
<dependency>
<groupId>com.sun.media</groupId>
<artifactId>jai_imageio</artifactId>
<version>1.1</version>
</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.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.swinglabs/swingx -->
<dependency>
<groupId>org.swinglabs</groupId>
<artifactId>swingx</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>

</project>
ImageUtil.java


————————————————
版权声明:本文为CSDN博主「boonya」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/boonya/article/details/81296827

  1. 1:读取本地图片:
  2.  
     
  3.  
           File file = new File(”001.jpg“);//本地图片
  4.  
     
  5.  
           BufferedImage image=(BufferedImage)ImageIO.read(file);
  6.  
     
  7.  
    2:读取一张网上图片:
  8.  
     
  9.  
          URL url= new URL(”http://*******“);//url 为图片的URL 地址
  10.  
     
  11.  
         BufferedImage image=(BufferedImage)ImageIO.read(url);
  12.  
     
  13.  
    3:获取图片的每个像素点的像素值(获取个点像素值是后期图片操作的基础):
  14.  
     
  15.  
         //获取图像的宽度和高度
  16.  
         int width = bi.getWidth();
  17.  
         int height = bi.getHeight();
  18.  
         int [] pot = new int[width*height];
  19.  
        
  20.  
         int k=0;
  21.  
         for(int i=0;i<height;i++){
  22.  
           for(int j=0;j<width;j++){//行扫描
  23.  
            pot[k] = bi.getRGB(j, i);
  24.  
              k++;
  25.  
          System.out.println(pot[i]);
  26.  
        }
  27.  
     
  28.  
    4:计算图片保存后的大小:
  29.  
     
  30.  
        要计算图片保存时的大小,一种简单的方法就是计算图片的输出刘的大小;将输出流转为 一个 byte 数组;然后计算数组的长度:
  31.  
     
  32.  
       image=(BufferedImage)ImageIO.read(url);
  33.  
      ByteArrayOutputStream out =new ByteArrayOutputStream();
  34.  
       ImageIO.write(image,"png",out);//png 为要保存的图片格式
  35.  
      byte[] barray = out.toByteArray();
  36.  
     
  37.  
      out.close();
  38.  
     
  39.  
    System.out.println(barray.length)
 
 
 

前面的文章写了如何右键另存为图片,把验证码存为图片后,接下来就是要作,怎么把图片上的内容获取到,借住tesseract工具html

1.下载tesseract:http://sourceforge.net/projects/tesseract-ocr/java

2.安装tesseract,安装成功后,最好重启电脑,由于eclipse要读取path,在cmd输入tesseract.exe,出现参数列表则安装成功(不出现的话,就查看下系统path下是否有安装路径)web

3.将tesseract.exe命令保存为bat文件,bat内容为chrome

@echo off
tesseract.exe yzm.png 1 -l
exit

验证码图片的位置最后放在项目的根目录下apache

4.java调用该bat文件app

    String cmd = "cmd /c start d://yanzhengm.bat";
      try {
		Runtime.getRuntime().exec(cmd);
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		
	} 

运行成功后,会生成一个1.txt文件,该文件保存了验证码的文本内容eclipse

5.java读取文件得到文本内容ide

二:上面的方法是右键另存为保存验证码图片后,再识别图片验证码,下面介绍用坐标的方法保存验证码图片工具

package com.imgyzm;

import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.Point;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.io.FileHandler;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

/** 
 * @author QiaoJiaofei 
 * @version 建立时间:2015年8月27日 上午10:29:57 
 * 类说明 
 */
public class TestYzmByElementPoint {
    WebDriver dr;
    @BeforeTest
    public void before() {
        String key = "webdriver.chrome.driver";
        String value = "D:/BaiduYunDownload/selenium/chromedriver.exe";
        System.setProperty(key, value);
        dr = new ChromeDriver();
        dr.manage().window().maximize();
    }
    
    @Test
    public void test1() {
        dr.get("http://172.16.30.242:5555/register.shtml");
        WebDriverWait wait = new WebDriverWait(dr,10);
        WebElement element = wait.until(new ExpectedCondition<WebElement>() {

            @Override
            public WebElement apply(WebDriver arg0) {
                // TODO Auto-generated method stub
                return arg0.findElement(By.id("codeimg"));
            }
            
        });
        File scrFile = ((TakesScreenshot)dr).getScreenshotAs(OutputType.FILE);
        //WebElement element = dr.findElement(By.id("codeimg"));

        try {
            Point p = element.getLocation();
            int width = element.getSize().getWidth();
            int higth = element.getSize().getHeight();
            Rectangle rect = new Rectangle(width, higth);
            BufferedImage img = ImageIO.read(scrFile);
            BufferedImage dest = img.getSubimage(p.getX(), p.getY(), width, higth);
            ImageIO.write(dest, "png", scrFile);
            Thread.sleep(1000);
            File fng = new File("D:/ddd/yzm.png");
            if(fng.exists()){
                fng.delete();
            }
            FileUtils.copyFile(scrFile, fng);
            
            Runtime rt = Runtime.getRuntime();
            rt.exec("cmd.exe /C  tesseract.exe D:\ddd\yzm.png  D:\ddd\yzm -1 ");
            Thread.sleep(1000);
            File file = new File("D:\ddd\yzm.txt");
            if(file.exists()) {
                FileHandler fh = new FileHandler();
                String s = fh.readAsString(file).trim();
                System.out.println(s);
            } else {
                System.out.print("yzm.txt不存在");
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }        
    }
    @AfterTest
    public void after() {
        dr.quit();
    }
}
 
 

做界面自动化时,很需要截图功能,譬如在异常发生时或者验证点失败时,这样可以快速的定位失败原因,但是如果使用界面截图的方式虽然会把这个屏幕截下来,但是缺点在于机器不能睡眠,如果睡下去则会发现截图是黑的;
其实我们可以使用selenium的截图功能,这种方式只会截取网站的部分(如顶部的浏览器输入框之类则不会截取),其优点在于在截图时操作电脑不会影响截图,未登录状态也受影响;
方法如下(driver为实例化webdriver):

File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
1
而后再用commons-io包中的copyFile方法将其保存下来即可(savePath为文件保存路径);

FileUtils.copyFile(f, new File(savePath));
1
元素截图的方法为先全屏截图,然后根据元素坐标进行剪切,代码如下:

driver.get("http://www.google.com");
WebElement ele = driver.findElement(By.id("hplogo"));

// Get entire page screenshot
File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
BufferedImage fullImg = ImageIO.read(screenshot);

// Get the location of element on the page
Point point = ele.getLocation();

// Get width and height of the element
int eleWidth = ele.getSize().getWidth();
int eleHeight = ele.getSize().getHeight();

// Crop the entire page screenshot to get only element screenshot
BufferedImage eleScreenshot= fullImg.getSubimage(point.getX(), point.getY(),
eleWidth, eleHeight);
ImageIO.write(eleScreenshot, "png", screenshot);

// Copy the element screenshot to disk
File screenshotLocation = new File("C:\images\GoogleLogo_screenshot.png");
FileUtils.copyFile(screenshot, screenshotLocation);
————————————————
版权声明:本文为CSDN博主「df0128」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/df0128/article/details/80348729

【在用java的Jsoup做爬虫爬取数据时遇到了验证码识别的问题(基于maven),找了网上挺多的资料,发现Tess4j可以自动识别验证码,在这里简单记录下学习过程及遇到的一些问题。】

步骤:

  1. 把tessreact项目里面的tessdata文件夹提取出来放在某个位置:https://github.com/tesseract-ocr/tesseract
  2. 需要在步骤一的tessdata文件中加入相关语言包(训练文件),在这里下载:https://github.com/tesseract-ocr/tessdata ,如果是简单的英文数字验证码,下载 eng.traineddata然后放到文件夹里即可,中文的是chi开头的traineddata。
  3. 导入相关依赖,maven相关依赖如下:
大屏25JAVA+selenium+tess4j识别登陆验证码截图与识别
Java 验证码识别库 Tess4j 学习
<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>4.2.1</version>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.tess4j</groupId>
            <artifactId>tess4j</artifactId>
            <version>4.1.1</version>
            <exclusions>
                <exclusion>
                    <groupId>com.sun.jna</groupId>
                    <artifactId>jna</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
大屏25JAVA+selenium+tess4j识别登陆验证码截图与识别
Java 验证码识别库 Tess4j 学习

4,编写相关代码(自测可正常运行):

大屏25JAVA+selenium+tess4j识别登陆验证码截图与识别
Java 验证码识别库 Tess4j 学习
package yanZhengMaTest.pikachu;

import java.io.File;

import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

public class Test {    
    public static void main(String[] args) {
        
        //验证码图片存储地址
        File imageFile = new File("C:\Users\pc\Desktop\1.gif");
        if(!imageFile.exists()){
            System.out.println("图片不存在");;
        }
        Tesseract tessreact = new Tesseract();
        tessreact.setDatapath("F:\Program Files (x86)\Tesseract-OCR\tessdata");
        
        String result;
        try {
            result = "测验结果:" + tessreact.doOCR(imageFile);
            System.out.println(result);
        } catch (TesseractException e) {
            e.printStackTrace();
        }
        
    }
}
大屏25JAVA+selenium+tess4j识别登陆验证码截图与识别
Java 验证码识别库 Tess4j 学习

出现异常及处理

(本人因为开始的时候没用maven导入依赖,自己去下载了各种网上要的jar包去导入,遇到了一堆问题,最后卡在了Invalid memory access这个异常上,后来通过换成maven项目并解决了异常)

A.【Exception in thread "main" java.lang.Error: Invalid memory access:】

     如果出现类似于 Invalid memory access的异常

(1). 首先你先确定JAVA代码中:

tessreact.setDatapath("F:\Program Files (x86)\Tesseract-OCR\tessdata");

这里的地址要填你步骤一下载的tessdata文件夹地址。

(2). 如果地址无误,那可能是你tess4j依赖的版本太低,需重新导入依赖,在pom中修改即可。

B.【Exception in thread “main” java.lang.UnsupportedClassVersionError: net/sourceforge/tess4j/Tesseract:】

     发生该异常的原因是JDK版本低于1.7,使用1.7以上即可解决问题。

C.【出现图片非法异常】:可能是你图片有问题,换张图片试试,下载的图片不要去修改它的后缀,否则也可能报错。

痛的领悟

不要直接用java项目自己去导入相关jar包,直接用maven项目去加入依赖包就好,否则可能会出现一堆莫名其妙的异常,个人觉得是因为maven项目依赖包导入时还会导入其他jar包,java项目则需要自己去补增一些jar包,在此建议用maven。

附:

tess4j相关视频:http://tphangout.com/how-to-use-the-tesseract-api-to-perform-ocr-in-your-java-code/

Tesseract-orc-setup下载地址(非必要):https://digi.bib.uni-mannheim.de/tesseract/

Tesseract-orc-setup安装过程(非必要):https://jingyan.baidu.com/article/219f4bf788addfde442d38fe.html

Tesseract-orc环境配置(非必要):https://www.cnblogs.com/jianqingwang/p/6978724.html

 可识别验证码示例:http://es.bnuz.edu.cn/checkcode.aspx?0.33556625493951997/