| 通常記号 | SYMBOL_ETC | !:”’‘?^_ ̄&#@´ `‘“ |
| 数値記号 | SYMBOL_NUMBER | =+*<>/¥$%±×÷≠≦≧ |
| 中黒 | SYMBOL_NAKAGURO | ・ |
| マイナス | SYMBOL_MINUS | − |
| カンマ | SYMBOL_COMMA | , |
| ピリオド | SYMBOL_PERIOD | . |
| 丸括弧 | SYMBOL_PAREN | () |
| 括弧 | SYMBOL_BRACE | {}[]--〔〕「」『』【】 |
| 句読点 | SYMBOL_KUTOTEN | 、。 |
| 丸 | SYMBOL_MARU | ○ |
| 伸ばす棒 | SYMBOL_NOBASBO | ー |
| アラビア数字 | CHAR_NUMBER | 0〜9 |
| アルファベット大文字 | CHAR_ALPHABET_CAPITAL | A−Z |
| アルファベット小文字 | CHAR_ALPHABET_SMALL | a−z |
| カタカナ大文字 | CHAR_KATAKANA_CAPITAL | ア−ン |
| カタカナ小文字 | CHAR_KATAKANA_SMALL | ァ−ヶ |
| ひらがな大文字 | CHAR_HIRAGANA_CAPITAL | あ−ん |
| ひらがな小文字 | CHAR_HIRAGANA_SMALL | ぁ−ょ |
| 漢数字 | CHAR_KANJI_NUMBER | 一二三四五六七八九十百千万億兆 |
| 漢字 | CHAR_KANJI |
| アスキー記号 | ASCII_CHARSET |
| ファイル名 | FILE_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) |
// パターンの外接矩形
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;
typedef struct {
short x1; // パターンの左上x座標
short y1; // パターンの左上y座標
short x2; // パターンの右下x座標
short y2; // パターンの右下y座標
} OCRRect;
| 基本辞書 | |||
| 辞書名 | レコードファイル名 | キーファイル名 | 内容 |
|---|---|---|---|
| system | system.dbs | system.key | 必須 |
| systemfat | systemfat.dbs | systemfat.key | 必須 |
| オプション辞書(差分辞書) | |||
| diff0 | diff0.dbf | diff0.kef | 楷書体 |
| diff1 | diff1.dbf | diff1.kef | かすれ文字 |
| diff2 | diff2.dbf | diff2.kef | つぶれ文字 |
| diff3 | diff3.dbf | diff3.kef | 数字 |
| diff4 | diff4.dbf | diff4.kef | 英字 |
| diff5 | diff5.dbf | diff5.kef | かな |
| ユーザパターン辞書 | |||
| 任意の名称 | |||
| kana | kana.dbf | kana.kef | ひらがな、カタカナ追加 |
| optblur | optblur.dbf | optblur.kef | 重度かすれ文字1 |
| blur | blur.dbf | blur.kef | 重度かすれ文字2 |
| optblot | optblot.dbf | optblot.kef | 重度つぶれ文字1 |
| blot | blot.dbf | blot.kef | 重度つぶれ文字2 |
| ninja001 | ninja001.dbf | ninja001.kef | 英数字追加 |
|
ユーザ辞書について |
|
ユーザ辞書のフォーマットは、オプション辞書と同じですが、ユーザ辞書参照のために、パターンの画像そのものも保存されている点だけが異なっています。1つの辞書クラスのインスタンスでは、1つのユーザ辞書しか使うことはできません。 また、1つの辞書クラスのインスタンスが生成されて破棄されるまでの間では、通常は最大1024のパターンしか登録することはできません。1024以上のパターンを登録するためには、いったんインスタンスをdeleteしてから、生成・初期化しなおす必要があります。 また、ユーザ辞書は、インスタンスが存在するあいだは、常に排他的に管理されているために、1台のマシン上では、同時に1つのユーザ辞書しか用いることはできません。複数の認識クラスのインスタンスで1つのユーザ辞書を共有するには、1つの辞書クラスのインスタンスを共有するようにする必要があります。 1つの辞書のレコード数の上限は8192です。通常の辞書は、数百〜数千程度の文字に対応するレコードを含んでいます。 辞書の規模が大きくなるほど、認識に要する時間が長くなります。 ちなみに現時点(1999年6月)では、基本辞書とオプション辞書全てを合わせたレコードの総数は約10000です。 |
| FILE_OPEN_ERROR | ファイルが見つからない。 ファイルがロックされている(その辞書は現在使用中) 同じユーザ辞書を使っているインスタンスが既に存在 同じシステム辞書を他のインスタンスがロード中 |
| FILE_READ_ERROR | リードエラー(辞書が壊れている可能性があります) |
| FILE_SEEK_ERROR | シークエラー(辞書が壊れている可能性があります) |
| MEMORY_SHORTAGE | メモリ不足 |
| FATAL_ERROR | 致命的エラー(辞書レコードが1つも読み込めなかった) |
#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;
int i1 = pjocrdict->mput("漢",pattern);
if(i1 < 0) {
エラー;
FILE_SEEK_ERROR
FILE_WRITE_ERROR
}
int i1 = pjocrdict->mseek("漢");
if(i1 < 0) {
エラー;
}
if(i1 == 1) {
// 削除
i1 = pjocrdict->mdel();
if(i1 < 0) {
エラー;
}
}
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 {
エラー;
}
| クラス名 | CJocrDict |
| ヘッダファイル | ocrdef.h ocrco.h cjocrstock.h cjocrdict98.h errcode.h |
| クラス名 | CJocrPattern |
| ヘッダファイル | ocrdef.h ocrco.h cjocrpat98.h errcode.h |
// 1...パターンクラスのインスタンス作成
CJocrPattern* pattern = new CJocrPattern;
// 2...メモリ確保
i1 = pattern->mallocmemory();
if(i1 < 0) {エラーメッセージ表示;delete pattern;}
.....
delete pattern;
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;
| クラス名 | 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;
pattern->mrecognize(CHAR_SET_ALL); // 認識結果の取得 // OCRResultについては、リファレンスマニュアルの2-2を参照して下さい。 OCRResult aresult; mgetresult(&aresult);
| クラス名 | 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;
// 行の設定
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) {エラーメッセージ表示;}
}
| クラス名 | CJocrLang |
| ヘッダファイル | ocrdef.h ocrco.h cjocrline98.h cjocrlang.h errcode.h |
| クラス名 | CJocrBlock |
| ヘッダファイル | ocrdef.h ocrco.h cjocrblock.h errcode.h |