环境:
编译器:VS2017
平台工具集:Visual Studio 2015 (v140)
CMake3.29.0
安装CMake:Windows下CMake安装教程_window 安装cmake-CSDN博客
参考链接:
windows编译和使用tesseract(C++ api)
vs2019+tesseract5.3.2+leptonica1.83.1基于CMake源码编译攻略
tesseract ocr5.3.3源码编译(基于cmake)_tesseract cmake-CSDN博客
C++ zlib库 源码编译及使用(VS2019)-CSDN博客
win10编译libpng_win10 libpng 使用-CSDN博客
编译顺序
我自己的 CMAKE 编译顺序:
1、tiff-4.0.9,地址:http://download.osgeo.org/libtiff/tiff-4.0.9.zip
libtiff-4.5.0,地址:http://download.osgeo.org/libtiff/tiff-4.5.0.zip(最终用的)
2、nasm-2.16.01
地址:https://www.nasm.us/pub/nasm/releasebuilds/2.16.01/win64/nasm-2.16.01-win64.zip3、libjpeg-turbo-2.1.5.1,地址:https://github.com/libjpeg-turbo/libjpeg-turbo/archive/refs/tags/2.1.5.1.zip
4、zlib-1.3.1,地址(官网下载源码):zlib Home Site
5、lpng1643,即 libpng16,地址LIBPNG: PNG reference library - Browse Files at SourceForge.net
6、leptonica-1.83.1,地址:https://github.com/DanBloomberg/leptonica/archive/refs/tags/1.83.1.zip
7、tesseract-5.3.4
---- over
tesseract 依赖于 leptonica ;
leptonica 依赖于 tiff,libjpeg,zlib,libpng 。
所以需注意编译的顺序。
tiff:tiff.h,tiff.dll,tiff.lib
libjpeg-turbo:
问题及解决方案
cmake成功后,用vs编译时可能会碰到的问题及解决方案:
VS2015/2017 C++ 报错解决方案 笔记_vs2015 c++17-CSDN博客
VS2015/2017 C++ 报错解决方案 笔记 ===》8、9、11、13。
C/C+±预处理器-预处理下定义-添加:LIBLEPT_EXPORTS
CMake编译报错: Invalid character escape '\T'. Call Stack (most recent call first)
解决方案:将填入的路径里的“\”全部改成“/”就好。
cmake编译库
编译 libpng
编译 leptonica
cmake配置,勾选Grouped和Advanced,会显示png和tiff等图片库的设置入口,要先将tiff的目录配置进去,使得支持tiff格式
只需添加TIFF_开头的三个就好,“TIFF”无需添加,添加完三个头cmake会自行给你分类。(如下)
CMAKE_INSTALL_PREFIX 表示VS编译生成的库存放目录。
编译 leptonica的时候:这里添加tiff的构建二进制文件时的路径,即在cmake tiff时的build_x64路径,如“E:\Tesseract-ORC\tiff-4.5.0\build_x64”。若这里无法修改的话,可以另外添加tiff_DIR,然后添加路径。否则后面编译tesseract时会显示leptonica构建时没有tiff的支持。
若添加成功了,则后面在cmake tesseract 时,就会有以下提示:
Found leptonica version: 1.83.1
Leptonica was build with TIFF support.
vs生成dll库文件
cmake编译tesseract
填入的路径为:包含 Leptonica 的CMake配置文件的目录。
C/C+±预处理器-预处理下定义-添加:TESS_EXPORTS
总结:
前几个基础依赖库都已全部顺利编译,但在用vs编译Tesseract工程代码时,出现142个全是C开头的报错。如下所示:
网上找寻解决方案无果,故仍未能解决。
语言包下载
语言包下载地址
英文 https://github.com/tesseract-ocr/tessdata/raw/master/eng.traineddata
简中 https://github.com/tesseract-ocr/tessdata/raw/master/chi_sim.traineddata
繁中 https://github.com/tesseract-ocr/tessdata/raw/master/chi_tra.traineddata
python版本安装及调用教程
【逐步实操】Tesseract OCR 最新版本安装教程(Windows)+ 图片PDF转WORD实操_tesseract ocr安装教程-CSDN博客
Tesseract OCR V5.0安装教程(Windows) - 简书 (jianshu.com)
使用库
参考链接:
windows编译和使用tesseract(C++ api)
if (1) {
tesseract::TessBaseAPI ocr;
// Open input image with leptonica library
Pix* pixImage = pixRead("F:\\cxl_demo\\vsDemo\\img\\字符识别\\1721803339026.png");//read testpic
//Pix* pixImage = cvtMat2Pix(imgOriginal);
if (debug) cout << imgOriginal.size() << endl;
ocr.SetImage(pixImage);
const char* lang = "eng";//加载 eng.traineddata
//const char* lang = "chi_sim";
//cv::waitKey();
//ocr.Init(NULL, lang, tesseract::OEM_LSTM_ONLY); // 初始化
ocr.SetPageSegMode(tesseract::PSM_AUTO); // 设置识别模式
//ocr.SetImage(imgOriginal.data, imgOriginal.cols, imgOriginal.rows, 1, imgOriginal.cols);
// Get OCR result
char* outText = ocr.GetUTF8Text();
//std::cout << outText << endl;
printf("OCR output:\n%s", outText);
// Destroy used object and release memory
ocr.End();
delete[] outText;
pixDestroy(&pixImage);
}
cvtMat与Pix互转
参考链接:OpenCV Mat与Leptonica Pix之间的转换-腾讯云开发者社区-腾讯云 (tencent.com)
cvtMat转Pix
Pix* cvtMat2Pix(cv::Mat imgOriginal);
Pix * ImageProcessingTest::cvtMat2Pix(cv::Mat imgOriginal)
{
cv::Mat imgGray;
if (imgOriginal.type() != CV_8UC1)
cv::cvtColor(imgOriginal, imgGray, cv::COLOR_BGR2GRAY);
else imgOriginal.copyTo(imgGray);
int cols = imgGray.cols;
int rows = imgGray.rows;
PIX *pixS = pixCreate(cols, rows, 8);
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
pixSetPixel(pixS, j, i, (l_uint32)imgGray.at<uchar>(i, j));
return pixS;
}
Pix* pixImage = cvtMat2Pix(imgOriginal);
if (debug) cout << imgOriginal.size() << endl;
ocr.SetImage(pixImage);
Pix转cvtMat
cv::Mat Pix2cvtMat(Pix *pix);
cv::Mat ImageProcessingTest::Pix2cvtMat(Pix * pix)
{
int width = pixGetWidth(pix);
int height = pixGetHeight(pix);
int depth = pixGetDepth(pix);
cv::Mat mat(cv::Size(width, height), depth == 1 ? CV_8UC1 : CV_8UC3);
for (uint32_t y = 0; y < height; ++y) {
for (uint32_t x = 0; x < width; ++x) {
if (depth == 1) {
l_uint32 val;
pixGetPixel(pix, x, y, &val);
mat.at<uchar>(cv::Point(x, y)) = static_cast<uchar>(255 * val);
} else {
l_int32 r, g, b;
pixGetRGBPixel(pix, x, y, &r, &g, &b);
cv::Vec3b color(b, g, r);
mat.at<cv::Vec3b>(cv::Point(x, y)) = color;
}
}
}
return mat;
}