광학 문자 인식 (OCR) - leeyoungseo/- GitHub Wiki
컴파일에 필요한 패키지 설치
$ sudo apt-get install autoconf automake libtool libpng12-dev libtiff5-dev zlib1g-dev libicu-dev libpango1.0-dev libcairo2-dev
$ sudo apt-get install libjpeg62-dev
Leptonica 설치
$ wget http://www.leptonica.org/source/leptonica-1.73.tar.gz
$ tar -xvzf leptonica-1.73.tar.gz
$ cd leptonica-1.73
$ ./configure
$ make
$ sudo checkinstall
$ sudo ldconfig
Tesseract 설치
$ wget https://github.com/tesseract-ocr/tesseract/archive/3.04.01.tar.gz
$ tar -xvzf 3.04.01.tar.gz
$ cd tesseract-3.04.01
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
$ sudo ldconfig
언어 데이터 설치
http://github.com/tesseract-ocr/tesseract/wiki/Data-Files 에서 원하는 언어 데이터 설치
설치 후에는 /usr/local/share/tessdata/ 경로에 넣어주면 됨
컴파일에 필요한 Libjpeg를 ARM 운영체제 전용으로 먼저 Cross compile함
$ cd /tmp
$ wget www.ijg.org/files/jpegsrc.v9a.tar.gz
$ tar -zxvf jepgsrc.v9a.tar.gz
$ mv jpeg-9a/ libjpeg/
$ cd libjpeg
$ CC="arm-linux-gnueabihf-gcc" CXX="arm-linux-gnueabihf-g++" \
./configure --host=arm-linux --target=arm-linux --prefix=/tmp/libjpeg/release --enable-static --disable-shared
$ sudo make -j8
$ sudo make clean
$ cd release
$ tar -zcvf libjpeg.tar.gz bin/ include/ lib/ share/
$ cd /usr/arm-linux-gnueabihf
$ tar -zxvf /tmp/libjpeg/release/libjpeg.tar.gz
컴파일에 필요한 Libpng를 ARM 운영체제 전용으로 먼저 Cross compile함 이 과정에서 Libzlib와 Library dependency가 존재하므로 먼저 Libzlib를 Cross compile함
$ cd /tmp
$ wget http://prdownloads.sourceforge.net/libpng/zlib-1.2.8.tar.gz
$ tar -zxvf zlib-1.2.8.tar.gz
$ mv zlib-1.2.8 libz
$ CC="arm-linux-gnueabihf-gcc" CXX="arm-linux-gnueabihf-g++" \
./configure --host=arm-linux --target=arm-linux --prefix=/tmp/libz/release --enable-static --disable-shared
$ sudo make -j8
$ sudo make clean
$ cd release
$ tar -zcvf libz.tar.gz include/ lib/ share/
$ cd /usr/arm-linux-gnueabihf
$ tar -zxvf /tmp/libz/release/libz.tar.gz
이 후에 Libpng를 정상적으로 Cross compile 할 수 있음
$ cd /tmp
$ wget http://sourceforge.net/projects/libpng/files/libpng15/1.5.28/libpng-1.5.28.tar.gz
$ tar -zxvf libpng-1.5.28.tar.gz
$ mv libpng-1.5.28 libpng
$ CC="arm-linux-gnueabihf-gcc" CXX="arm-linux-gnueabihf-g++" \
./configure --host=arm-linux --target=arm-linux --prefix=/tmp/libpng/release --enable-static --disable-shared
$ sudo make -j8
$ sudo make clean
$ cd release
$ tar -zcvf libpng.tar.gz include/ lib/ share/
$ cd /usr/arm-linux-gnueabihf
$ tar -zxvf /tmp/libpng/release/libpng.tar.gz
목표는 statically linked인 Tesseract를 Compile하는 것이므로 먼저 statically linked leptonica library가 필요함
(위에서 Libjpeg와 Libpng를 컴파일 해서 이미 arm-linux-gnueabihf의 PATH에 넣어주었으므로 추가적인 링크는 필요 없음)
$ wget http://www.leptonica.org/source/leptonica-1.73.tar.gz
$ tar -zxvf leptonica-1.73.tar.gz
$ cd leptonica-1.73
$ CC="arm-linux-gnueabihf-gcc" CXX="arm-linux-gnueabihf-g++" \
CFLAGS="--static" CXXFLAGS="--static" \
./configure \
--prefix=/usr/local/arm/leptonica --target=arm-linux --host=arm-linux --enable-static --disable-shared
$ sudo make -j8
$ sudo make install
위의 configure을 시행하면 라이브러리의 유무를 확인하는데 -lpng -lz -ljpeg를 포함했는지 반드시 확인할 것
Tesseract Cross compile
$ wget https://github.com/tesseract-ocr/tesseract/archive/3.04.01.tar.gz
$ tar -zxvf 3.04.01.tar.gz
$ cd tesseract-3.04.01
$ ./autogen.sh
$ LIBLEPT_HEADERSDIR=/usr/local/arm/leptonica/include \
CC="arm-linux-gnueabihf-gcc" CXX="arm-linux-gnueabihf-g++" \
CFLAGS="--static" CXXFLAGS="--static" LIBS="-lz -lpng -ljpeg" \
./configure --prefix=/usr/local/arm/tesseract-ocr --target=arm-linux --host=arm-linux \
--with-extra-libraries=/usr/local/arm/leptonica/lib --enable-static --disable-shared
$ sudo make -j8
$ sudo make install
$ sudo ldconfig
위의 LIBS="-lz -lpng -ljpeg" 를 빼먹는 경우에는 오류가 발생
미리 컴파일한 leptonica가 위의 라이브러리를 참조하고 있긴 하지만, 꼭 추가해 주어야 함
file tesseract
반드시 statically linked 인지 확인한 다음 모바일로 옮길 것
GetBinaryImage.cpp 을 Cross compile (statically linked)
#include <iostream>
#include <leptonica/allheaders.h>
#include <tesseract/baseapi.h>
#include <chrono>
using namespace std;
int main(int argc, char* argv[]) {
chrono::system_clock::time_point start_time;
chrono::duration<double> exec_time;
start_time = chrono::system_clock::now();
tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
if (api->Init(NULL, "eng")) {
cout << "Could not initialize tesseract." << endl;
return -1;
}
Pix* image = pixRead(argv[1]);
api->SetImage(image);
Pix* image_threshold = api->GetThresholdedImage();
pixWrite(argv[2], image_threshold, IFF_PNG);
exec_time = chrono::system_clock::now() - start_time;
cout << "GetBinaryImage::execution time ==>" << exec_time.count() << endl;
return 0;
}
GetBinaryImage.cpp
$ arm-linux-gnueabihf-g++ -o GetBinaryImage GetBinaryImage.cpp \
--static -I/usr/local/arm/leptonica/include -I/usr/local/arm/tesseract-ocr/include \
-L/usr/local/arm/leptonica/lib -L/usr/local/arm/tesseract-ocr/lib -ltesseract -llept -lz -lpng -ljpeg -lpthread
Warning이 뜨긴 하지만 무시해도 괜찮음
위의 Linux에서 받은 같은 언어 데이터를 모바일로 옮긴 후에
환경변수 TESSDATA_PREFIX를 언어 데이터가 있는 경로로 설정해 주어야 함
export TESSDATA_PREFIX=/data/204/tessdata
(예시)