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!
然而,機智如我怎么可能為此而安裝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);
}
生成,終于成功啦!在vs2010
的DLL_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一張圖嘗試一下吧~
原諒我作為程序員的職業(yè)病~接下來是見證奇跡的時刻:
好了,這一篇就寫到這里吧。接下來會寫些什么,我其實也不知道。敬請期待吧~