C++调用Tesseract无法加载eng语言包触发段错误求解
Tesseract加载eng语言失败触发段错误问题
已尝试的排查操作
- 先后将
TESSDATA_PREFIX环境变量设置为/usr/local/share/tessdata、/usr/local/share/tesseract-ocr/4.00/tessdata、/usr/local/share/tesseract-ocr/5/tessdata、tesseract/tessdata等多个路径 - 上述所有路径下均放置了
eng.traineddata文件,且替换过从GitHub下载的训练数据文件,问题仍未解决
相关代码
主程序代码
#include <string> #include <tesseract/baseapi.h> #include <leptonica/allheaders.h> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main(){ cv::Mat image; string outText; image = cv::imread("text.png",cv::IMREAD_COLOR); tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI(); api->Init(NULL, "eng", tesseract::OEM_LSTM_ONLY); api->SetPageSegMode(tesseract::PSM_AUTO); api->SetImage(image.data, image.cols, image.rows, 3, image.step); outText = string(api->GetUTF8Text()); cout << outText; api->End(); }
Makefile配置
CC = g++ PROJECT = main SRC = main.cpp LIBS = `pkg-config --cflags --libs opencv4 tesseract` $(PROJECT) : $(SRC) $(CC) $(SRC) $(LIBS) -o $(PROJECT)
运行报错信息
Error opening data file /usr/local/share/tessdata/eng.traineddata Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata" directory. Failed loading language 'eng' Tesseract couldn't load any languages! Estimating resolution as 304 Segmentation fault (core dumped)
解决方案
按以下顺序排查即可解决:
- 先验证文件本身可访问
终端执行ls -l /usr/local/share/tessdata/eng.traineddata确认文件真实存在,再执行chmod 644 /usr/local/share/tessdata/eng.traineddata给所有用户分配可读权限,很多场景下是root放置的文件权限不足,普通用户运行程序无读权限导致打开失败。
注意:配置TESSDATA_PREFIX时路径必须以/结尾,否则Tesseract拼接路径时会出现路径格式错误,哪怕文件存在也无法读取。 - 匹配训练数据版本
执行tesseract --version确认本地安装的Tesseract大版本,eng.traineddata必须和Tesseract大版本对应:4.x版本使用适配4.0的LSTM训练数据,5.x版本使用适配5.0的训练数据,跨版本混用会直接加载失败。 - 绕开环境变量,代码中指定绝对路径
不要依赖系统环境变量传路径,直接修改Init接口的第一个参数,传入tessdata目录的绝对路径(末尾必须带/),从根源避免环境变量不生效、作用域不对的问题,修改示例:
加初始化返回值判断,初始化失败直接退出,避免后续空指针调用触发段错误——当前遇到的// 原代码 api->Init(NULL, "eng", tesseract::OEM_LSTM_ONLY); // 修改为 if(api->Init("/usr/local/share/tessdata/", "eng", tesseract::OEM_LSTM_ONLY) != 0){ cerr << "Tesseract init failed, can not load traineddata" << endl; return -1; }Segmentation fault就是因为初始化失败后没有中断流程,继续调用接口导致的。 - 系统层面验证配置有效性
终端执行tesseract --list-langs,如果命令能正常输出eng,说明系统层面Tesseract配置正常,代码按上述修改后即可正常运行;如果该命令同样报语言加载失败,先排查系统级Tesseract安装问题,再调试代码。
内容的提问来源于stack exchange,提问作者kyraymege
相关产品推荐
相关产品推荐

