写在开始

最近给自己的搜索机器人加了一个OCR识别的功能,本来想尝试着直接识别来着,不过发现效果并不是很好,接下来继续用可能得考虑下有啥方式能提高文本的识别率了。

其中有个踩坑就是Nuget上的Tesseract构建的动态链接库只有Windows版,没有构建Linux版的动态链接库,所以直接在Linux上使用就会报错,然后会缺少那几个动态链接库。

一个是libleptonica-1.80.0.so另一个是libtesseract41.so,除此之外如果用到了System.Drawing的话还需要libgdiplus库。

接下来的解决方案只针对Debian 10,如果是非glibc环境的话自己参考下解决吧,用了好一阵子的alpine之后发现,在上面折腾的时间已经远大于节约的体积了,所以在Docker里面还是用Debian比较方便。

构建leptonica

构建之前先准备好编译环境

apt update -y && \
apt upgrade -y && \
apt install automake ca-certificates g++ git libtool make pkg-config asciidoc docbook-xsl xsltproc libpango1.0-dev git cmake -y

然后准备一下LD_LIBRARY_PATH,这个是为了给Tesseract用的,所以现在不写也可以。

export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib

接下来准备一个存放最终输出文件的目录

mkdir -p /app/out/x64

然后在/app目录下克隆leptonica并进入

git clone https://github.com/DanBloomberg/leptonica
cd leptonica

切换到1.80.0版本的commit上去

git checkout 1ac72c93fef1a5eb76b76d6723d2aee843dd6e51

然后使用autogen.sh./configuremake -j4make install四连

./autogen.sh
./configure
make -j4
make install

这里不能用cmake方案,用cmake的话输出文件里面找不到动态链接库,至于原因我没去找,毕竟做成自动编译脚本的话还要改里面的东西就有点麻烦了。

执行完成之后就会把liblept.so安装到/usr/local/lib里了,然后直接复制到我定义的输出目录里

cp /usr/local/lib/liblept.so.5.0.4 /app/out/x64/libleptonica-1.80.0.so

这样子libleptonica就算是构建完成了。

构建Tesseract

这个构建思路也是类似的,老样子在/app目录下克隆tesseract并进入

git clone https://github.com/tesseract-ocr/tesseract.git
cd tesseract

然后找到4.1.1版本的commit,切换过去

git checkout 75103040c94ffd7fe5e4e3dfce0a7e67a8420849

然后使用autogen.sh来生成项目

./autogen.sh

接下来创建输出目录,然后使用cmake编译就可以了

mkdir build
cd build
cmake ..
make -j4

然后拷贝动态链接库到定义的输出目录

cp libtesseract.so.4.1.1 /app/out/x64/libtesseract41.so

这两个文件的x64版本的动态链接库就构建完成了。

配置运行环境的依赖

我使用的时候还遇到了个找不到libdl的问题,这个应该就是缺少了libgdiplus的问题,用下面的命令安装就行了。

bash

完整的构建命令

这个可以抄一下我的Dockerfile,下面贴上我Dockerfile的配置

FROM moderras/dotnetsdk:5.0 AS build-env
WORKDIR /app

RUN export LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib && \
    apt update -y && \
    apt upgrade -y && \
    apt install automake ca-certificates g++ git libtool make pkg-config asciidoc docbook-xsl xsltproc libpango1.0-dev git cmake -y && \
    mkdir -p /app/out/x64 && \
    git clone https://github.com/DanBloomberg/leptonica && \
    cd leptonica && \
    git checkout 1ac72c93fef1a5eb76b76d6723d2aee843dd6e51 && \
    ./autogen.sh && \
    ./configure && \
    make -j4 && \
    make install && \
    cp /usr/local/lib/liblept.so.5.0.4 /app/out/x64/libleptonica-1.80.0.so && \
    cd /app && \
    git clone https://github.com/tesseract-ocr/tesseract.git && \
    cd tesseract && \
    git checkout 75103040c94ffd7fe5e4e3dfce0a7e67a8420849 && \
    ./autogen.sh && \
    mkdir build && \
    cd build && \
    cmake .. && \
    make -j4 && \
    cp libtesseract.so.4.1.1 /app/out/x64/libtesseract41.so

大概就是这样吧

写在最后

虽然最后也没用上啥吧,这个OCR功能暂时被我废弃掉了,因为识别质量太差。所以写个博客留念一下折腾的这个东西吧,不得不说 .NET 的东西和Linux总是相性不和呢,每次把在Windows上跑得好好的东西移植到Linux上跑总是会出点问题,还经常是因为Nuget包里面缺少了指定平台的动态链接库或者依赖这种问题,真令人头大。

Last modification:February 10, 2021
如果觉得我的文章对你有用,请随意赞赏