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

目次
拡張サブクラスCJocrPrimRD
  1. 新しい角度推定(2000年10月10日追加)

拡張サブクラスCJocrPrimRD

この機能は、SDKのオプション機能です。
CJocrPrimEXのサブクラスです。CJocrPrimクラス、CJocrPrimEXクラスの全ての機能に加えて、ラスタベクタ変換、ベクタラスタ変換ライブラリの組み合わせによる新しい機能が利用できます。
2000年10月10日時点で利用できるのは、区画線をラスタベクタ変換することによる角度推定の精度向上機能だけです。
今後、多角形ポリゴン内部のクラスタ抽出機能、文字列ベクタをラスタに逆変換する機能などを追加する予定です。
目次


1 新しい角度推定


目次

抽出したクラスタをテキストの段落と考えたときのクラスタの角度を推定します。
画像から区画線を抽出して、クラスタの近くの区画線の線分の角度を、クラスタの角度推定の手がかりにします。
角度は、y軸正方向が下の場合は時計周りが正、y軸正方向が上の場合は反時計周りが正となるラジアン単位の角度です。
// クラスタの角度推定計算
    void mcalcangle(CLUSTER* pcluster,double& angle,int fusionflag = 1);
    入力
        CLUSTER*    pcluster;       クラスタ(mgetvalidclusterで取得したクラスタ)
        int         fusionflag;     通常指定する必要はない。
                  1プリミティブ=1文字(英語大文字、数字、カンマ等)
                  が保証されている場合は0にすると精度が向上する
                  デフォルト値は1
    出力
        double&     angle;          推定角度(ラジアン)
区画線のベクタライズ
区画線を用いた角度推定珪酸を用いる場合、makeprim終了後、mcalcangleまでの間に、mvectorizelineをコールする必要があります。
また、mvectorizeの前にmsetdpi/1で、現在の画像の解像度を設定する必要があります。
ベクタライズは、以下のようなアルゴリズムで実行されます。
  1. 72ポイント(Ndpiの場合、N×Nピクセルまで)×72ポイント以下のプリミティブをピックアップし逆変換。
  2. 逆変換画像の輪郭線をベクタライズ(線の場合、片側だけをベクタライズ)
  3. ある程度の長さの線分の位置と角度情報を計算して保持する
ベクタライズが終了していない場合、CJocrPrimRD::mcalcangleはCJocrPrimEX::mcalcangleと同じ動作をします。
// mvectorizeline関数の呼び出して、ベクタライズを実行する
// デフォルトはベクタライズ無しとなっているため、区画線を利用する場合は、この関数を1回はコールする
// 重複して、何度も呼んでもOK
    void menablevectorize();
// mvectorizeline関数の呼び出して、ベクタライズを実行しない
// 角度推定においても、区画線の情報は用いない
// 重複して、何度も呼んでもOK
    void mdisablevectorize();
// 区画線のベクタライズ
    int mvectorizeline();
    返り値         0...正常終了(mdisablevectorizeでベクタライズを実行しない場合を含む)
         負...エラー
サンプルコード
#include    "ocrdef.h"
#include    "ocrco.h"
#include    "cjocrprimrd.h"
#include    "errcode.h"
...
....
// ライセンサーから供給される20桁のコードあるいはライセンスコードファイルのパスを指定して、ライブラリを初期化
CJocrPrimRD* pjocrprim = new CJocrPrimRD("ABCDEFGHJKLMNPQ23456");
// ライセンスコードパスの場合はCJocrPrim* prim = new CJocrPrim("C:\\Program Files\\Foo\\primitive.kcd");
pjocrprim->msetdocument(mdata,0,mwidth,mheight);      // 背景が0前景が1のモノクロ画像
pjocrprm->msetdpi(400);
ret = pjocrprim->makeprim();
if(ret < 0) {
    エラー;
}
///////////////////////
// 区画線のベクタライズ
pjocrprim->menablevectorize();
ret = pjocrprim->mvectorizeline();
if(ret < 0) {
    エラー;
}
// クラスタの抽出(クラスタに属するプリミティブはレイヤ1へ移動)
ret = pjocrprim->mabstractcluster(0,1);
if(ret < 0) {
    エラー;
}
// クラスタ数の取得
int clusternum = pjocrprim->mgetvalidclusternum();
CLUSTER* pcluster = (CLUSTER*)malloc(sizeof(CLUSTER) * clusternum);
if(pcluster) {
    // クラスタの取得
    mgetvalidcluster(pcluster);
    for(int i = 0 ; i < clusternum ; i++) {
        double    angle;
		// 角度推定の際に、区画線の情報が用いられる
        pjocrprim->mcalcangle(pcluster + i,angle);  // angleが推定された角度(ラジアン)
                                                    // 実際のベースラインの角度はangleかangle+π/2
        ....
        ...
    }
}
delete pjocrprim;
...
目次



マニュアルホームページ

ユーザーズマニュアル