2019/07/20追記
この記事を書いてから随分と経過しました。完全に情報が古くなっています。外部のサイトですが必要な場合は以下等を参照して下さい。
PythonとTesseract OCRで文字認識
OpenCVのOCR(tesseract-ocr)をWindows(64bit)、C++で使う
vcpkgとCMakeで簡単にtesseract-ocr
2019/07/20追記ここまで
Tesseract-OCRの導入の2回目です。前回はインストールからコマンドプロンプトでの英数字と日本語文字での認識の動作確認を行いました。今回はVC++からAPIを使ってみます。開発環境は、Microsoft Vidual Studio Express 2013 for Windows Desktopです。あと、前回書きましたが、Tesseract-OCRがインストール出来ていて使えるようになっていることが前提です。
ここでは以下のライブラリを使います。APIを使う一つの方法ということでご理解頂ければと思います。(※OpenCVと同様に出来ればと思って NuGetを検索したところ、Tesseract-OCR Ver1.0.4 というのが出てきました。これは古いのかなと思ったのでやめました。)
Tesseract-OCRのwin32ライブラリ
以下のリストのページで現時点では、tesseract-3.02.02-win32-lib-include-dirs.zipです。このファイル名を選択するとこのファイルのダウンロードページに移行します。ここからダウンロードします。
Tesseract-OCRのダウンロードファイルリスト
Leptonicaのwin32ライブラリ
以下のソースダウンロードページで現時点では、leptonica-1.68-win32-lib-include-dirs.zipです。このソースダウンロードページからダウンロード出来ます。
Leptonicaソースダウンロードページ
Leptonicaとはオープンソースの画像処理系ライブラリですが、Tesseract-OCRで使用されているようでこれも必要です。参考までにですが、Tesseract-OCRをコマンドラインで利用すると以下のようなメッセージが出ます。
Tesseract Open Source OCR Engine v3.02 with Leptonica
各ライブラリの配置
ライブラリをそれぞれ分かりやすいように配置します。ここでは、以下のようにc:\ocrフォルダに配置しました。
あと実行時に上記ライブラリのlibフォルダに含まれるDLLファイルが必要になります。これらのDLLファイルが環境変数の実行ファイルパスの登録されている場所にあるか、作成したプログラムと同一のディレクトリにある必要があります。
ここではTesseract-OCRの実行ファイルのディレクトリにコピーしました。
以上でライブラリのインストールは完了とします。
コンソールアプリからのAPIの利用
ここから実際にAPIを使ってみます。ここではVC++でコンソールアプリをペースにします。まずコンソールアプリのプロジェクトを作成します。その方法が必要な場合は以下のコンソールアプリのプロジェクトの作成方法等を参照して下さい。(※NuGetは今回は使いません。)
NuGetでOpenCVを導入する
ライブラリの場所の設定
作成したプロジェクトでTesseract-OCRとLeptonicaのインクルードファイルの場所、追加ライブラリのファイルを設定します。
まずインクルードファイルのディレクトリです。
プロジェクトのプロパティページ → 構成プロパティ → C/C++ → 全般 → 追加のインクルードディレクトリで指定します。ここではライブラリの配置で配置したディレクトリを指定します。必要な場合は読み換えて指定して下さい。
次にライブラリファイルです。
プロジェクトのプロパティページ → 構成プロパティ → リンカー → 入力 → 追加の依存ファイルで指定します。ここでもライブラリの配置で配置したディレクトリ内のファイルを指定します。必要な場合は読み換えて指定して下さい。
プログラムの作成
ここでは以下のようなプログラムを書いてみました。シンプルに入力ファイルを指定して画面とファイルに出力するプログラムです。
#include "stdafx.h" #include <tesseract/baseapi.h> #include <leptonica/allheaders.h> #include <iostream> #include <fstream> int _tmain(int argc, _TCHAR* argv[]) { tesseract::TessBaseAPI api; api.Init("", "eng", tesseract::OEM_DEFAULT); //api.Init("", "jpn", tesseract::OEM_DEFAULT); //日本語の場合 char imagePath[256]; strcpy(imagePath, "c:\\tmp\\test1.jpg"); //strcpy(imagePath, "c:\\tmp\\ocr\\jpn1.png"); STRING text_out; api.ProcessPages(imagePath, NULL, 0, &text_out); //画面 std::cout << text_out.string(); //ファイル出力 std::ofstream ofs("c:\\tmp\\ocr\\out1.txt"); ofs << text_out.string() << std::endl; //念のため api.Clear(); api.End(); }
これで前回の画像の結果は確認出来ました。日本語の場合ですが解析結果のコードがUTF8なので画面では確認出来ないです。ファイルで確認しました。APIのより詳細の利用方法は以下の参考サイトのマニュアル等を参照して下さい。今回はここまでです。次回はOpenCVでの領域の認識結果をTesseract-OCRのAPIで文字を認識するというプログラムを作ってみます。
関連サイト
Tesseract-OCR Advanced API
関連書籍