You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

解决方案

按以下顺序排查即可解决:

  1. 先验证文件本身可访问
    终端执行ls -l /usr/local/share/tessdata/eng.traineddata确认文件真实存在,再执行chmod 644 /usr/local/share/tessdata/eng.traineddata给所有用户分配可读权限,很多场景下是root放置的文件权限不足,普通用户运行程序无读权限导致打开失败。
    注意:配置TESSDATA_PREFIX时路径必须以/结尾,否则Tesseract拼接路径时会出现路径格式错误,哪怕文件存在也无法读取。
  2. 匹配训练数据版本
    执行tesseract --version确认本地安装的Tesseract大版本,eng.traineddata必须和Tesseract大版本对应:4.x版本使用适配4.0的LSTM训练数据,5.x版本使用适配5.0的训练数据,跨版本混用会直接加载失败。
  3. 绕开环境变量,代码中指定绝对路径
    不要依赖系统环境变量传路径,直接修改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就是因为初始化失败后没有中断流程,继续调用接口导致的。
  4. 系统层面验证配置有效性
    终端执行tesseract --list-langs,如果命令能正常输出eng,说明系统层面Tesseract配置正常,代码按上述修改后即可正常运行;如果该命令同样报语言加载失败,先排查系统级Tesseract安装问题,再调试代码。

内容的提问来源于stack exchange,提问作者kyraymege

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 01:33:19