// ベタ画像の検出 int mregistbeta(); 返り値 0....正常終了 負...エラーをコールしなければなりません。その前後の処理は、mabstractcluster関数と一緒です。
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;
...
/////////////////// // パラメータの設定 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をコールする必要はありません。
|
// バージョン 103 |
|
// サンプリング解像度 600 |
|
// プリミティブ幅 4-27 |
|
// プリミティブ高さ 19-26 |
|
// 比率 1 1.000000-10.000000 |
|
// 面積 1 75-237 |
|
// 周囲長 0 102-178 |
|
// ユークリッド距離 0 0.000000-16.000000 |
|
// 市街地距離X 1-30 |
|
// 市街地距離Y 0-0 |
|
// クラスタ幅 1 39-111 |
|
// クラスタ高さ 1 19-33 |
|
// クラスタを構成するプリミティブ数 1 3-10 |
|
// クラスタ領域 0 (0,0)-(0,0) |
|
// セパレータ処理 1 |
|
// 細長い文字例外処理 0 |
|
// 平たい文字例外処理 0 |
|
// 小さい文字例外処理 1 |
|
// 1プリミティブ1文字1行 1 |
|
// 1プリミティブ1文字1列 0 |
|
// ノイズ1 1 |
|
// ノイズ2 1 |
|
// 横書き 1 |
|
// 縦書き 0 |
|
// 角度推定 0 |
|
// 任意矩形領域 0 (0,0)-(0,0)-(0,0)-(0,0) |
|
// クラスタ面積 0 0.000000-10000000000000000.000000 |
|
// ノイズ3 0 |
// クラスタの角度推定計算
void mcalcangle(CLUSTER* pcluster,double& angle,int fusionflag = 1);
入力
CLUSTER* pcluster; クラスタ(mgetvalidclusterで取得したクラスタ)
int fusionflag; 通常指定する必要はない。
1プリミティブ=1文字(英語大文字、数字、カンマ等)
が保証されている場合は0にすると精度が向上する
デフォルト値は1
出力
double& angle; 推定角度(ラジアン)
// 破線認識 // 入力 // 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);
// 文字ポイント推定 // 現在のドキュメントの文字の大きさを推定する(統計的な推定なので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);