ALOCR Ver 1.0 リファレンスマニュアル

目次
  1. 定数と構造体
    1. 文字種コントロール
    2. 認識結果

  2. 各論
    1. パターン辞書の種類
    2. パターン辞書クラスの構築
    3. ユーザ辞書管理
    4. 辞書クラス:CJocrDictリファレンス
    5. パターンクラスの構築
    6. パターンの特徴計算
    7. パターンクラス:CJocrPatternリファレンス
    8. 1文字認識クラスの構築
      2000年11月06日更新 ライセンスコードに加えて、ライセンスコードファイルも指定できるようになった
    9. 1文字認識
    10. 1文字認識クラス:CJocrRecognizeリファレンス
    11. 1行認識クラスの構築
    12. 1行認識
    13. 1行認識クラス:CJocrLineリファレンス
    14. 言語処理付き1行認識クラス:CJocrLangリファレンス
    15. 1段落認識クラス:CJocrBlockリファレンス
      2002年07月31日更新 段落のスキューを指定できるようになった。一行のテキストに限定して、イタリック体を認識することができる。
      2005年08月31日更新 新規辞書の追加
      2005年08月31日更新 新バージョン認識メソッド。従来のものと比較して認識率が大幅アップ
      2022年11月30日更新 深層学習対応。カラー画像、グレイスケール画像認識対応。従来のものと比較して認識率が大幅アップ


  3. サンプルプログラム
    1. VC++のサンプルプロジェクト


マニュアルホームページ

ユーザーズマニュアル


リファレンスマニュアル

1.定数と構造体


1.1 文字種コントロール

文字種は、文字種フラグの論理和で指定します。文字種フラグは、ヘッダファイルocrdef.hに定義されています。ライブラリのユーザが指定できるのは、以下のフラグです。1文字認識クラスと1行認識クラスのmrecognizeメンバ関数で文字種を指定して認識します。mrecognizeの第1引数と第2引数の2つで文字種を指定します。第2引数ではアスキー記号、ファイル名記号といった意味的な制約を指定します。

mrecognizeの第1引数として指定可能なフラグ

通常記号SYMBOL_ETC!:”’‘?^_ ̄&#@´ `‘“
数値記号SYMBOL_NUMBER=+*<>/¥$%±×÷≠≦≧
中黒SYMBOL_NAKAGURO
マイナスSYMBOL_MINUS
カンマSYMBOL_COMMA
ピリオドSYMBOL_PERIOD
丸括弧SYMBOL_PAREN()
括弧SYMBOL_BRACE{}[]--〔〕「」『』【】
句読点SYMBOL_KUTOTEN、。
SYMBOL_MARU
伸ばす棒SYMBOL_NOBASBO
アラビア数字CHAR_NUMBER0〜9
アルファベット大文字CHAR_ALPHABET_CAPITALA−Z
アルファベット小文字CHAR_ALPHABET_SMALLa−z
カタカナ大文字CHAR_KATAKANA_CAPITALア−ン
カタカナ小文字CHAR_KATAKANA_SMALLァ−ヶ
ひらがな大文字CHAR_HIRAGANA_CAPITALあ−ん
ひらがな小文字CHAR_HIRAGANA_SMALLぁ−ょ
漢数字CHAR_KANJI_NUMBER一二三四五六七八九十百千万億兆
漢字CHAR_KANJI 

目次


mrecognizeの第2引数として指定可能なフラグ

アスキー記号ASCII_CHARSET
ファイル名FILE_CHARSET

第2引数は、第1引数で指定した文字種をさらに絞り込むために指定されます。例えば数値記号(=+*<>/¥$%±×÷≠≦≧)のうちASCII記号(=+*<>/¥$%)だけを利用するときは、

mrecognize(SYMBOL_NUMBER,ASCII_CHARSET);

と指定します。またアルファベットやアラビア数字を指定すると"WA"や"12"のような2桁の英字、数字も認識対象となります。2桁の英数字は、漢字かなと混在する英数字の認識率を上げる効果がありますが、認識対象が英数字であると分かっているときは、逆効果となります。その場合は、

mrecognize(CHAR_NUMBER | CHAR_ALPHABET_CAPITAL | CHAR_ALPHABET_SMALL,ASCII_CHARSET);

のように指定します。
また、文字種フラグには以下のようなマクロも定義されています。

マクロ定数内容定義内容
CHAR_SET_SYMBOL記号(SYMBOL_ETC | SYMBOL_NUMBER | SYMBOL_NAKAGURO | SYMBOL_MINUS | SYMBOL_MARU | SYMBOL_NOBASBO)
CHAR_SET_KAKKO括弧類(SYMBOL_PAREN | SYMBOL_BRACE)
CHAR_SET_TERMINAL句読点(SYMBOL_PERIOD | SYMBOL_COMMA | SYMBOL_KUTOTEN)
CHAR_SET_ALPHABETアルファベット全て(CHAR_ALPHABET_SMALL | CHAR_ALPHABET_CAPITAL)
CHAR_SET_HIRAGANAひらがな(CHAR_HIRAGANA_CAPITAL | CHAR_HIRAGANA_SMALL)
CHAR_SET_KATAKANAカタカナ(CHAR_KATAKANA_CAPITAL | CHAR_KATAKANA_SMALL)
CHAR_SET_KANJI漢字全て(CHAR_KANJI | CHAR_KANJI_NUMBER)
CHAR_SET_ALL全文字種(CHAR_SET_SYMBOL | CHAR_SET_KAKKO | CHAR_SET_TERMINAL | CHAR_NUMBER | CHAR_SET_ALPHABET | CHAR_SET_HIRAGANA | CHAR_SET_KATAKANA | CHAR_SET_KANJI)

基本的には、これらのマクロの論理和で、認識文字種を指定するようにします。

目次


1.2 認識結果

目次
認識結果は以下のような構造体で管理されています。
コメントの無いメンバーは未公開の内部情報です。
// パターンの外接矩形
typedef struct {
    short		x1;			// パターンの左上x座標
    short		y1;			// パターンの左上y座標
    short		x2;			// パターンの右下x座標
    short		y2;			// パターンの右下y座標
} OCRRect;
// 認識候補
typedef struct {
    char*           code;       // パターン文字列へのポインタ
    unsigned char   score;      // 確信度
    unsigned char   filler[3];  // padding
} Candidate;
//////////////////
// OCRの結果構造体
// 128バイト固定
typedef struct {
    Candidate       cand[MAX_CAND]; // 候補データMAX_CAND == 10 80 bytes
    OCRRect         area;           // OCRした領域               8 bytes
    long            fieldtype;
    unsigned long   chartype;       // 文字認識結果の文字種
    unsigned long   maskchartype1;
    unsigned long   maskchartype2;
    unsigned long   space;          // 1行認識で文字の後に続くスペースの数
    unsigned char   cgravx;
    unsigned char   cgravy;
    unsigned char   morph;
    unsigned char   size;
    char            newcand[KEYSIZE_MAX];
} OCRResult;

認識結果が

OCRResult ocrresult;

とすると、ocrresult.cand[0]〜ocrresult.cand[9]が認識結果の候補となり、ocrresult.cand[0].codeを第1候補の指す文字列、すなわちパターンの認識結果とみなすことができます。

OCRResultのメンバーで、もっとも重要なメンバーは、認識結果の文字列を示す。Candidate配列です。ALOCRライブラリでは、最大10の候補がOCRResultに含まれています。

Candidate構造体のcodeメンバーが、認識結果の文字列を指しています。大部分のケースでは、codeは1文字の漢字文字列を指しています。このcodeの先は、辞書からロードした(あるいはユーザ辞書に登録した)文字列を指しています。したがって、辞書クラスをdeleteした場合は、ポインタの先は保証されないので注意して下さい。

候補は、個々のパターンに対する第1候補、第2候補となっている。たとえば第2候補をつなげたものは、文字列の認識結果の第2候補とはならないので注意が必要である。
候補の数が10に満たない場合は、codeの先は、NULLではなく""を指しています。さらにscoreが0であることで、候補が無いことが分かります。


Candidate構造体のscoreメンバーは、候補文字の確信度を示しています。確信度の値は、0から100の範囲にあります。0の場合は、候補が無いことを示しています。候補がある場合の確信度は1〜100の範囲にあり、100に近いほど認識結果として確からしい事を示しています。

通常、第1候補の確信度は60以上で、それ以下の場合は、認識がうまくいっていない可能性が高くなります。

OCRResultのメンバーで、areaメンバーは、認識したパターン(文字)の外接矩形を示してます。画像の左上が原点で、右方向がx座標の正方向、下方向がy座標の正方向となります。

typedef struct {
	short		x1;			// パターンの左上x座標
	short		y1;			// パターンの左上y座標
	short		x2;			// パターンの右下x座標
	short		y2;			// パターンの右下y座標
} OCRRect;

OCRResultの他のメンバーは、chartypeがcand[0].codeが指している文字列の文字種。spaceは1行認識における、文字と文字との間隔(漢字1文字をスペース2と換算したときのスペース数)を示しています。その他のメンバーは、未公開の内部情報です。


目次


2.各論


2.1 パターン辞書の種類

目次
パターン辞書はフォーマットの上では3種類存在します。

  1. 基本辞書形式(2)
  2. オプション辞書形式(任意の数)
  3. ユーザ辞書形式(0あるいは1)
認識するためには、2つの基本辞書が必ず必要になります。他の辞書はなくても構いません。オプション辞書は、基本辞書との差分情報なので、差分辞書とも呼びます。基本辞書を組み合わせない差分辞書には意味がありません。

基本辞書
辞書名レコードファイル名キーファイル名内容
systemsystem.dbssystem.key必須
systemfatsystemfat.dbssystemfat.key必須
オプション辞書(差分辞書)
diff0diff0.dbfdiff0.kef楷書体
diff1diff1.dbfdiff1.kefかすれ文字
diff2diff2.dbfdiff2.kefつぶれ文字
diff3diff3.dbfdiff3.kef数字
diff4diff4.dbfdiff4.kef英字
diff5diff5.dbfdiff5.kefかな
ユーザパターン辞書
任意の名称
2005年8月31日に新しく追加した辞書
基本辞書自体のエントリーが第2水準漢字が54文字追加されました。また偏旁冠足に関する情報が追加されました。
kana/ninja001は、英数字かなの認識率を高める効果があります。
「日」が「II」に近くなるように激しくかすれているような場合は、optblurとblurを追加すると効果があります。
「書」が「■」に毛が生えたように激しくつぶれているような場合は、optblotとblotを追加すると効果があります。
2005年度内公開予定の一般文書認識APIには、文書のかすれ・つぶれ度合いを判定するものが入ります。
新しく追加されたパターン辞書
kanakana.dbfkana.kefひらがな、カタカナ追加
optbluroptblur.dbfoptblur.kef重度かすれ文字1
blurblur.dbfblur.kef重度かすれ文字2
optblotoptblot.dbfoptblot.kef重度つぶれ文字1
blotblot.dbfblot.kef重度つぶれ文字2
ninja001ninja001.dbfninja001.kef英数字追加

ある程度実用的な認識率を得るためには、基本辞書+diff3+diff4+diff5の辞書の利用を推奨します。楷書体diff0は、名刺など特殊な文書にしか現れないので、通常は組み込みません。認識対象の画質が悪い場合はdiff1とdiff2を追加すると大きな効果の出る場合があります。

ユーザ辞書について
ユーザ辞書のフォーマットは、オプション辞書と同じですが、ユーザ辞書参照のために、パターンの画像そのものも保存されている点だけが異なっています。1つの辞書クラスのインスタンスでは、1つのユーザ辞書しか使うことはできません。

また、1つの辞書クラスのインスタンスが生成されて破棄されるまでの間では、通常は最大1024のパターンしか登録することはできません。1024以上のパターンを登録するためには、いったんインスタンスをdeleteしてから、生成・初期化しなおす必要があります。
また、ユーザ辞書は、インスタンスが存在するあいだは、常に排他的に管理されているために、1台のマシン上では、同時に1つのユーザ辞書しか用いることはできません。複数の認識クラスのインスタンスで1つのユーザ辞書を共有するには、1つの辞書クラスのインスタンスを共有するようにする必要があります。

1つの辞書のレコード数の上限は8192です。通常の辞書は、数百〜数千程度の文字に対応するレコードを含んでいます。
辞書の規模が大きくなるほど、認識に要する時間が長くなります。
ちなみに現時点(1999年6月)では、基本辞書とオプション辞書全てを合わせたレコードの総数は約10000です。

目次


2.2 パターン辞書クラスの構築

目次
基本辞書クラスの構築は、
  1. インスタンスの作成
  2. 基本辞書名、オプション辞書名、ユーザ辞書名の設定
  3. 辞書のロード
の順番で行います。基本辞書とユーザ辞書を併せて最大、JOCRMAXDICT個の辞書を設定することができます。JOCRMAXDICTは、現在12として定義されています。設定関数のエラーは、設定した辞書が、JOCRMAXDICTを越えたときだけ発生するので、面倒であれば返り値は見なくても構いません。

辞書のロードの際に、ファイルをオープン、リードし、動的にメモリを確保するので、

FILE_OPEN_ERRORファイルが見つからない。
ファイルがロックされている(その辞書は現在使用中)
同じユーザ辞書を使っているインスタンスが既に存在
同じシステム辞書を他のインスタンスがロード中
FILE_READ_ERRORリードエラー(辞書が壊れている可能性があります)
FILE_SEEK_ERRORシークエラー(辞書が壊れている可能性があります)
MEMORY_SHORTAGEメモリ不足
FATAL_ERROR致命的エラー(辞書レコードが1つも読み込めなかった)

のいずれかのエラーが返る可能性があります。
エラーコードは、ヘッダファイルerrcode.hに定義されています。ファイル関連のエラー(FILE_...._ERROR)では、エラーのあったファイル以外は正常に読み込まれており、処理を継続することはできます(通常は処理を中止して、エラーの原因を取り除くことをお薦めします)。MEMORY_SHORTAGEをFATAL_ERRORは、それ以降の処理を継続しないで、インスタンスをdeleteした後に、直ちにデータの保存と終了処理を行うべきです。


基本辞書クラスの構築のコード例

#include	"ocrdef.h"
#include	"ocrco.h"
#include	"cjocrstock.h"
#include	"cjocrdict98.h"
#include	"errcode.h"

.....

// 1...辞書クラスのインスタンス作成
  	CJocrDict* pjocrdict = new CJocrDict;
// 2...基本辞書の設定
	pjocrdict->msetsystemdict("\\dic\\feature\\system");
	pjocrdict->msetsystemdict("\\dic\\feature\\systemfat");
// 3...オプション辞書の設定
	pjocrdict->msetdiffdict("\\dic\\feature\\diff1");
	pjocrdict->msetdiffdict("\\dic\\feature\\diff2");
	pjocrdict->msetdiffdict("\\dic\\feature\\diff3");
	pjocrdict->msetdiffdict("\\dic\\feature\\diff4");
	pjocrdict->msetdiffdict("\\dic\\feature\\diff5");
// 5...ユーザ辞書の設定(オプション)
	m_pJocrDict->msetuserdict("\\dic\\feature\\userpat");
// 6...ロード
	i1 = pjocrdict->mloaddict();
	if(i1 < 0) {
		エラー(errcode.hに定義)
		FILE_OPEN_ERROR	辞書が見つからない
		FILE_READ_ERROR	辞書が読み込めない
		FILE_SEEK_ERROR	辞書のレコードにシークできない
		MEMORY_SHORTAGE	メモリ不足(これ以降の処理はしない)
		FATAL_ERROR		リカバリ不能エラー(これ以降の処理はしない)
	}

......認識、登録、削除、参照

// インスタンス削除
	delete pjocrdict;

目次


2.3 ユーザ辞書管理

目次
辞書クラスは、高速ISAMファイル管理プログラムであるCNgkDatabaseクラスライブラリを使っています。レコードのキーは、KEYSIZE_MAX(ocrdef.hで16として定義)-1までの長さの文字列です。たいていの場合は、2バイト・1文字の漢字です。

レコード読み込み、削除は、シークしてからそれぞれに対応した関数を呼び出します。登録は、登録関数をコールするだけでシークもついでに行うようになっています。

シークには、先頭レコード、前後のレコード、末尾のレコードへのシーケンシャルアクセスと、キー(文字列)を使ったランダムアクセスの2種類があります。

また、1回CJocrDictクラスのインスタンスを構築した後には、1024個までしか登録することができません。それ以上登録を行うときは、CJocrDictのインスタンスをdeleteしてから再構築する必要があります。この不便は、CJocrDictクラスで、パターン辞書を読み込んだ後に高速アクセスのためのテーブルを作っている代償です。

大規模な辞書をバッチ的に構築するときには、1024個の制限を取り払って1〜65000の範囲に再設定することが可能です。

  1. シークして登録
    patternはCJocrPatternクラスのインスタンスであるとします。patternに「漢」という漢字のパターンの画像を設定して特徴計算をしてから(pattern->mcalcall(...)を呼んでから)
    	int i1 = pjocrdict->mput("漢",pattern);
    	if(i1 < 0) {
    		エラー;
    		FILE_SEEK_ERROR
    		FILE_WRITE_ERROR
    	}
    
  2. シークして削除
    ユーザ辞書からキー"漢"に対応するレコードを消去するときは、以下のように、最初にシークしてから、削除関数をコールします。
    	int i1 = pjocrdict->mseek("漢");
    	if(i1 < 0) {
    		エラー;
    	}
    	if(i1 == 1) {
    		// 削除
    		i1 = pjocrdict->mdel();
    		if(i1 < 0) {
    			エラー;
    		}
    	}
    
  3. 次のレコードへシークして、キーとパターンの画像を取得する。
    	int i1 = pjocrdict->mseeknext();
    	// keysizeは入力・出力両方に使われる変数
    	// 入力時には、読み込みバッファ最大サイズ
    	// 出力時には、実際の読み込みサイズ
    	unsigned long	keysize = KEYSIZE_MAX;
    	char			keybuffer[KEYSIZE_MAX];
    	if(i1 == 1) {
    		i1 = pjocrdict->mgetkey(keysize,keybuffer);
    		if(i1 < 0) {
    			エラー;
    		}
    		else {
    			// REG_FONT_SIZEは正規化フォントサイズ(バイト単位)である
    			// ユーザ辞書登録時にREG_FONT_SIZEに縮小・拡大されて保存される
    			// ALOCR Ver.1.0ではn正規化フォントは48×48画素で288バイトである
    			// REG_FONT_WIDTH....48
    			// REG_FONT_HEIGHT....48
    			// REG_FONT_SIZE....48*48/8(8ピクセル=1バイト)
    			// recordsizeは入力・出力両方に使われる変数
    			// 入力時には、読み込みバッファ最大サイズ
    			// 出力時には、実際の読み込みサイズ
    			unsigned long	recordsize  = REG_FONT_SIZE;
    			char			record[REG_FONT_SIZE];
    			i1 = mgetpattern(recordsize,record);
    			if(i1 < 0) {
    				エラー;
    			}
    			// 取得したパターンはREG_FONT_WIDTH×REG_FONT_HEIGHTピクセル
    			// のビットマップである。
    		}
    	}
    	else if(i1 == 0) {
    		次のレコードはない;
    	}
    	else {
    		エラー;
    	}
    

目次


2.4 辞書クラスリファレンス

目次
クラス名CJocrDict
ヘッダファイルocrdef.h
ocrco.h
cjocrstock.h
cjocrdict98.h
errcode.h
  1. 基本辞書の設定
  2. オプション辞書(差分辞書)の設定
  3. ユーザ辞書の設定
  4. 設定した辞書のロード
  5. シーク
  6. パターン登録キーの取得
  7. パターン画像の取得
  8. 登録
  9. 削除
  10. レコード数取得
  11. ユーザ辞書登録数の上限変更

目次


2.5 パターンクラスの構築

目次
クラス名CJocrPattern
ヘッダファイルocrdef.h
ocrco.h
cjocrpat98.h
errcode.h
1つの文字列キーとして認識する最小の単位をパターンと呼びます。通常1文字=1パターンですが、ALOCRではこの制限を外しています。以下のように1パターンが2文字以上になるのを許しています。

1つのパターンに、最大15バイトまでの文字列を割り当てることができます。

	// 1...パターンクラスのインスタンス作成
	CJocrPattern* pattern = new CJocrPattern;
	// 2...メモリ確保
	i1 = pattern->mallocmemory();
	if(i1 < 0) {エラーメッセージ表示;delete pattern;}

	.....

	delete pattern;


目次


2.6 パターンの特徴計算

目次
パターンクラスは、パターンの画像の切り出し、正規化と特徴計算を行うためのクラスです。切り出し、正規化と特徴計算は、以下の1つのメンバー関数で実行します。画像データは以下のように定義されています。

typedef struct {
	unsigned char* 	top;		// 画像データの先頭アドレス
	short			width;		// 画像データの幅(バイト境界、ピクセル単位)
	short			height;		// 画像データの高さ(ピクセル単位)
} OCRBuffer;
typedef struct {
	short		x1;			// パターンの左上x座標
	short		y1;			// パターンの左上y座標
	short		x2;			// パターンの右下x座標
	short		y2;			// パターンの右下y座標
} OCRRect;

パターン画像の切り出し、正規化、特徴計算は以下のメンバー関数をコールします。第3引数は背景がビット0のときは0、背景がビット1のときは1を指定します。

pattern->mcalcall(OCRBuffer* pocrbuffer,OCRRect* prect,0);


目次


2.7 パターンクラス:CJocrPatternリファレンス

  1. 特徴計算


目次


2.8 1文字認識クラスの構築

目次
クラス名CJocrRecognize
ヘッダファイルocrdef.h
ocrco.h
cjocrrec98.h
errcode.h

認識関連の関数、認識用のワークバッファを管理するクラスです。クラスのメンバー変数として、辞書クラスのインスタンスとパターンクラスのインスタンスを設定し、パターンクラスの特徴ベクトルと、辞書クラスの特徴ベクトルを比較するのが主な処理です。

パターン認識は、基本的には、パターンクラスの特徴ベクトルに最も近い特徴ベクトルを持つ辞書クラスのレコードのキーを出力するという非常に単純な処理です。

ただし、認識対象の種類が非常に大きいために、まともに計算したのでは、処理時間が実用範囲内におさまりません。高速化のための様々な工夫がなされています。

	// 1...認識クラスのインスタンス作成
	// ライブラリライセンサーから供給される20桁のコードを指定してインスタンスを構築します。
// 2000年11月06日更新 // あるいはライブラリライセンサーから供給されるライセンスコードファイルのパスを指定します。
CJocrRecognize* precognize = new CJocrRecognize("ABCDEFGHJKLMNPQ23456"); // ライセンスコードファイルの場合 CJocrRecognize* precognize = new CJocrRecognize("C:\\Program Files\\Foo\\jocr.kcd"); // 2...パターン設定 // patternをCJocrPatternクラスのインスタンスとする // .....patternの生成と初期化 precognize->msetpatter(pattern); // 3...辞書設定 // pjocrdictをCJocrDictクラスのインスタンスとする // .....pjocrdictの生成と初期化 precognize->msetdict(pjocrdict); // 4...メモリ確保 i1 = precognize->mallocmemory(); if(i1 < 0) { MEMORY_SHORTAGE....メモリ不足(errcode.hに定義) エラーメッセージ表示;delete pattern; } .... 1文字認識処理をくり返す .... delete pattern;

目次


2.9 1文字認識

目次
引数には認識文字種を指定する。主な文字種は
などがocrdef.hに定義されています。詳しくは.....を参照。
	pattern->mrecognize(CHAR_SET_ALL);
	// 認識結果の取得
	// OCRResultについては、リファレンスマニュアルの2-2を参照して下さい。
	OCRResult	aresult;
	mgetresult(&aresult);

目次


2.10 1文字認識クラス:CJocrRecognizeリファレンス

  1. 初期化
  2. 認識、識別、認識結果の取得

目次


2.11 1行認識クラスの構築

目次

1行認識クラスは、Y軸正が下方向の座標系のみサポートしています。Y軸正が上方向の座標系は1段落認識クラスのみでサポートされています。

クラス名CJocrLine
ヘッダファイルocrdef.h
ocrco.h
cjocrline98.h
errcode.h
	// 1...行クラスのインスタンス作成
  	CJocrLine* pjocrline = new CJocrLine;
	// 2...行クラスにパターンクラスのインスタンスを設定(patternは他で構築済み)
	//     mallocmemoryまで実行が済んでいる必要がある
	pjocrline->msetpattern(pattern);
	// 3...行クラスに認識クラスのインスタンスを設定(precognizeは他で構築済み)
	//     msetpattern,msetdict,mallocmemoryまで実行が済んでいる必要がある
	pjocrline->msetrecognize(precognize);
	// 4...ドキュメントの初期化
	// 認識対象のイメージバッファが変化するたびにコールする
	typedef struct {
		unsigned char* 	top;		// 画像データの先頭アドレス
		short			width;		// 画像データの幅(バイト境界、ピクセル単位)
		short			height;		// 画像データの高さ(ピクセル単位)
	} OCRBuffer;
	OCRBuffer aocrbuffer;
	aocrbuffer.top = ...;		// バッファアドレス
	aocrbuffer.width = ...;		// バッファ横幅(ピクセル単位、8の倍数)
	aocrbuffer.height = ...;	// バッファ縦幅(ピクセル単位)
	int i1 = pjocrline->msetdocument(&aocrbuffer);
	if(i1 < 0) {
		// MEMORY_SHORTAGE....メモリ不足
		エラーメッセージ表示;
		delete pjocrline;
	}
    pjocrline->msetdpi(400);    // 解像度400dpi
	1行認識をくり返す。認識対象のイメージバッファが変わったときに、
	msetdocumentを呼ぶ。

	delete pjocrline;

目次


2.12 1行認識


1行認識クラスは、Y軸正が下方向の座標系のみサポートしています。Y軸正が上方向の座標系は1段落認識クラスのみでサポートされています。
	// 行の設定
	OCRRect aocrrect;
	aocrrect.x1;		// 行の外接矩形の左上X座標
	aocrrect.y1;		// 行の外接矩形の左上Y座標
	aocrrect.x2;		// 行の外接矩形の右下X座標
	aocrrect.y2;		// 行の外接矩形の右下Y座標
#if 横書き
	msetlineuser(&aocrrect,HORIZONTAL_LINE);	// 横書き
#else
	msetlineuser(&aocrrect,VERTICAL_LINE);		// 縦書き
#endif
	// 1行認識
	i1 = pjocrline->mrecognize(CHAR_SET_ALL);
	if(i1 < 0) {エラーメッセージ表示;}
	else {
		int			resultnum;
		OCRResult	pocrresult[resultnum];
		// 結果の取得
		i1 = pjocrline->mgetresult(resultnum,pocrresult);
		if(i1 < 0) {エラーメッセージ表示;}
	}

目次


2.13 1行認識クラスリファレンス

1行認識クラスは、Y軸正が下方向の座標系のみサポートしています。Y軸正が上方向の座標系は1段落認識クラスのみでサポートされています。

  1. 初期化
  2. ドキュメントの設定
  3. 行の設定、行認識、認識結果の取得

目次


2.14 言語処理付き1行認識クラスリファレンス


1行認識クラスは、Y軸正が下方向の座標系のみサポートしています。Y軸正が上方向の座標系は1段落認識クラスのみでサポートされています。
クラス名CJocrLang
ヘッダファイルocrdef.h
ocrco.h
cjocrline98.h
cjocrlang.h
errcode.h

認識結果に対して言語的な知識を用いて自動修正を行います。最大で誤認識の50%を自動修正することができます。ALOCR Ver.1.0では、標準で20メガバイトの一般文書向けの言語辞書が付属しています。
  1. 初期化

目次


2.15 1段落認識クラスリファレンス

クラス名CJocrBlock
ヘッダファイルocrdef.h
ocrco.h
cjocrblock.h
errcode.h

縦書きあるいは横書きの1段落のテキストを認識します。認識結果に対して言語的な知識を用いて自動修正を行うこともできます。最大で誤認識の50%を自動修正することができます。ALOCR Ver.1.0では、標準で20メガバイトの一般文書向けの言語辞書が付属しています。
1段落認識クラスは、Y軸正が下方向の座標系とY軸正が上方向の座標系の両方をサポートしています。

  1. 初期化
  2. ドキュメントの設定
    段落のスキューを指定できるようになった。一行のテキストに限定して、イタリック体を認識することができる。
  3. 段落の設定、正規化画像の作成と取得
  4. 段落認識、認識結果の取得
  5. 新バージョン認識メソッド
  6. 深層学習対応認識メソッド

目次


  • 3 サンプルプログラム
    目次

    3.1 VC++のサンプルプロジェクト(付属)

    Visual C++ 4.2のプロジェクトソースファイル形式でサンプルプログラムが付属しています。
    使い方
    1. モノクロのBMP形式ファイルを読み込みます。
    2. 「認識」メニューの「認識モード」を選択すると、「認識結果」ダイアログが表示されます。
    3. 「認識結果」ダイアログが表示されているときに、マウスの左ボタンによるドラッグで文字列を囲むと、その部分が認識されて、「認識結果」ダイアログに結果が表示されます。
    4. 「認識結果」ダイアログの文字の上でダブルクリックすると「候補文字」表示ダイアログが表示されます。
    5. 候補を選択して「置換」ボタンを押すと認識結果が置換されます。
    6. 「登録」ボタンを押すとユーザ辞書登録ダイアログが表示されます。「登録」ボタンをもう1度クリックするとパターンが指定した文字をキーとして登録されます。
    7. 「認識」メニューの「文字種設定」を選択すると、認識対象の文字種を変更することができます。
    8. 「認識」メニューの「ユーザ辞書参照」を選択すると、ユーザ辞書の内容を参照、削除することができます。

    プログラムの詳細については、ソースファイルのコメントをご覧ください。

    目次


    マニュアルホームページ

    ユーザーズマニュアル