Tesseract-OCR學習系列(二)構建

Build project from Tesseract Source Code for Visual Studio 2012

上一節(jié)講到,如果直接編譯libtesseract304工程,會有報錯。說找不到某個頭文件。看來,Tesseract還依賴于第三方的庫。當然,這么沒來由的瞎猜也不是個事兒。還不如再上官網(wǎng)找找線索。

果然,有一個頁面就專門講如何安裝來著。如果你打算用Linux系統(tǒng)來編譯(比如說Ubuntu),那么你就需要安裝一些其它的庫:

sudo apt-get install autoconf automake libtool
sudo apt-get install pkg-config
sudo apt-get install libpng12-dev
sudo apt-get install libjpeg62-dev
sudo apt-get install libtiff4-dev
sudo apt-get install zlib1g-dev

如果你還想要訓練,那就還得再多裝一點:

sudo apt-get install libicu-dev
sudo apt-get install libpango1.0-dev
sudo apt-get install libcairo2-dev

你還需要安裝Leptonia……這里就不詳細說了,因為我的目標是要安裝Windows的版本,所選擇的編譯器是Visual Studio 2012。

可怕的事情發(fā)生了,官網(wǎng)上居然只支持VS2015!

官網(wǎng)關于3.04.01的安裝建議

然而,機智如我怎么可能為此而安裝Visual Studio 2015。畢竟公司給配的電腦的運行速度正處在令我滿意的邊界值。我怕再裝一個編譯器會大大有損我司在我心目中的形象。不過現(xiàn)在是搞清楚了,我們需要安裝的東西,就是Leptonica。那我去找個針對Visual Studio 2012的Leptonica不就完了嗎?

還真讓我給找著了!【GitHub Repo

果斷下載。

先來找找上一篇中找不到的allheaders.h吧。


原來就躲在liblept的頭文件中呢。頓時有了信心。

打開tesseract.sln


解決方案中包含的項目如下:


發(fā)現(xiàn)項目的屬性中,平臺工具集為v120。v120表示的是Visual Studio 2013。(GitHub的作者一開始的目標是VS2012來著,后來不知為什么轉(zhuǎn)而支持VS2013去了。)


因此,我們需要將所有項目的平臺工具集屬性都改成v110。(Debug|Release)都要改哦!

另外,Visual Studio 2012 的ToolsVersion為4.0。所以也需要手動修改一下所有項目*.vcxproj中的ToolsVersion:


再著就開始生成吧:

  • 生成zlib-128,成功。
  • 生成libtiff-394,有警告,成功。
  • 生成libpng-143,成功。
  • 生成libjpeg-8c,成功。
  • 生成giflib-416,有警告,成功。
  • 生成liblept-171,失敗……

額,失敗了……主要原因是在函數(shù)中間定義變量,而未在函數(shù)一開始定義變量。VC2012不支持這么寫。比如說,這樣一個函數(shù):

void
lept_direxists(const char  *dir,
               l_int32     *pexists)
{
    char  *realdir;
 
    if (!pexists) return;
    *pexists = 0;
    if (!dir) return;
    if ((realdir = genPathname(dir, NULL)) == NULL)
        return;
 
#ifndef _WIN32
    {
    struct stat s;
    l_int32 err = stat(realdir, &s);
    if (err != -1 && S_ISDIR(s.st_mode))
        *pexists = 1;
    }
#else  /* _WIN32 */
    l_uint32  attributes; //line 21
    attributes = GetFileAttributes(realdir);
    if (attributes != INVALID_FILE_ATTRIBUTES &&
        (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
        *pexists = 1;
    }
#endif  /* _WIN32 */
 
    FREE(realdir);
    return;
}

21行的聲明沒有放在開頭寫,所以需要修改成:

void
lept_direxists(const char  *dir,
               l_int32     *pexists)
{
    char  *realdir;
    l_uint32  attributes; //原來的第21行
 
    if (!pexists) return;
    *pexists = 0;
    if (!dir) return;
    if ((realdir = genPathname(dir, NULL)) == NULL)
        return;
 
#ifndef _WIN32
    {
    struct stat s;
    l_int32 err = stat(realdir, &s);
    if (err != -1 && S_ISDIR(s.st_mode))
        *pexists = 1;
    }
#else  /* _WIN32 */
 
    attributes = GetFileAttributes(realdir);
    if (attributes != INVALID_FILE_ATTRIBUTES &&
        (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
        *pexists = 1;
    }
#endif  /* _WIN32 */
 
    FREE(realdir);
    return;
}

全都是這樣的問題。修改之后,成功生成。 將Release與Debug全都生成完后,在build/lib/Win32目錄下,就會產(chǎn)生那么幾個重要的文件。


接下來,我們再回過頭來看一下libtesseract304的屬性頁。其添加的庫目錄為..\..\..\lib

需要添加的庫為liblept和libtiff。


include的目錄為..\..\..\include..\..\..\include\leptonica


因此接下來要做的事顯得順理成章,在tesseract的同一級目錄中新建lib文件夾。放入這么些個文件。


在tesseract的同一級建立include文件夾,在include文件夾中建立leptonica文件夾。將liblept中的頭文件全部拷入其中。

再次生成,結(jié)果還是錯誤。不過,這次的錯誤不一樣了:


對應的錯誤代碼在這兒:


顯然是編碼方式出了問題。解決方法:

文件->高級保存選項:

修改為:


再次生成,繼續(xù)報錯:


對應到的代碼段為:


顯然又是編譯器不支持C99導致的錯~Visual C 2012,你敢不敢支持一下C99!

無奈,那就修改一下吧,好在不是什么大問題。

修改為:

static void AddIdTohOCR(STRING* hocr_str, const std::string base, int num1, int num2) {
  unsigned long bufsize = base.length() + 2 * kMaxIntSize;
  char* id_buffer = (char*)malloc(bufsize*sizeof(char));
  if (num2 >= 0) {
    snprintf(id_buffer, bufsize - 1, "%s_%d_%d", base.c_str(), num1, num2);
  } else {
    snprintf(id_buffer, bufsize - 1, "%s_%d", base.c_str(), num1);
  }
  id_buffer[bufsize - 1] = '\0';
  *hocr_str += " id='";
  *hocr_str += id_buffer;
  *hocr_str += "'";
  free(id_buffer);
}

生成,終于成功啦!在vs2010DLL_Debug目錄下生成了libtesseract304d.dll和libtesseract304d.lib文件。

乘勝追擊,Release再來一下吧。OK,也是相當成功。在DLL_Release目錄下生成了三個文件。


接下來,生成另外一個工程,tesseract。Debug與Release都很容易就生成了。

好不容易生成好,趕緊拿個例子嘗試一下~

Tesseract是一個命令行程序,所以打開cmd命令行工具才是使用Tesseract的正確姿勢。

tesseract的命令行語法如下:

tesseract imagename outputbase [-l lang] [-psm pagesegmode] [configfile...]

使用tesseract來進行OCR識別的最基本的用法如下:

tesseract myscan.png out

這會在myscan.png這張圖像上進行OCR,然后把結(jié)果輸出到out.txt中。

或者我們可以規(guī)定文字的語言,比如用德語來進行OCR。

tesseract myscan.png out -l deu

甚至可以用多種語言來進行識別,比如用德文加英文:

tesseract myscan.png out -l eng+deu

我已經(jīng)迫不及待了,趕緊來PS一張圖嘗試一下吧~

myscan.png

原諒我作為程序員的職業(yè)病~接下來是見證奇跡的時刻:


好了,這一篇就寫到這里吧。接下來會寫些什么,我其實也不知道。敬請期待吧~

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內(nèi)容