用Tesseract-OCR识别网站图形验证码

时间:2022-03-01 23:28:15
Tesseract简介

OCR是什么?OCR(Optical Character Recognition):光学字符识别,简单来说就是识别图片上的文字获取,然后转换成一些我们需要的编码格式,当然当中的实现与ANN,deep learning有所关系,这是后话了,好用就行。

Tesseract是什么?Tesseract是一款开源的OCR识别引擎,一开始是由HP实验室挖坑的,开源后就给Google进行继续填坑了。最初Tesseract发布在SourceForge,googleCode,不过到今天(2016年12月30日),这个项目基本扎根在gayhub上了。

那么最后Tesseract有什么用?为什么使用Tesseract?显然的验证码识别可以使用Tesseract,至于为什么,当然是因为使用起来非常非常的简单,你不需要任何相关的知识就可以把Tesseract移植到自己的代码中。


如何获取Tesseract

获取Tesseract的方法非常简单,直接登录gayhub就可以了。当然如果你希望下载快一点的话,你应该使用一些*的手段。


一.你可以使用下面的链接来获取tesseract


https://github.com/tesseract-ocr

用Tesseract-OCR识别网站图形验证码 
然后点击Clone or download,如果你没用gayhub for windows的话,你可以直接点击download Zip
用Tesseract-OCR识别网站图形验证码 


编译Tesseract的准备工作

当然光有Tesseract还不够,Windows平台你还需要下面三个工具。


1.Visual studio 2015(至少是2013以后版本),必须支持C++ 11。


你可以在这个连接中下载到Visual Studio 2015:
https://www.visualstudio.com/


2.你还需要cppan和CMake将Tesseract转换为Visual Studio 2015可以编译的项目。


CPPAN下载地址:
https://cppan.org/client/cppan-master-Windows-client.zip
CMAKE下载地址:
https://cmake.org/download/

当你全部搞定后,你应该有类似下面几个文件 
用Tesseract-OCR识别网站图形验证码  现在你需要做以下事情
1. 安装CMake,然后重启你的电脑。
2.把tesseract解压出来,解压完成后大概是这个样子
用Tesseract-OCR识别网站图形验证码 
解压cppan,然后把解压出来的cppan.exe它分别放在tesseract的目录和cmake的安装目录下,如图1.1,1.2。
用Tesseract-OCR识别网站图形验证码      
图1.1
用Tesseract-OCR识别网站图形验证码               
图1.2

编译Tesseract

一、打开cmd,cd到tesseract的解压目录(为了方便我把tesseract-master重命名为tesseract了)
用Tesseract-OCR识别网站图形验证码 


然后依次输入下面的命令:
1. cppan
2. mkdir build
3. cd build
4. cmake ..
不出意外的话,你应该看到这个:
用Tesseract-OCR识别网站图形验证码 

二、然后进入tesseract目录下的build目录,应该就可以看到visual studio 2015的项目文件了。
用Tesseract-OCR识别网站图形验证码 

三、双击这个项目文件,启动visual studio 2015,在项目中,找到tesseract,点击鼠标右键,将发布版本切换为release,单击build,然后去泡一杯咖啡,慢慢坐着等。

用Tesseract-OCR识别网站图形验证码 


四、假如不出意外的话,你应该看得到这个错误
用Tesseract-OCR识别网站图形验证码 

双击这个错误,找到那个报错的源代码文件,将那个文件用记事本打开,以UTF-8的编码格式保存,没错,就是这个文件
用Tesseract-OCR识别网站图形验证码 

然后重新编译一次,这回不出意外的话,你应该看得到这个
用Tesseract-OCR识别网站图形验证码 

编译结束后,你应该可以在tesseract的文件下找到下面的目录
Tesseract\build\bin\Release
里面的文件类似于这样
用Tesseract-OCR识别网站图形验证码 

使用tesseract编程识别验证码

1、打开Visual studio 2015,新建一个空项目,创建一个Main.cpp

2、将Tesseract\build\bin\Release目录下的所有文件拷贝到这个项目目录下。

3.将Tesseract这个目录拷贝到这个项目的文件夹下

4.将C:\Users\你的名字\.cppan这个目录拷贝到项目文件夹下。

5.从这里下载一个tesseract-ocr-3.02.eng英文包:http://download.csdn.net/detail/coverupsorrow/8336781;解压后把解压出来的文件放在Tesseract目录下的tessdata

完成后,应该是这个样子。
用Tesseract-OCR识别网站图形验证码 
回到Visual Studio 2015,将额外的include的目录写入项目配置中。
用Tesseract-OCR识别网站图形验证码 
用Tesseract-OCR识别网站图形验证码 

打开__Main.cpp编写DEMO代码

#pragma comment(lib,"tesseract305.lib")
#pragma comment(lib,"pvt.cppan.demo.danbloomberg.leptonica-1.74.0.lib")
#pragma comment(lib,"pvt.cppan.demo.jpeg-9.2.0.lib")
#pragma comment(lib,"pvt.cppan.demo.openjpeg.openjp2-2.1.2.lib")
#pragma comment(lib,"pvt.cppan.demo.png-1.6.27.lib")
#pragma comment(lib,"pvt.cppan.demo.tiff-4.0.7.lib")
#pragma comment(lib,"pvt.cppan.demo.unicode.icu.common-58.2.0.lib")
#pragma comment(lib,"pvt.cppan.demo.unicode.icu.data-58.2.0.lib")
#pragma comment(lib,"pvt.cppan.demo.unicode.icu.i18n-58.2.0.lib")
#pragma comment(lib,"pvt.cppan.demo.xz_utils.lzma-5.2.2.lib")
#pragma comment(lib,"pvt.cppan.demo.zlib-1.2.8.lib")
 
#include <iostream>
#include <memory>
 
#include <allheaders.h> // leptonica main header for image io
#include <baseapi.h> // tesseract main header
 
int main()
{
 
    tesseract::TessBaseAPI tess;
 
    if (tess.Init("D:\\Validata\\Validata\\tesseract\\tessdata", "eng"))
    {
        std::cout << "OCRTesseract: Could not initialize tesseract." << std::endl;
        return 1;
    }
 
    // setup
    tess.SetPageSegMode(tesseract::PageSegMode::PSM_AUTO);
    tess.SetVariable("save_best_choices", "T");
 
    // read image
    auto pixs = pixRead("D:/validateCode.jpg");//这里自行修改为需要识别的图片
    if (!pixs)
    {
        std::cout << "Cannot open input file" << std::endl;
        return 1;
    }
 
    // recognize
    tess.SetImage(pixs);
    tess.Recognize(0);
 
    // get result and delete[] returned char* string
    std::cout << tess.GetUTF8Text()<< std::endl;
 
    // cleanup
    tess.Clear();
    pixDestroy(&pixs);
    getchar();
    return 0;
}

载一个验证码图片,鉴于我们使用的是默认的识别库,找一些不大复杂的,例如这个
用Tesseract-OCR识别网站图形验证码 

我将这个文件放在了D:/validateCode.jpg,也就是源代码写的那样。
运行DEMO,结果如下,成功识别了验证码:

用Tesseract-OCR识别网站图形验证码