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
然后点击Clone or download,如果你没用gayhub for windows的话,你可以直接点击download Zip
编译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/
当你全部搞定后,你应该有类似下面几个文件
现在你需要做以下事情
1. 安装CMake,然后重启你的电脑。
2.把tesseract解压出来,解压完成后大概是这个样子
解压cppan,然后把解压出来的cppan.exe它分别放在tesseract的目录和cmake的安装目录下,如图1.1,1.2。
图1.1
图1.2
编译Tesseract
一、打开cmd,cd到tesseract的解压目录(为了方便我把tesseract-master重命名为tesseract了)
然后依次输入下面的命令:
1. cppan
2. mkdir build
3. cd build
4. cmake ..
不出意外的话,你应该看到这个:
二、然后进入tesseract目录下的build目录,应该就可以看到visual studio 2015的项目文件了。
三、双击这个项目文件,启动visual studio 2015,在项目中,找到tesseract,点击鼠标右键,将发布版本切换为release,单击build,然后去泡一杯咖啡,慢慢坐着等。
四、假如不出意外的话,你应该看得到这个错误
双击这个错误,找到那个报错的源代码文件,将那个文件用记事本打开,以UTF-8的编码格式保存,没错,就是这个文件
然后重新编译一次,这回不出意外的话,你应该看得到这个
编译结束后,你应该可以在tesseract的文件下找到下面的目录
Tesseract\build\bin\Release
里面的文件类似于这样
使用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
完成后,应该是这个样子。
回到Visual Studio 2015,将额外的include的目录写入项目配置中。
打开__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;
}
载一个验证码图片,鉴于我们使用的是默认的识别库,找一些不大复杂的,例如这个
我将这个文件放在了D:/validateCode.jpg,也就是源代码写的那样。
运行DEMO,结果如下,成功识别了验证码: