windows編譯和使用tesseract(C++ api)

tesseract是一個基於C++編寫的開源OCR(光學字符識別)庫

本文簡單介紹一下windows系統中編譯和使用tesseract以及調用該庫的C++ api進行開發

環境爲win10+vs2015


源碼下載

tesseract的編譯有諸多依賴,tesseract依賴於leptonica,而leptonica又依賴於png,tiff,jpeg等基礎庫,所以需要下載這些依賴的源碼,並且依次編譯

考慮到某些圖片格式的基礎庫源碼較老並且久未更新難於編譯,本文只編譯了較新的libtiff,並作爲示例,其他圖片格式未測試

下載地址:

下載完後解壓縮到文件夾,這裏將三個項目源碼都放在codetest目錄

編譯

特別指定,本文中所有項目生成都是使用cmake-gui工具(首先要會用這個工具),C++編譯使用vs2015,所有cmake編譯目錄都定爲build_x64

所有的編譯模式都是:vs2015 win64 release

由於tiff --> leptonica --> tesseract 三者之間層層遞進,環環相扣,所以編譯一定要注意順序和設置

step1:編譯tiff

常規cmake流程編譯出 tiff.lib和tiff.dll,位置在 D:\codetest\tiff-4.0.9\build_x64\libtiff\Release

step2:編譯leptonica

cmake配置,勾選Grouped和Advanced,會顯示png和tiff等圖片庫的設置入口,要先將tiff的目錄配置進去,使得支持tiff格式


然後需要修改 libtiff目錄下的兩個頭文件,將tiffconf.vc.h和tif_config.vc.h改名爲tiffconf.h和tif_config.h


這樣就能編譯出leptonica的庫文件了

  • leptonica-1.76.0.lib,位置 D:\codetest\leptonica-1.76.0\build_x64\src\Release
  • leptonica-1.76.0.dll,位置 D:\codetest\leptonica-1.76.0\build_x64\bin\Release

step3:編譯tesseract

根目錄的cmake配置文件在

if(NOT EXISTS ${PROJECT_SOURCE_DIR}/.cppan)

這句話之前加上

set(Leptonica_DIR D:/codetest/leptonica-1.76.0/build_x64) 

include_directories(
    D:/codetest/leptonica-1.76.0/src
    D:/codetest/leptonica-1.76.0/build_x64/src
)
目的是爲了讓tesseract在cmake的config階段找到leptonica的頭文件和庫


在configure的過程會出現如下日誌,顯示正在下載ICU的依賴,注意打開vpn,否則會因爲網絡問題不成功


之後,打開sln進行編譯,一般情況下會出現一個字符編碼的報錯


此時不用驚慌,只需要將tesseract中equationdetect.cpp文件修改一下,再編譯就好了

static const STRING kCharsToEx[] = {"'", "`", "\"", "\\", ",", ".",  
    "〈", "〉", "《", "》", "」", "「", ""};  

改爲

static const STRING kCharsToEx[] = { "'", "`", "\"", "\\", ",", ".",  
    "<", ">", "<<", ">>", "" };  


然後順利編譯出tesseract項目的各種二進制工具exe,lib和dll

  • tesseract305.lib,位置 D:\codetest\tesseract-3.05.01\build_x64\Release
  • tesseract305.dll,位置 D:\codetest\tesseract-3.05.01\build_x64\bin\Release
  • tesseract.exe,位置 D:\codetest\tesseract-3.05.01\build_x64\bin\Release

工具使用

在D:\codetest\tesseract-3.05.01\build_x64\bin\Release目錄下,從源碼目錄將tessdata拷貝進去,並且提前下載好已訓練語言包,另外,將用到的tiff和liptonica以及要識別的圖片都拷貝進來


bmp格式原生支持,tif格式此時也是支持的,這裏以tif圖片爲例


在這個目錄輸入命令行

tesseract eurotext.tif euro

識別結果

euro.txt

The (quick) [brown] {fox} jumps!
Over the $43,456.78 <lazy> #90 dog
& duck/goose, as 12.5% of E-mail
from [email protected] is spam.
Der ,,schnelle” braune Fuchs springt
fiber den faulen Hund. Le renard brun
«rapide» saute par-dessus le chien
paresseux. La volpe marrone rapida
salta sopra il cane pigro. El zorro
marrén répido salta sobre el perro
perezoso. A raposa marrom répida
salta sobre 0 C50 preguicoso.

有些字符不是特別準確,還需要訓練

編程使用

通過寫代碼調用tesseract的C++ api的形式

創建vs2015 C++工程

源碼

main.cpp

#include "baseapi.h"
#include "allheaders.h"

int main()
{
	char *outText;

	tesseract::TessBaseAPI *api = new tesseract::TessBaseAPI();
	// Initialize tesseract-ocr with English, without specifying tessdata path
	if (api->Init(NULL, "eng"))
	{
		fprintf(stderr, "Could not initialize tesseract.\n");
		exit(1);
	}

	// Open input image with leptonica library
	Pix *image = pixRead("./eurotext.tif");
	api->SetImage(image);
	// Get OCR result
	outText = api->GetUTF8Text();
	printf("---- OCR output:---- \n%s", outText);

	// Destroy used object and release memory
	api->End();
	delete[] outText;
	pixDestroy(&image);

	return 0;
}

配置

頭文件包含目錄

主要是leptonica和tesseract的src目錄


附加庫目錄

需要配置leptonica和tesseract的lib路徑


附加依賴項


運行

將項目依賴的tiff,leptonica,tesseract的dll全部拷貝到exe執行目錄,並且拷貝tessdata和用到的圖片到該目錄


運行結果

---- OCR output:----
The (quick) [brown] {fox} jumps!
Over the $43,456.78 <lazy> #90 dog
& duck/goose, as 12.5% of E-mail
from [email protected] is spam.
Der ,,schnelle鈥?braune Fuchs springt
鏗乥er den faulen Hund. Le renard brun
蘆rapide祿 saute par-dessus le chien
paresseux. La volpe marrone rapida
salta sopra il cane pigro. El zorro
marr茅n r茅pido salta sobre el perro
perezoso. A raposa marrom r茅pida
salta sobre 0 C50 preguicoso.

可以看出,api識別的結果還是有些不準確的,有待訓練優化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章