Opencv4圖像分割和識別第四課(實戰3)基於vs2017+tesseract4.0識別字符

前言

如何使用tesseract開源庫進行字符識別是實戰3的重點和難點。 要在自己的開發環境中使用合適的tesseract包,必須先下載源代碼來根據自己的開發平臺進行編譯,這不是件容易的事情,坑蠻多啊! 不過課程裏面會對此進行詳細講解。

本文(也是實戰3的課後作業)講述如何在visual studio2017+win10環境中配置tesseract庫,並使用其基本APIs來進行測試圖片中字符識別。

配置

tesseract源代碼在visual studio2017+x64環境 編譯並install好後,就可以在C:\Program Files\下找到目錄:tesseract,其內容如下所示:

1)首先 include目錄下面 目前可能只有tesseract子目錄,我們需要手動創建一個子目錄:leptonica,然後把C:\Users\xxx\.cppan\storage\src\8f\a3\90d7\src下面得內容全部拷貝到leptonica目錄下面,部分文件示意如下:

 2)其次,使用visual studio2017創建或打開一個新工程,並將tesseract頭文件和庫包含進來,如下所示。

 最後將tesseract/bin目錄加入到環境變量,如下所示。

示例代碼

本課作業就是讀取一張圖片test_code.jpg,然後使用tesseract apis來識別出裏面的字符。

#include <leptonica/allheaders.h>
#include <tesseract/baseapi.h>

tesseract::TessBaseAPI tess;

if (tess.Init("D:/tesseract-4.0.0/tessdata", "eng"))
{
	std::cout << "OCRTesseract: Could not initialize tesseract." << std::endl;
	return 1;
}

// setup
tess.SetPageSegMode(tesseract::PageSegMode::PSM_AUTO);
tess.SetVariable("save_best_choices", "T");

// read image
auto pixs = pixRead("xxx/test_code.jpg");
if (!pixs)
{
    std::cout << "Cannot open input file: " << "chars_detection.png" << std::endl;
    return 1;
}

// recognize
tess.SetImage(pixs);
tess.Recognize(0);

// get result and delete[] returned char* string
std::cout << std::unique_ptr<char[]>(tess.GetUTF8Text()).get() << std::endl;

// cleanup
tess.Clear();
pixDestroy(&pixs);

 代碼裏面有幾個注意點如下:

1)項目頭文件目錄配置爲xxx/tesseract/include, 所以代碼裏面需要把其子目錄tesseract以及leptonica在include頭文件是也需要加上,如下紅體字所示:

 #include <leptonica/allheaders.h>

2)tess.init(xxx)需要指定tessdata語言數據包,否則該語句執行會失敗。這些語言數據包需要單獨從github上下載,可以針對自己需要的字體的語言來下載相應的包。比如說英語字體的識別,就要下載 如下圖紅框所示的文件。

3)項目編譯時會遇到一個error:  alltypes.h裏面找不到endianness.h。解決辦法很簡單,就是把這句include語句註釋掉。

//#include "endianness.h"

結果演示

test_code.jpg如下圖所示:

調用上面代碼得到的識別結果打印如下:

識別結果和原文內容完全一致。 

 

 

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