CSharp在Linux上使用Tesseract-OCR

碰到的问题:

       在Windows上测试识别都可以,编译发布到Linux系统上就会提示如下信息:

       主要提示信息为:Failed to find library "libleptonica-1.82.0.so" for platform x64.

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
 ---> System.DllNotFoundException: Failed to find library "libleptonica-1.82.0.so" for platform x64.
   at InteropDotNet.LibraryLoader.LoadLibrary(String fileName, String platformName)
   at InteropRuntimeImplementer.LeptonicaApiSignaturesInstance.LeptonicaApiSignaturesImplementation..ctor(LibraryLoader loader)
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
   at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr)
   --- End of inner exception stack trace ---
   at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr)
   at System.Reflection.MethodBaseInvoker.InvokeWithOneArg(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture)
   at InteropDotNet.InteropRuntimeImplementer.CreateInstance[T]()
   at Tesseract.Interop.LeptonicaApi.Initialize()
   at Tesseract.Interop.TessApi.Initialize()
   at Tesseract.Interop.TessApi.get_Native()
   at Tesseract.TesseractEngine..ctor(String datapath, String language, EngineMode engineMode, IEnumerable`1 configFiles, IDictionary`2 initialOptions, Boolean setOnlyNonDebugVariables)
   at Tesseract.TesseractEngine..ctor(String datapath, String language, EngineMode engineMode)
   at OcrTesseractApp.Program.TestChineseOcr(String testImagePath, String ocrPath) in D:\.Net\CSharp_Practice\OcrTesseractDemo\OcrTesseractApp\Program.cs:line 152

 

解决方法是

项目部署到linux上后,还需要在 x64 目录中增加两个文件:

libleptonica-1.82.0.so 和  libtesseract50.so

以上两个文件时是 ibleptonica.so 和 libtesseract.so这两个文件改名后得到的。需要从linux服务器上找到

其中:ibleptonica.so文件在 leptonica的安装目录下lib文件夹里,也可以通过搜索得到

image

 

 libtesseract.so 文件在 tesseract 的安装目录下lib文件夹,也可以通过搜索找到

image

 

复制过来,然后改名:

ibleptonica.so   改为:libleptonica-1.82.0.so

libtesseract.so  改为:libtesseract50.so

改名后将两个文件拷贝到发布的程序目录中  x64文件夹下

image

 

再次执行程序就可以解决这个问题了。

 

Linux环境具体安装步骤

1、下载tesseract-ocr和leptonica

 我的版本是 5.4.1 和 1.82.0 

image

2、假设你的安装目录在 /custorm_app   (注意压缩源文件路径)

cd /custorm_app
tar -xvf leptonica-1.82.0.tar.gz
cd leptonica-1.82.0
./configure
make
make install
apt install  automake
apt install  libtool
tar -xvf tesseract-5.4.1.tar.gz
cd tesseract-5.4.1
./autogen.sh
./configure
make
make install
sudo ldconfig

3、配置环境变量(这步忘了是否执行过了)

/*打开文件*/
vim /etc/profile

/*在文件末尾添加*/
export LD_LIBRARY_PATH=/usr/local/lib
export LIBLEPT_HEADERSDIR=/usr/local/include
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
export TESSDATA_PREFIX=/usr/local/share/tessdata

/*立即生效*/
source /etc/profile

4、下载语言包

//中文简体
https://raw.githubusercontent.com/tesseract-ocr/tessdata/4.00/chi_sim.traineddata
//英文
https://raw.githubusercontent.com/tesseract-ocr/tessdata/4.00/eng.traineddata

语言包的目录要在tessdata目录下

image

5、测试是否安装成功

执行命令:tesseract --version

image

 

6、测试命令识别效果

tesseract /custorm_app/1.png output -l chi_sim

参数说明:

/custorm_app/1.png : 是要识别的图片文件

output : 是识别后的文本(/custorm_app/output.txt)

chi_sim : 用到的语言包

 

.net 项目配置说明

1、创建一个控制台程序

2、安装在nuget 里面 查找 tesseract ,添加到项目中,版本是5.2.0

3、调用读取图片(为了配置灵活在appsettings.json增加了ocr的配置路径【下载的中文和英文语言包所在的tessdata路径】和图片输入,图片输出路径)

public static void Main(string[] args)
{
    //加载appsettings.json配置文件
    var configuration = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json")
    .Build();
    // 绑定整个配置到对象
    var config = configuration.Get<RootConfig>();

    var testImagePath = Path.Combine(config.AppConfig.OcrInfo.TextImageInPath, "testImg.png");
    var testOutPath = Path.Combine(config.AppConfig.OcrInfo.TextImageInPath, "testImg2.png");
    var ocrPath = config.AppConfig.OcrInfo.OcrPath ;

    //英文识别
    //TestEnglishOcr();
    //中文识别
    TestChineseOcr(testImagePath,ocrPath);
}

static void TestChineseOcr(string testImagePath,string ocrPath)
{
    //var testImagePath = "Img/testImg.png";
    try
    {
        using (var engine = new TesseractEngine(ocrPath, "chi_sim", EngineMode.Default))
        {
            using (var img = Pix.LoadFromFile(testImagePath))
            {
                using (var page = engine.Process(img))
                {
                    var text = page.GetText();
                    Console.WriteLine("识别结果:" + text);
                }
            }
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
    }
}

4、目录结构展示

x64目录实际有上面的两个文件,只是没加载出来。发布后如果x64没有,可以手动拷贝进去

image

 识别中文的效果

image

 

 

参考文章:CSharp在Linux上使用Tesseract-OCR 

posted @ 2025-08-03 19:08  狼窝窝  阅读(125)  评论(0)    收藏  举报