CJocrPrimEXクラスリファレンスマニュアル

目次
拡張サブクラスCJocrPrimEX
  1. 概要
  2. ABSTRACTPARAMETER構造体
  3. パラメータ入出力
  4. パラメータ調整ツール
  5. パラメータファイル仕様
  6. 新しい角度推定(2000年10月10日追加)
  7. 破線抽出(2002年07月31日追加)
  8. 文字抽出パラメータの推定(2002年07月31日追加)

拡張サブクラスCJocrPrimEX

この機能は、SDKのオプション機能です。
オーバーライド(クラスタ抽出)機能を使った、CJocrPrimのサブクラスです。CJocrPrimクラスよりも強力なクラスタ抽出機能を持っています。
性能的には、クラスタ抽出パラメータを非常に細かくコントロールすることによって、精度の高い抽出を行うことができます。
さらに、面積、重心といったパラメータを抽出に利用する機能、テキストブロック、破線のようなノイズ、写真のようなベタ画像領域を区別する機能も付加されています。
また、抽出対象領域を矩形で指定することによって、帳票から効率的にテキストを抽出することもできます。
豊富なパラメータを持っているため、パラメータ入出力機能やパラメータ調整ツールなどと組み合わせて利用することを前提としています。
目次


1 概要

このクラスにアクセスするには、ヘッダファイル"absparam.h"、"cjocrprimex.h"が必要になります。CJocrPrimクラスのサブクラスであるため、CJocrPrimクラスの機能は全て利用することができます。それに加えて、拡張されたクラスタ抽出機能がサポートされています。
拡張されたクラスタ抽出機能を使うには、
ABSTRACTPARAMETER構造体によって抽出パラメータを設定する必要があります。この構造体に設定するデータは非常にたくさんありますが、大部分はオプションのパラメータとなっていて、CJocrPrimクラスのクラスタ抽出よりもシンプルに利用することも可能です。
パラメータの機能をフルに利用するには、パラメータ調整ツールで、実際にパラメータの効果を確認しながら、妥当なパラメータを作成し、パラメータファイルとして保存します。
そのファイルをパラメータ入出力関数で読み込み設定します。
パラメータファイルは編集可能なテキスト形式になっていますが、適当なパラメータ設定ツールがないと、非常に設定が難しいので、慣れるまでは、パラメータ調整ツールを使うようにしましょう。
パラメータ設定後は、オーバーライド(クラスタ抽出)で記述している、mabstractclusterfilter関数を使って、クラスタ抽出を実行します。
抽出に面積情報を利用する場合、mcalcfeaturepixelで、全てのプリミティブの面積を計算しておく必要があります。
抽出に周囲長情報を利用する場合、mcalcfeatureで、全てのプリミティブの面積と周囲長を計算しておく必要があります。
また、ベタグラフィック内部のクラスタを除外する場合、makeprimあるいはmakeprim8の後、mabstractclusterfilterの前に、
// ベタ画像の検出
int        mregistbeta();
返り値
0....正常終了
負...エラー
をコールしなければなりません。その前後の処理は、mabstractcluster関数と一緒です。
目次


3.2 ABSTRACTPARAMETER構造体

///////////////////////// // クラスタ抽出パラメータ CJocrPrimEXクラスのパラメータは、ヘッダファイルabsparam.hで定義されているABSTRACTPARAMETER構造体で設定します。パラメータの単位はピクセルとなっています。解像度による違いは、パラメータを取得したときの解像度である「パラメータサンプリングdpi」と実際の文書の解像度の比率によって調整されます。
必須パラメータはわずか5つで、他は任意パラメータとなっています。任意パラメータを有効にするかどうかは、「コントロールフラグ」のビットフラグで指定します。

このうち必須フラグである距離の最小値は、漢字が対象となる場合は必ず0にします。これは、漢字を構成するプリミティブ同士の距離が0となるからです。

抽出がうまく行かないときは、まず任意パラメータを全て外しましょう。任意パラメータを一つずつオンにして、どのパラメータが抽出がうまくいかない原因かを確かめるようにするのがコツです。

typedef struct _ABSTRACTPARAMETER {
    int        mdpi;               // パラメータサンプリングdpi
    int        mcontrol;           // コントロールフラグ
// プリミティブ必須
    int        minprimwidth;       // プリミティブ最小幅(必須)
    int        maxprimwidth;       // プリミティブ最大幅(必須)
    int        minprimheight;      // プリミティブ最小高(必須)
    int        maxprimheight;      // プリミティブ最大高(必須)
// プリミティブ任意
    double     minrate;            // プリミティブ高さ/幅の最小値(任意)
    double     maxrate;            // プリミティブ高さ/幅の最大値(任意)
    int        minpixel;           // プリミティブ面積の最小値(任意)
    int        maxpixel;           // プリミティブ面積の最大値(任意)
    int        minlength;          // プリミティブ周囲長の最小値(任意)
    int        maxlength;          // プリミティブ周囲長の最大値(任意)
// プリミティブ間距離
    // ユークリッド距離あるいは市街地距離のどちらか
    double     mindist;            // プリミティブ間ユークリッド距離の最小値
    double     maxdist;            // プリミティブ間ユークリッド距離の最大値
    int        mindistx;           // 市街地X座標距離最小値
    int        maxdistx;           // 市街地X座標距離最大値
    int        mindisty;           // 市街地Y座標距離最小値
    int        maxdisty;           // 市街地Y座標距離最大値
// クラスタ任意
    int        minclusterwidth;    // クラスタ最小幅(任意)
    int        maxclusterwidth;    // クラスタ最大幅(任意)
    int        minclusterheight;   // クラスタ最小高(任意)
    int        maxclusterheight;   // クラスタ最大高(任意)
    int        minnum;             // クラスタ内プリミティブ数(任意)最小値
    int        maxnum;             // クラスタ内プリミティブ数(任意)最大値
// クラスタの存在するエリア(任意)
    int        mleft;              // 左上X
    int        mtop;               // 左上Y
    int        mright;             // 右下X
    int        mbottom;            // 右下Y

// minclusterarea~my4までは2000年10月10日追加
// クラスタの最小面積と最大面積
    double    minclusterarea;      // クラスタ面積最小値
    double    maxclusterarea;      // クラスタ面積最大値
// プリミティブ/クラスタ面積比の最小と最大
    double    minratecluster;      // プリミティブ/クラスタ面積比の最小
    double    maxratecluster;      // プリミティブ/クラスタ面積比の最大
// クラスタの存在するエリア(斜め矩形:任意)
// cw方向
    int        mx1;                // 左下X
    int        my1;                // 左下Y
    int        mx2;                // 左上X
    int        my2;                // 左上Y
    int        mx3;                // 右上X
    int        my3;                // 右上Y
    int        mx4;                // 右下X
    int        my4;                // 右下Y
} ABSTRACTPARAMETER;
コントロールフラグのビットフラグには、任意パラメータを使うかどうかのフラグが7つあります。

// クラスタ抽出コントロール
#define    ABSTRACT_RATE               0x00000001        // 高さ/幅情報を使うかどうか
#define    ABSTRACT_PIXEL              0x00000002        // 面積情報を使うかどうか
#define    ABSTRACT_LENGTH             0x00000004        // 周囲長情報を使うかどうか
#define    ABSTRACT_CLUSTERWIDTH       0x00000008        // 周囲長情報を使うかどうか
#define    ABSTRACT_CLUSTERHEIGHT      0x00000010        // 周囲長情報を使うかどうか
#define    ABSTRACT_NUM                0x00000020        // 周囲長情報を使うかどうか
#define    ABSTRACT_LOC                0x00000040        // 位置情報を使うかどうか
他のフラグは特殊なのでそれぞれ説明します。
#define    ABSTRACT_SEPARATOR           0x00000080        // セパレータによってクラスタを区切るかどうか
#define    ABSTRACT_DIST                0x00000100        // ユークリッド距離を使う
#define    ABSTRACT_DISTXY              0x00000200        // 市街地距離を使う
#define    ABSTRACT_LONG                0x00000400        // 1のように長いプリミティブは無条件で通す
#define    ABSTRACT_FLAT                0x00000800        // ーのように平たいプリミティブは無条件で通す
#define    ABSTRACT_SMALL               0x00001000        // 、のように小さいプリミティブは無条件で通す
#define    ABSTRACT_1PRIM1CHAR1LINE     0x00002000        // 英大文字+数字など1文字=1プリミティブ
                                                          // 1行(公図、路線価図、数表)
#define    ABSTRACT_1PRIM1CHAR1COLUMN   0x00004000        // 英大文字+数字など1文字=1プリミティブ
                                                          // 1列(図面の90度回転文字列)
#define    ABSTRACT_NOISE1              0x00008000        // 小さなプリミティブだけで構成されるクラスタを除外
                                                          // 破線やノイズ
#define    ABSTRACT_NOISE2              0x00010000        // ベタグラフィック内部のクラスタを除外

// ABSTRACT_YOKOGAKI~ABSTRACT_NOISE3までは2000年10月10日追加
#define    ABSTRACT_YOKOGAKI            0x00020000        // 角度推定における横書指定
#define    ABSTRACT_TATEGAKI            0x00040000        // 角度推定における縦書指定
#define    ABSTRACT_INFERANGLE          0x00080000        // 角度推定を行う
#define    ABSTRACT_LOC4                0x00100000        // 斜め矩形内のクラスタだけ抽出
#define    ABSTRACT_CLUSTERAREA         0x00200000        // クラスタの面積情報を使うかどうか
#define    ABSTRACT_NOISE3              0x00400000        // プリミティブ外接矩形面積計/クラスタ外接矩形面積計 < 0.25
サンプルの抽出コードは以下のようになります。
#include    "cjocrprim.h"
#include    "absparam.h"
#include    "cjocrprimex.h"
#include    "errcode.h"
...
....
// ライセンサーから供給される20桁のコードあるいはライセンスコードファイルのパスを指定して、ライブラリを初期化
CJocrPrimEX* pjocrprim = new CJocrPrimEX("ABCDEFGHJKLMNPQ23456");
// ライセンスコードパスの場合はCJocrPrim* prim = new CJocrPrim("C:\\Program Files\\Foo\\primitive.kcd");
pjocrprim->msetdocument(mdata,0,mwidth,mheight);      // 背景が0前景が1のモノクロ画像
ret = pjocrprim->msetdpi(400);                        // 400dpi
ret = pjocrprim->mcalcfeaturepixel();                 // 面積を計算
ret = pjocrprim->mloadparameter("parameter.prm");     // パラメータファイルをロード
// クラスタの抽出
ret = pjocrprim->mabstractclusterfilter(0,1);         // 拡張クラスタ抽出

delete pjocrprim;
...
目次


3.3 パラメータ入出力

///////////////////
// パラメータの設定
void    msetparameter(struct _ABSTRACTPARAMETER* parameter);
// 入力
//        ABSTRACTPARAMETER* parameter;    クラスタ抽出パラメータ
/////////////////////////////
// パラメータファイルをセーブ
int        msaveparameter(char* filename,struct _ABSTRACTPARAMETER* parameter);
// パラメータファイルをセーブする。
// 保存したファイルはテキスト形式で編集可能である
// 入力
//        char*                      filename;     パラメータファイル名
// 出力
//        struct _ABSTRACTPARAMETER* parameter;    クラスタ抽出パラメータ(呼ぶ側で領域確保)
///////////////////////////////////////
// パラメータのロード+解像度調整+設定
int        mloadparameter(char* filename);
// パラメータファイルをロード、解像度調整、設定する。
// 入力
//        char*    filename;    パラメータファイル名
//                              msaveparameterで保存したパラメータファイル
//                              パラメータ調整ツールで保存したパラメータファイル
//                              上記をエディタで編集したもの
/////////////////////////////
// パラメータファイルをロード
int        mloadparameter(char* filename,struct _ABSTRACTPARAMETER* parameter);
// パラメータファイルをロードする。クラスタ抽出をする前に、解像度調整、設定を呼び出す必要がある。
// 入力
//        char*                      filename;     パラメータファイル名
// 出力
//        struct _ABSTRACTPARAMETER* parameter;    クラスタ抽出パラメータ(呼ぶ側で領域確保)

/////////////////////////
// パラメータを解像度調整
void        madjustparameter(struct _ABSTRACTPARAMETER* parameter);
// パラメータをmsetdpiで指定した解像度における値に調整する
// 入力
//        struct _ABSTRACTPARAMETER* parameter;    クラスタ抽出パラメータ
パラメータは、主にパラメータ調整ツールで作成したパラメータをロードした後に、解像度調整して、設定します。mloadparameter/1を利用すれば、madjustparameterやmsetparameterをコールする必要はありません。

目次


3.4 パラメータ調整ツール

  • パラメータ調整ツールによって、対話的にパラメータの効果を確認しながらパラメータファイルを作成します。
    目次

    3.5 パラメータファイル仕様

    パラメータファイルサンプル
    "//"から開始される行はコメントで読み飛ばされます。
    最初の項目はバージョンです。バージョンが記述されていない非常に古いパラメータファイルはサポート対象外です。
    // バージョン
    103

    次の項目はサンプリング解像度です。サンプリング解像度とは、パラメータを取得したときの解像度です。400dpiで取得したパラメータを600dpiなど他の解像度で用いるには、madjustparameter/1を呼び出して解像度調整を行います。
    // サンプリング解像度
    600

    次の項目はプリミティブ幅の最小値と最大値(単位ピクセル)です。以下の例では、最小4ピクセルから最大27ピクセルまでのプリミティブがクラスタの要素として採用されます。
    // プリミティブ幅
    4-27

    次の項目はプリミティブ高さの最小値と最大値(単位ピクセル)です。以下の例では、最小19ピクセルから最大26ピクセルまでのプリミティブがクラスタの要素として採用されます。
    // プリミティブ高さ
    19-26

    次の項目はプリミティブの高さ/幅の比の最小値と最大値です。1.0未満では、正方形よりも平たくて、1.0は正方形、1.0より大きい場合は長細い「1」のようなケースです。下の例では、1.0から10.0までのプリミティブがクラスタの要素として採用されます。
    // 比率
    1
    1.000000-10.000000

    次の項目はプリミティブの面積をパラメータとして利用するかどうかのフラグと最小値と最大値です。1は面積情報をクラスタリングで使うことを示し、0は使わないことを示します。下の例は、面積情報をクラスタリングで利用して、最小値は75ピクセル平方で、最大値は237ピクセル平方です。
    // 面積
    1
    75-237

    次の項目はプリミティブの周囲長をパラメータとして利用するかどうかのフラグと最小値と最大値です。1は周囲長情報をクラスタリングで使うことを示し、0は使わないことを示します。下の例では、周囲長情報をクラスタリングで利用しません。最小値は75ピクセルで、最大値は237ピクセルです。
    // 周囲長
    0
    102-178

    次の項目はクラスタを構成するプリミティブ間の距離としてユークリッド距離(単位ピクセル)を利用するかどうかのフラグと最小値と最大値です。1はユークリッド距離を使うことを示し、0は使わないことを示します。0の場合自動的に市街地距離が使われます。下の例では、ユークリッド距離をクラスタリングで利用しません。距離の最小値は0ピクセルで、最大値は16ピクセルです。
    // ユークリッド距離
    0
    0.000000-16.000000

    次の項目はクラスタを構成するプリミティブ間の距離として市街地距離(X軸、Y軸に平行な道のり)(単位ピクセル)を利用する場合のX軸方向の距離の最小値と最大値です。ユークリッド距離のフラグが0の場合自動的に市街地距離が使われます。市街地距離のX軸方向の最小値は1ピクセルで、最大値は30ピクセルです。X軸が重なっている2つのプリミティブの距離は0なので、この定義の場合は同じクラスタにはなりません。
    // 市街地距離X
    1-30

    次の項目はクラスタを構成するプリミティブ間の距離として市街地距離(X軸、Y軸に平行な道のり)(単位ピクセル)を利用する場合のY軸方向の距離の最小値と最大値です。ユークリッド距離のフラグが0の場合自動的に市街地距離が使われます。市街地距離のY軸方向の最小値は0ピクセルで、最大値は0ピクセルです。この定義の場合、Y軸方向の距離が1でもあるプリミティブ同士は同じクラスタには入りません。
    // 市街地距離Y
    0-0

    次の項目はクラスタの幅をパラメータとして利用するかどうかのフラグと最小値と最大値(ピクセル単位)です。1はクラスタの幅をクラスタリングで使うことを示し、0は使わないことを示します。下の例では、幅39ピクセル~111ピクセルの範囲外のクラスタは破棄されます。
    // クラスタ幅
    1
    39-111

    次の項目はクラスタの高さをパラメータとして利用するかどうかのフラグと最小値と最大値(ピクセル単位)です。1はクラスタの高さをクラスタリングで使うことを示し、0は使わないことを示します。下の例では、高さ19ピクセル~33ピクセルの範囲外のクラスタは破棄されます。
    // クラスタ高さ
    1
    19-33

    次の項目はクラスタを構成するプリミティブ数をパラメータとして利用するかどうかのフラグと最小値と最大値です。1はプリミティブ数をクラスタリングで使うことを示し、0は使わないことを示します。下の例では、プリミティブ数が3未満あるいは10より大きい場合、クラスタは破棄されます。
    // クラスタを構成するプリミティブ数
    1
    3-10

    次の項目はクラスタが存在する長方形領域をパラメータとして利用するかどうかのフラグと長方形の左上と右下の座標です。1は領域をクラスタリングで使うことを示し、0は使わないことを示します。下の例では、領域をパラメータでは使いません。
    // クラスタ領域
    0
    (0,0)-(0,0)

    1...2つのプリミティブの間にクラスタに属さないプリミティブが存在する場合、2つのプリミティブは別のクラスタに属すると判断します。
    // セパレータ処理
    1

    1...「1」「I」のような細長いプリミティブを無条件で採用します。
    // 細長い文字例外処理
    0

    1...「ー」「一」のような平たいプリミティブを無条件で採用します。
    // 平たい文字例外処理
    0

    1...「、」「・」のような小さいプリミティブを無条件で採用します。
    // 小さい文字例外処理
    1

    1...1文字=1プリミティブ(数値、英数字、カンマ、ピリオド、ハイフン等)の場合、1にすると精度が向上します。
    // 1プリミティブ1文字1行
    1

    1...1文字=1プリミティブ(数値、英数字、カンマ、ピリオド、ハイフン等)の場合、1にすると精度が向上します。
    // 1プリミティブ1文字1列
    0

    1...微小なプリミティブばかりで構成されるクラスタは破棄します。
    // ノイズ1
    1

    1...写真らしき領域を自動的に判断して、内部のクラスタは破棄します
    // ノイズ2
    1

    1...クラスタは全て横書です。クラスタリングでは特に使いません。ライブラリユーザーが自由に設定できます。
    // 横書き
    1

    1...クラスタは全て縦書です。クラスタリングでは特に使いません。ライブラリユーザーが自由に設定できます。
    // 縦書き
    0

    1...斜めのクラスタが含まれるため、角度推定を行います。
    // 角度推定
    0

    次の項目はクラスタが存在する任意矩形領域をパラメータとして利用するかどうかのフラグと長方形の左上と右下の座標です。1は領域をクラスタリングで使うことを示し、0は使わないことを示します。下の例では、領域をパラメータでは使いません。
    // 任意矩形領域
    0
    (0,0)-(0,0)-(0,0)-(0,0)

    次の項目はクラスタの面積を使うかどうかのフラグと面積の最小値と最大値ですが、2000年10月10日時点では無視されます。
    // クラスタ面積
    0
    0.000000-10000000000000000.000000

    次の項目はプリミティブの合計面積/クラスタの面積を使うかどうかのフラグですが、2000年10月10日時点では無視されます。
    // ノイズ3
    0
    目次


    3.6 新しい角度推定

    目次

    抽出したクラスタをテキストの段落と考えたときのクラスタの角度を推定します。CJocrPrimEXにおける機能拡張を利用した高精度版。
    角度は、y軸正方向が下の場合は時計周りが正、y軸正方向が上の場合は反時計周りが正となるラジアン単位の角度です。
    // クラスタの角度推定計算
        void mcalcangle(CLUSTER* pcluster,double& angle,int fusionflag = 1);
        入力
            CLUSTER*    pcluster;       クラスタ(mgetvalidclusterで取得したクラスタ)
            int         fusionflag;     通常指定する必要はない。
                      1プリミティブ=1文字(英語大文字、数字、カンマ等)
                      が保証されている場合は0にすると精度が向上する
                      デフォルト値は1
        出力
            double&     angle;          推定角度(ラジアン)
    
    目次


    3.7 破線抽出

    目次

    破線を抽出する。
    クラスタ抽出パラメータと共通の仕様のパラメータを用いて破線プリミティブを抽出する。
    破線固有のパラメータとして、破線の隣接する2つの線分のなす最大角度がある。
    // 破線認識
    // 入力
    //  char*       parameterfilename;  破線抽出パラメータファイル名(クラスタ抽出パラメータと同様)
    //                                  注意点としてクラスタを構成するプリミティブ数の最小値は5~6以上でないと破線抽出はできない
    //  double      angle;              破線の隣接する二つの線分のなす最大角度(0~π / 2ラジアン)
    //                                  (x1,y1)-(x2,y2)-(x3,y3)の場合、ベクトル(x1,y1)-(x2,y2)と(x2,y2)-(x3,y3)のなす角度
    //  int         from;               fromレイヤから破線を抽出
    //  int         to;                 抽出した破線をtoレイヤへ移動
    // 返り値
    //  0....正常終了
    //  負...エラー
    int             movedotline(char* parameterfilename,double angle,int from,int to);
    
    目次


    3.8 文字抽出パラメータの推定

    目次

    現在の文書画像から文字列を抽出するためのパラメータを自動推定する。プリミティブの大きさの度数分布表から推定するため、精度はそれなりである。

    // 文字ポイント推定
    // 現在のドキュメントの文字の大きさを推定する(統計的な推定なので100%丸飲みにしないこと)
    // 入力
    //  int                 layer = 0;          // layerに属する画像から推定
    //                                          // -1の場合は全てのレイヤから推定
    //  int                 amaxpoint = 36;     // amaxpointで指定された大きさのプリミティブまで文字とみなす
    //  double              lowrate = 0.01;     // 度数分布表の下からlowrateまでのプリミティブは除外
    //  double              highrate = 0.01;    // 度数分布表の上からhighrateまでのプリミティブは除外
    // 出力
    //  ABSTRACTPARAMETER*  parameter;          // 推定したパラメータを格納するバッファ
    void                    minferparameter(ABSTRACTPARAMETER* parameter,int layer = 0,int amaxpoint = 36,double lowrate = 0.01,double highrate = 0.01);
    
    目次


    マニュアルホームページ

    ユーザーズマニュアル