광학 문자 인식 (OCR) - leeyoungseo/- GitHub Wiki

Tesseract open source

Linux (Ubuntu 14.04)

컴파일에 필요한 패키지 설치

$ 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/ 경로에 넣어주면 됨


Android (ARM)

컴파일에 필요한 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 (예시)

⚠️ **GitHub.com Fallback** ⚠️