最近自己的小项目需要识别image中的数字,查阅了很多文章, tesseract 比较合适。 主要原因:1. 全部开源,有什么问题可以看代码解决;2. 很多人在使用,倍受欢迎;3. 跨平台,在Linux和Windows都可以使用。
然而很快发现:
- 我的电脑比较老windows10+ VS2015, 升级VS2015电脑空间不够,也没有VS2019或VS2011的安装软件。
- github上tesseract的Windows 版本的下载后, 只有tesseract编译后生成的很多可执行exe文件,没有我需要lib、dll和include文件。
- github上有一个windows 版源码repo, 但tesseract版本太老(3.5.x),其中包含了我需要的lib、dll和头文件。但很多数字识别成英文字母(如:9识别为g), 也不能设置纯数字。
- github 上的源码编译脚本是用cmake写的, 默认生成的是静态库。静态库又不能在vs2015 project 中直接使用,因为lib中找不到调用接口, 研究了半天是gcc生成的lib 不能被VS2015直接引用。
基于上面种种原因,和多日的琢磨探索。还是决定用最新的Tesseract-5.4.1的缺省编译脚本cmake编译出windows下需要的 lib、dll和include文件。各种失败的探索就不在此阐述, 直接陈述可行方案和具体不走。
- 现在GUN Windows 编译环境 MINGW64. MINGW64的下载安装网上有很多文章在此略过。
- 在MINGW64环境下,即home目录下(/home/mark/)下载libleptonica-1.78.0(最新版)。下载后路径 /home/mark/leptonica/
- 创建/home/mark/leptonica/vs2015, 并在此目录下运行:
#cmake .. -G"MinGW Makefiles" -DSW_BUILD=0 -DCMAKE_GNUtoMS=ON -DCMAKE_INSTALL_PREFIX=/usr/local #cmake --build . --config Release --target install
- 这样生成的头文件在 /usr/local/include/leptonica, lib是 /usr/local/lib/libleptonica-1.78.0.lib, dll是 /usr/local/bin/libleptonica-1.78.0.dll。 这些文件在VS2015中需要用到。
下面是下载并编译tessact.
- 下载最新的tesseract. https://github.com/tesseract-ocr/tesseract, 目前Release的最新版是5.4.1
- 下载完路径/home/mark/tesseract
- 创建/home/mark/tessract/vs2015
- 在/home/mark/tesseract/CMakeList.txt 头上添加下面的代码(和命令行优点冗余,没有关系,想精简可以逐条删除试试):
--- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,14 @@ if("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}") "\n cd build" "\n cmake ..") endif() +set(CMAKE_GNUtoMS ON) +set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) +set(CMAKE_BUILD_TYPE "Release") +set(BUILD_SHARED_LIBS ON) +set(LIBRARY_TYPE SHARED) +if (STATIC) + set(LIBRARY_TYPE) +endif()
- 在vs2015目录下运行下面两条命令:
#cmake .. -G"MinGW Makefiles" -DSW_BUILD=0 -DCMAKE_GNUtoMS=ON -DCMAKE_INSTALL_PREFIX=/usr/local #cmake --build . --config Release --target install
- 编译后生成的lib: /usr/local/lib/libtesseract54.lib, dll: /usr/local/bin/libtesseract54.dll, 头文件在/usr/local/include/tesseract
这样Windows VS2015需要的两个库的头文件、lib、dll就全生成了。把这些copy到vs2015 project 中的相应目录就可以测试了。 注意测试代码用官方给的测试代码不能工作, 官方代码:
char *outText;
tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
// Initialize tesseract-ocr with English, without specifying tessdata path
if (api->Init("./tessdata", "eng")) {
fprintf(stderr, "Could not initialize tesseract.\n");
exit(1);
}
// Open input image with leptonica library
Pix *image = pixRead("test.png");
api->SetImage(image);
// Get OCR result
outText = api->GetUTF8Text();
printf("OCR output:\n%s", outText);
所有的这些API 又封装了一层, 然后通过DLL暴露出来,如下的代码是可以跑通的。
sApi = TessBaseAPICreate();
// Initialize tesseract-ocr with English, without specifying tessdata path
if (TessBaseAPIInit2(sApi, NULL, "eng", tesseract::OEM_DEFAULT)){
::MessageBox(NULL, TEXT("初始化tess失败"), TEXT("data 没找到"), MB_OK);
return;
}
if (!TessBaseAPISetVariable(sApi, "tessedit_char_whitelist", "0123456789")) {
::MessageBox(NULL, TEXT("初始化设置识别数字失败"), TEXT("识别数字设置失败"), MB_OK);
return;
}
char *text = NULL;
TessBaseAPISetImage2(sApi, pixRead("test.png"));
text = TessBaseAPIGetUTF8Text(sApi);
这样在VS2015的环境下就可以使用最新的tesseract.
最后把编译后的最新的tesseract的头文件、lib和dll 也attach上。 以便直接使用。