サンプル / 画像の幾何変換


ここでは主に下記についての説明を行っています。

  • 構造体ポインタの扱い

  • 2 次元配列(ポインタのポインタ)の扱い


ここで例として扱う構造体 FMATRIX は、 下記のように "2 次元配列(ポインタのポインタ)" のメンバをもちます。

typedef struct fvmatrix{
    // 行列の行数
    INT row;

    // 行列の列数
    INT col;

    // 行列の値を保持する2次元配列
    DOUBLE **m;
} FMATRIX;

この構造体の扱い例を下記に示します。

C 言語
FMATRIX * mat;

// 構造体 FMATRIX を生成しポインタを取得.
mat = fnFIE_mat_aalloc(3, 3);

mat->m[0][0] = 1;
mat->m[0][1] = 0;
mat->m[0][2] = 5;
mat->m[1][0] = 0;
mat->m[1][1] = 1;
mat->m[1][2] = 7;
mat->m[2][0] = 0;
mat->m[2][1] = 0;
mat->m[2][2] = 1;


// 構造体 FMATRIX の使用. (アフィン変換の例)
fnFIE_geotrans_affine(
    src, dst, NULL, mat, TRUE, F_SAMPLING_CUBIC
)


# 使い終えた構造体 FMATRIX は解放しなければならない.
pyfie.fnFIE_mat_afree(mat)
Python
# 構造体 FMATRIX を生成しポインタを取得.
mat = pyfie.fnFIE_mat_aalloc(3, 3)

mat.deref.m[0][0] = 1
mat.deref.m[0][1] = 0
mat.deref.m[0][2] = 5
mat.deref.m[1][0] = 0
mat.deref.m[1][1] = 1
mat.deref.m[1][2] = 7
mat.deref.m[2][0] = 0
mat.deref.m[2][1] = 0
mat.deref.m[2][2] = 1


# 構造体 FMATRIX の使用. (アフィン変換の例)
pyfie.fnFIE_geotrans_affine(
    src, dst, None, mat, True, pyfie.F_SAMPLING_CUBIC
)


# 使い終えた構造体 FMATRIX は解放しなければならない.
pyfie.fnFIE_mat_afree(mat)
  • 変数 src, dst は確保済の画像オブジェクト(FHANDLE) であるものとします

注釈

上記の例では、 構造体 FMATRIX の "行列の値" であるメンバ m に直接値を設定していますが、 FIE ライブラリには幾何変換用の行列作成関数が用意されていますので、 大抵の場合はそちらを使用することになります。

まず、 変数 mat は構造体 FMATRIX へのポインタです。 構造体のポインタからメンバの設定を行うには、 属性 deref を使用して参照先インスタンスにアクセスすることになります。

C 言語と対比させると下記のようになります。

C 言語
// (*mat) で参照先の構造体を取得し
// そのメンバ m にアクセス.
(*mat).m[0][0] = 1;
Python
# mat.deref で参照先の構造体を取得し
# そのメンバ m にアクセス.
mat.deref.m[0][0] = 1

次にこの構造体のメンバ m について説明します。 このメンバは 2 次元配列(ポインタのポインタ)となっています。

PyFIE でのポインタの参照先には、 C 言語と同じように添字を使ってアクセスすることができるので、 ポインタのポインタであってもその参照先へアクセスする記述は C 言語と同じようなものとなります。