段落の設定、正規化画像の作成と取得
1段落認識クラスのインスタンスを用いて、正規化画像を作成取得する
正規化画像とは、縦書き、横書きに応じて段落の傾きが0になるように補正した画像である。
msetprocess(PREPROCESS_EXACT);を指定しているときは、段落の中のビットマップがそのまま回転した画像が正規化画像となる。
msetprocess(PREPROCESS_INSIDE);を指定しているときは、段落の枠に接触するプリミティブを除いた内部のプリミティブだけの正規化画像となる。
// 段落の設定
void msetblock(OCRBlock* pblock,double angle,int background,int linedirection);
入力
OCRBlock* pblock; 段落の外接矩形
// ベースライン
typedef struct {
double x1;
double y1;
double x2;
double y2;
} OCRBaseline;
// 斜めの矩形
typedef struct {
OCRBaseline baseline; // ベースライン
double thickness; // 矩形の高さ(幅)
} OCRBlock;
double angle; // ベースラインの角度
// 横書きの場合は水平のベースラインからの角度
// (ラジアン単位:時計周りがプラス)
// 縦書きの場合は垂直のベースラインからの角度
// (ラジアン単位:時計周りがプラス)
int background; // 背景が0か1か
int linedirection; // 横書きか縦書きか
// 0...横書き/1...縦書き
// 正規化画像の作成
// ベースラインの角度を0にした画像を作成する
int mregularize(); // 4連結で内部の画像を処理
int mregularize8(); // 8連結で内部の画像を処理
返り値
MEMORY_SHORTAGE....正規化画像を格納するエリアを確保できなかった。
// 正規化画像のアクセサ
// 正規化画像を取得する
// 正規化画像バッファはライブラリ内部で確保されるのでライブラリ外で解放したりしないこと
void mgetregularizedata(unsigned char*& data,int& width,int& height);
出力
unsigned char*& data; // 正規化画像のアドレス
int& width; // 正規化画像の幅(ピクセル)
int& height; // 正規化画像の高さ(ピクセル)
例
#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);
}
// 正規化画像のアクセサ
unsigned char* prdata;
int rwidth;
int rheight;
mpblock->mgetregularizedata(pdata,rwidth,rheight);
....
...
..
delete pjocrblock;
delete pjocrlang;
delete precognize;
delete pjocrdict;
delete pattern;