段落の設定、段落認識、認識結果の取得
段落認識クラスのインスタンスを用いて1段落認識を実行する。文書画像の設定と段落の設定を行った後に、正規化画像を作成してから認識を行う。

// 1段落認識
		int mrecognize(unsigned long chartype1,unsigned long chartype2);
		// 強制的に1段落=1文字として認識する場合
		int mrecognize1char(unsigned long chartype1,unsigned long chartype2);
		入力
		unsigned long chartype1;			文字種フィルター1
											CHAR_SET_ALL,CHAR_SET_ENGLISH,CHAR_SET_NUMBERALL
											などの組み合わせ
		unsigned long chartype2;			文字種フィルター2
											0あるいはCHAR_SET_ASCIIを指定
			chartype1で指定した文字種以外は結果に入らない
			chartype2でCHAR_SET_ASCIIを指定すると、さらにアスキー文字だけを対象に認識する。
			認識率や認識速度も上がる
		返り値
		0.................正常終了
		MEMORY_SHORTAGE...メモリ不足
// 認識結果取得
		int mgetresult(int& resultnum,OCRResult* pocrresult);
		入力
		int&		resultnum;		OCRResult構造体配列のサイズ
		OCRResult*	pocrresult;		OCRResult構造体配列
		出力
		int&		resultnum;		結果の配列の要素数
		OCRResult*	pocrresult;		OCRResult構造体配列
		返り値
		0...正常終了
            BUFFER_OVERFLOW.....バッファオーバーフロー
            この場合、実際の結果は入っていないが、
            必要な構造体配列の要素数はresultnumに返る
		pocrresultにNULLを指定して呼び出すと、純粋に結果の数を取得することができる
		BUFFER_OVERFLOWになっても副作用はないので、何度でも繰り返し呼びなおせる


#include	"ocrdef.h"
#include	"ocrco.h"
#include	"cjocrstock.h"
#include	"cjocrdict98.h"
#include	"cjocrpat98.h"
#include	"cjocrrec98.h"
#include	"cjocrline98.h"
#include	"cjocrlang.h"
#include	"cjocrblock.h"
#include	"errcode.h"
...
....
// パターンクラス作成
CJocrPattern*	pattern = new CJocrPattern;
int ret = pattern->mallocmemory();
if(ret < 0) {
	printf("パターンクラスメモリ確保エラー");
	delete pattern;
	exit(1);
}
// 辞書クラス作成
CJocrDict* pjocrdict = new CJocrDict;
pjocrdict->msetsystemdict("c:\\dic\\feature\\system");
pjocrdict->msetsystemdict("c:\\dic\\feature\\systemfat");
pjocrdict->msetuserdict("c:\\dic\\feature\\user");
ret = pjocrdict->mloaddict();
if(ret < 0) {
	printf("エラー");
	delete pjocrdict;
	delete pattern;
	exit(1);
}
// 1文字認識クラス作成
CJocrRecognize* precognize = new CJocrRecognize;
precognize->msetpatter(pattern);
precognize->msetdict(pjocrdict);
// 1文字認識クラスの初期化
ret = precognize->mallocmemory();
if(ret < 0) {
	printf("エラー");
	delete precognize;
	delete pjocrdict;
	delete pattern;
	exit(1);
}
// 言語処理付き1行認識クラス作成
CJocrLang* pjocrlang = new CJocrLang;
pjocrlang->msetpatter(pattern);
pjocrlang->msetrecognize(precognize);
// 1段落認識クラス作成
CJocrBlock* pjocrblock = new CJocrBlock;
pjocrblock->msetlang(pjocrlang);
pjocrblock->msetprocess(PREPROCESS_INSIDE);	// 枠に接触するプリミティブを除く
// ドキュメントの設定
pjocrblock->msetdocument(mdata,mwidth,mheight);
pjocrblock->msetdpi(400);		// 解像度400dpi
// 段落の設定
// ブロックの設定
OCRBlock	ocrblock;
ocrblock.baseline.x1 = 100;
ocrblock.baseline.y1 = 100;
ocrblock.baseline.x2 = 300;
ocrblock.baseline.y2 = 200;
ocrblock.thickness = 100;
// ベースラインは(100,100)-(300,200)
// 行高は100
// 背景0
// 横書きのブロックを設定
pjocrblock->msetblock(ocrblock,atan2(ocrblock.baseline.y2 - ocrblock.baseline.y1,ocrblock.baseline.x2 - ocrblock.baseline.x1),0,0);
// 正規化画像の作成
ret = pjocrblock->mregularize();
if(ret < 0) {
	printf("エラー");
	delete pjocrblock;
	delete pjocrlang;
	delete precognize;
	delete pjocrdict;
	delete pattern;
	exit(1);
}
// 1段落認識
ret = pjocrblock->mrecognize(CHAR_SET_ALL,0);		// 全文字種を対象に認識
if(ret < 0) {
	printf("エラー");
	delete pjocrblock;
	delete pjocrlang;
	delete precognize;
	delete pjocrdict;
	delete pattern;
	exit(1);
}

// 認識結果取得
int resultnum;
mgetresult(resultnum,NULL);
// result×sizeof(OCRResult)のバッファを確保する
OCRResult* pocrresult = malloc(sizeof(OCRResult) * resultnum);
if(pocrresult) {
	pjocrblock->mgetresult(resultnum,pocrresult);
}
// pocrresult[i].cand[0].codeには各文字の認識結果あるいは
// 行区切りとしての改行コード0x0d,0x0aが入っている。
....
...
..
delete pjocrblock;
delete pjocrlang;
delete precognize;
delete pjocrdict;
delete pattern;