【轉】OCR識別引擎tesseract使用方法——安裝leptonica和libtiff

原文來自:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380146d96864968d4e414c422461f1d32a2e57d76511980853a3c50f11e41bca770216c5d61aa9ec88240dcb1993c6ad567627f42d103548e45f49a15&p=882a9546dc8b0ef50be296391b0cc9&newp=9865c70d85cc43e908e2947d074497231610db2151d2d61539&user=baidu&fm=sc&query=Leptonica&qid=&p1=2api

 

最近一直跟OCR打交道,學習了下google的OCR引擎TESSERACT,是個很好的識別工具。tesseract-3.0已支持版面分析,功能很強大。安裝tesseract前可選擇性地安裝leptonica和libtiff。不過建議先安裝這兩個庫。不安裝tiff的話只能處理bmp文件。多線程

     這裏只是說明怎麼識別中文。依次安裝好libtiff,leptonica和tesseract後,下載簡體中文和繁體中文的訓練數據,在tesseract的下載頁能夠找到。放到某個目錄的tessdata文件夾下。而後設置環境變量TESSDATA_PREFIX=tessdata的目錄。而後,新建一個ocr.cpp文件,編寫以下代碼:app

 

#include <mfcpch.h>工具

#include <ctype.h>學習

#include <sys/time.h>google

#include "applybox.h"線程

#include "control.h"對象

#include "tessvars.h"進程

#include "tessedit.h"get

#include "baseapi.h"

#include "thresholder.h"

#include "pageres.h"

#include "imgs.h"

#include "varabled.h"

#include "tprintf.h"

#include "stderr.h"

#include "notdll.h"

#include "mainblk.h"

#include "output.h"

#include "globals.h"

#include "helpers.h"

#include "blread.h"

#include "tfacep.h"

#include "callnet.h"

#include "allheaders.h"

int main(int argc,char **argv){

if(argc!=3){

printf("usage:%s <bmp file> <txt file>/n",argv[0]);

return -1;

}

char *image_file=argv[1];

char *txt_file=argv[2];

STRING text_out;

struct timeval beg,end;

tesseract::TessBaseAPI  api;

IMAGE image;

api.Init(argv[0], "chi_sim", NULL, 0, false);//初始化api對象

api.SetPageSegMode(tesseract::PSM_AUTO);//設置自動進行版面分析

api.SetAccuracyVSpeed(tesseract::AVS_FASTEST);//要求速度最快

if (image.read_header(image_file) < 0) {//讀取bmp文件的元信息

printf("Read of file %s failed./n", image_file);

exit(1);

    }

if (image.read(image.get_ysize ()) < 0){//讀取bmp文件

printf("Read of image %s error/n", image_file);

exit(1);

}

invert_image(&image);//反轉圖像的每一個像素,即便1變0,0變1

int bytes_per_line = check_legal_image_size(image.get_xsize(),

                                                image.get_ysize(),

                                                image.get_bpp());//計算每一行像素所佔字節數

    api.SetImage(image.get_buffer(), image.get_xsize(), image.get_ysize(),

                  image.get_bpp() / 8, bytes_per_line);//設置圖像

gettimeofday(&beg,NULL);

char* text = api.GetUTF8Text();//識別圖像中的文字

gettimeofday(&end,NULL);

printf("%s:reconize sec=%f/n",argv[0],end.tv_sec-beg.tv_sec+(double)(end.tv_usec-beg.tv_usec)/1000000.0);//打印識別的時間

text_out += text;

delete [] text;

FILE* fout = fopen(txt_file, "w");

fwrite(text_out.string(), 1, text_out.length(), fout);//將識別結果寫入輸出文件

fclose(fout);

}

再編寫一個makefile文件以下:

 

all:ocr

CFLAGS=-Wall -g

LDFLAGS= -lz  -lm  -ltesseract_textord /

-ltesseract_wordrec -ltesseract_classify -ltesseract_dict -ltesseract_ccstruct/

-ltesseract_ccstruct -ltesseract_cutil -ltesseract_viewer -ltesseract_ccutil/

-ltesseract_api -ltesseract_image -ltesseract_main -llept

LD_LIBRARY_PATH =

INCLUDES= -I/usr/local/include/tesseract/ -I/usr/local/include/leptonica/

%.o:%.cpp

g++ -c $(CFLAGS) $(INCLUDES)  $(SOURCE) -o $@ $<

ocr:ocr.o

g++ -o $@ $^ -g $(LD_LIBRARY_PATH) $(LDFLAGS)

clean:

rm ocr.o

    在該目錄下運行make編譯成可執行文件ocr,運行./ocr 1.bmp 1.txt就能夠將圖像1.bmp識別結果寫到1.txt了,程序會打印識別的時間。值得注意的是,tesseract中文識別速度很慢,運行幾分鐘很正常。不知有哪位大蝦知道怎麼調優?

   更鬱悶的是tesseract不支持多線程,不能在同一進程中運行多個實例。。

相關文章
相關標籤/搜索