を計算します。すると、 は 1.平行移動して 2.回転して 3.平行移動して 4.スケールする変換 を表す事になります。 これにより複数の変換を1回の変換にまとめることができるため、 複雑な変換が必用な場合には処理時間の短縮を図ることが出来ます。 また
の逆行列
を求めれば、
の逆の変換を行うことが出来ます。
列挙型 | |
enum | f_geotrans_warp_mode { F_WARP_MODE_EUCLIDEAN, F_WARP_MODE_SIMILARITY, F_WARP_MODE_AFFINE, F_WARP_MODE_PERSPECTIVE, F_WARP_MODE_PIECEWISE_AFFINE, F_WARP_MODE_LOCAL_WEIGHTED_MEAN_LINEAR } |
座標変換マップ作成モード [詳細] | |
関数 | |
INT FVALGAPI | fnFIE_geotrans_calc_rotate_matrix (FMATRIX *mat, DOUBLE rad, DOUBLE cx, DOUBLE cy) |
回転をする同次変換行列を作成 | |
INT FVALGAPI | fnFIE_geotrans_calc_shift_matrix (FMATRIX *mat, DOUBLE dx, DOUBLE dy) |
平行移動する同次変換行列を作成 | |
INT FVALGAPI | fnFIE_geotrans_calc_scale_matrix (FMATRIX *mat, DOUBLE sx, DOUBLE sy) |
スケール変化する同次変換行列を作成 | |
INT FVALGAPI | fnFIE_geotrans_calc_xshear_matrix (FMATRIX *mat, DOUBLE rad) |
せん断変形(x方向)する同次変換行列を作成 | |
INT FVALGAPI | fnFIE_geotrans_calc_yshear_matrix (FMATRIX *mat, DOUBLE rad) |
せん断変形(y方向)する同次変換行列を作成 | |
INT FVALGAPI | fnFIE_geotrans_affine_point (DPNT_T src, DPNT_T *dst, const FMATRIX *mat) |
点のアフィン変換 | |
INT FVALGAPI | fnFIE_geotrans_affine_npoints (const DPNT_T *src, DPNT_T *dst, INT num, const FMATRIX *mat) |
点群のアフィン変換 | |
INT FVALGAPI | fnFIE_geotrans_affine_line (DLINE_T src, DLINE_T *dst, const FMATRIX *mat) |
直線のアフィン変換 | |
INT FVALGAPI | fnFIE_geotrans_affine_lineseg (DSGMT_T src, DSGMT_T *dst, const FMATRIX *mat) |
線分のアフィン変換 | |
INT FVALGAPI | fnFIE_geotrans_perspective_point (DPNT_T src, DPNT_T *dst, const FMATRIX *mat) |
点の射影変換 | |
INT FVALGAPI | fnFIE_geotrans_perspective_npoints (const DPNT_T *src, DPNT_T *dst, INT num, const FMATRIX *mat) |
点群の射影変換 | |
INT FVALGAPI | fnFIE_geotrans_perspective_line (DLINE_T src, DLINE_T *dst, const FMATRIX *mat) |
直線の射影変換 | |
INT FVALGAPI | fnFIE_geotrans_perspective_lineseg (DSGMT_T src, DSGMT_T *dst, const FMATRIX *mat) |
線分の射影変換 | |
INT FVALGAPI | fnFIE_geotrans_estimate_perspective_matrix (FMATRIX *fpMat, const DPNT_T *pntspFrom, const DPNT_T *pntspTo, UINT uiNum) |
![]() | |
INT FVALGAPI | fnFIE_geotrans_estimate_affine_matrix (FMATRIX *fpMat, const DPNT_T *pntspFrom, const DPNT_T *pntspTo, UINT uiNum) |
![]() | |
INT FVALGAPI | fnFIE_geotrans_estimate_similarity_matrix (FMATRIX *trans_mat, const DPNT_T *pnts_from, const DPNT_T *pnts_to, UINT pnts_num) |
![]() | |
INT FVALGAPI | fnFIE_geotrans_estimate_euclidean_matrix (FMATRIX *trans_mat, const DPNT_T *pnts_from, const DPNT_T *pnts_to, UINT pnts_num) |
![]() | |
INT FVALGAPI | fnFIE_geotrans_estimate_warp_map (FHANDLE hmap, const DPNT_T *pnts_from, const DPNT_T *pnts_to, UINT pnts_num, enum f_geotrans_warp_mode warp_mode, DOUBLE param) |
![]() |
enum f_geotrans_warp_mode |
INT FVALGAPI fnFIE_geotrans_calc_rotate_matrix | ( | FMATRIX * | mat, | |
DOUBLE | rad, | |||
DOUBLE | cx, | |||
DOUBLE | cy | |||
) |
回転をする同次変換行列を作成
点( cx , cy )を中心として、 rad 回転する同次変換行列を作成します。 mat に指定する行列は、あらかじめ3×3のサイズで確保しておかなければいけません。 なお mat の意味や利用法については 同次変換行列 を参照してください。
本関数は、下記のように行列を設定します。
回転行列の作成(左右共に、同一座標系)
[out] | mat | 同次変換行列 |
[in] | rad | 回転角(ラジアン) |
[in] | cx | 回転中心x座標 |
[in] | cy | 回転中心y座標 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_geotrans_calc_shift_matrix | ( | FMATRIX * | mat, | |
DOUBLE | dx, | |||
DOUBLE | dy | |||
) |
平行移動する同次変換行列を作成
x方向に dx, y方向に dy だけ平行移動する同次変換行列を作成します。 mat に指定する行列は、あらかじめ3×3のサイズで確保しておかなければいけません。 なお mat の意味や利用法については 同次変換行列 を参照してください。
本関数は、下記のように行列を設定します。
平行移動行列の作成(左右共に、同一座標系)
[out] | mat | 同次変換行列 |
[in] | dx | x方向移動量 |
[in] | dy | y方向移動量 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_geotrans_calc_scale_matrix | ( | FMATRIX * | mat, | |
DOUBLE | sx, | |||
DOUBLE | sy | |||
) |
スケール変化する同次変換行列を作成
x方向を sx 倍、y方向を sy 倍する同次変換行列を作成します。 mat に指定する行列は、あらかじめ3×3のサイズで確保しておかなければいけません。 なお mat の意味や利用法については 同次変換行列 を参照してください。
本関数は、下記のように行列を設定します。
スケール変化行列の作成(左右共に、同一座標系)
[out] | mat | 同次変換行列 |
[in] | sx | x方向倍率 |
[in] | sy | y方向倍率 |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_geotrans_calc_xshear_matrix | ( | FMATRIX * | mat, | |
DOUBLE | rad | |||
) |
せん断変形(x方向)する同次変換行列を作成
x方向にせん断変形をする同次変換行列を作成します。 mat に指定する行列は、あらかじめ3×3のサイズで確保しておかなければいけません。 なお mat の意味や利用法については 同次変換行列 を参照してください。
本関数は、下記のように行列を設定します。
x方向のせん断行列の作成(左右共に、同一座標系)
[out] | mat | 同次変換行列 |
[in] | rad | せん断角(ラジアン) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_geotrans_calc_yshear_matrix | ( | FMATRIX * | mat, | |
DOUBLE | rad | |||
) |
せん断変形(y方向)する同次変換行列を作成
y方向にせん断変形をする同次変換行列を作成します。 mat に指定する行列は、あらかじめ3×3のサイズで確保しておかなければいけません。 なお mat の意味や利用法については 同次変換行列 を参照してください。
本関数は、下記のように行列を設定します。
y方向のせん断行列の作成(左右共に、同一座標系)
[out] | mat | 同次変換行列 |
[in] | rad | せん断角(ラジアン) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
点のアフィン変換
入力点 src を同次変換行列 mat により変換し、 dst を返します。
mat の意味や作成法については 同次変換行列 を参照してください。
[in] | src | 入力点座標 |
[out] | dst | 出力点座標 |
[in] | mat | 同次変換行列(3x3の正方行列) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_geotrans_affine_npoints | ( | const DPNT_T * | src, | |
DPNT_T * | dst, | |||
INT | num, | |||
const FMATRIX * | mat | |||
) |
点群のアフィン変換
入力点列 src を同次変換行列 mat により変換し、点列 dst を返します。
mat の意味や作成法については 同次変換行列 を参照してください。
[in] | src | 入力点座標配列 |
[out] | dst | 出力点座標配列 |
[in] | num | 入力点数 |
[in] | mat | 同次変換行列(3x3の正方行列) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
直線のアフィン変換
入力直線 src を同次変換行列 mat により変換し、直線 dst を返します。 mat の意味や作成法については 同次変換行列 を参照してください。
[in] | src | 入力直線 |
[out] | dst | 出力直線 |
[in] | mat | 同次変換行列(3x3の正方行列) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
線分のアフィン変換
入力線分 src を同次変換行列 mat により変換し、線分 dst を返します。 mat の意味や作成法については 同次変換行列 を参照してください。
[in] | src | 入力線分 |
[out] | dst | 出力線分 |
[in] | mat | 同次変換行列(3x3の正方行列) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
点の射影変換
入力点 src を同次変換行列 mat により変換し、 dst を返します。
分母の値が0になる時は、 F_ERR_INVALID_PARAM を返します。 また、分母の値が非常に小さくなる場合は、計算誤差が増大しますので注意してください。
mat の意味や作成法については 同次変換行列 を参照してください。
[in] | src | 入力点座標 |
[out] | dst | 出力点座標 |
[in] | mat | 同次変換行列(3x3の正方行列) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_geotrans_perspective_npoints | ( | const DPNT_T * | src, | |
DPNT_T * | dst, | |||
INT | num, | |||
const FMATRIX * | mat | |||
) |
点群の射影変換
入力点列 src を同次変換行列 mat により変換し、点列 dst を返します。
mat の意味や作成法については 同次変換行列 を参照してください。
[in] | src | 入力点座標配列 |
[out] | dst | 出力点座標配列 |
[in] | num | 入力点数 |
[in] | mat | 同次変換行列(3x3の正方行列) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
直線の射影変換
入力直線 src を同次変換行列 mat により変換し、直線 dst を返します。 mat の意味や作成法については 同次変換行列 を参照してください。
[in] | src | 入力点座標 |
[out] | dst | 出力点座標 |
[in] | mat | 同次変換行列(3x3の正方行列) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
線分の射影変換
入力直線 src を同次変換行列 mat により変換し、線分 dst を返します。 mat の意味や作成法については 同次変換行列 を参照してください。
[in] | src | 入力線分 |
[out] | dst | 出力線分 |
[in] | mat | 同次変換行列(3x3の正方行列) |
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_geotrans_estimate_perspective_matrix | ( | FMATRIX * | fpMat, | |
const DPNT_T * | pntspFrom, | |||
const DPNT_T * | pntspTo, | |||
UINT | uiNum | |||
) |
射影変換の変換行列を計算
本関数は最小二乗法を使用し、「変換前の点座標と変換後の点座標のペア」の 配列から射影変換行列を求めます。求められた行列は射影変換 (fnFIE_geotrans_perspective) 等で変換行列として使用できます。
射影変換は、線分の直線性は保たれますが、平行性は失われます。 つまり、任意の四角形を別の任意の四角形に移す変換であるといえます。
変換前の点座標を(x',y'), 変換後の点座標(x,y) とすると、射影変換は
と与えられます。この時(x,y)と(x',y')のペアが複数分かっているとき、 本関数により行列 M を求めることができます。なお、点のペアは同一直線上にない4組以上が必要です。
[out] | fpMat | 求められた射影変換の変換行列 |
[in] | pntspFrom | 射影変換前の点の座標列 |
[in] | pntspTo | 射影変換後の点の座標列 |
[in] | uiNum | pntspFrom/pntspTo の点数 |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足で確保に失敗した | |
F_ERR_INVALID_PARAM | パラメータ不正
| |
F_ERR_INVALID_OBJECT | fpMat が3×3の行列ではない | |
F_ERR_CALC_IMPOSSIBLE | 計算不能で異常終了
| |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
// エラー処理は省略しているので注意して下さい。 #include "oal_aloc.h" #include "fie.h" // 各変換行列を求めて、その変換行列を使用して画像の幾何変換をします。 VOID affine_trans() { FHANDLE hsrc = NULL, hdst = NULL; FMATRIX *a_aff = NULL; DPNT_T from[3], to[3]; INT ch, type; INT src_w, src_h; INT dst_w, dst_h; // 変換する BMP 形式の処理対象画像を読み込みます。 fnFIE_load_bmp( "testdata/test.bmp", &hsrc, F_COLOR_IMG_TYPE_UC8 ); // 結果画像を処理対象と同じ型とチャネル数にします。 // サイズは異なっていてもかまいません。 fnFIE_img_get_params( hsrc, &ch, &type, NULL, &src_w, &src_h ); dst_w = src_w * 2; dst_h = src_h / 2; hdst = fnFIE_img_root_alloc( type, ch, dst_w, dst_h ); // 3×3の行列を設定します。 a_aff = fnFIE_mat_aalloc( 3, 3 ); // アフィン変換は同一直線上にない3組以上の座標列を設定します。 // 変換前の座標を設定します。 from[0].x = 0; from[0].y = 0; from[1].x = 0; from[1].y = src_h - 1; from[2].x = src_w - 1; from[2].y = src_h - 1; // 変換後の座標を設定します。 to[0].x = 0; to[0].y = dst_h / 2; to[1].x = dst_w / 2; to[1].y = dst_h - 1; to[2].x = dst_w - 1; to[2].y = dst_h / 2; // アフィン変換行列を求めます。 fnFIE_geotrans_estimate_affine_matrix( a_aff, from, to, 3 ); // 求めたアフィン変換行列より、画像のアフィン変換を行います。 // 三次畳み込み法により濃度補間で、結果画像を生成します。 // マスク画像は生成しません。 // 領域外になる画素は処理をしません。 fnFIE_geotrans_affine( hsrc, hdst, NULL, a_aff, FALSE, F_SAMPLING_CUBIC ); // 結果画像を BMP 形式のファイルとして保存します。 fnFIE_save_bmp( "result/test1.bmp", hdst ); if( NULL != a_aff ) fnFIE_mat_afree( a_aff ); if( NULL != hsrc ) fnFIE_free_object( hsrc ); if( NULL != hdst ) fnFIE_free_object( hdst ); return; } VOID perspective_trans() { FHANDLE hsrc = NULL, hdst = NULL; FMATRIX *a_pp = NULL; DPNT_T from[4], to[4]; INT ch, type; INT src_w, src_h; INT dst_w, dst_h; // 変換する BMP 形式の処理対象画像を読み込みます。 fnFIE_load_bmp( "testdata/test.bmp", &hsrc, F_COLOR_IMG_TYPE_UC8 ); // 結果画像を処理対象と同じ型とチャネル数にします。 // サイズは異なっていてもかまいません。 fnFIE_img_get_params( hsrc, &ch, &type, NULL, &src_w, &src_h ); dst_w = src_w * 2; dst_h = src_h / 2; hdst = fnFIE_img_root_alloc( type, ch, dst_w, dst_h ); // 3×3の行列を設定します。 a_pp = fnFIE_mat_aalloc( 3, 3 ); // 射影変換は同一直線上にない4組以上の座標列を設定します。 // 変換前の座標を設定します。 from[0].x = 0; from[0].y = 0; from[1].x = 0; from[1].y = src_h - 1; from[2].x = src_w - 1; from[2].y = src_h - 1; from[3].x = src_w - 1; from[3].y = 0; // 変換後の座標を設定します。 to[0].x = 0; to[0].y = dst_h / 2; to[1].x = dst_w / 2; to[1].y = dst_h - 1; to[2].x = (dst_w / 4) * 3; to[2].y = (dst_h / 4) * 3; to[3].x = dst_w / 2; to[3].y = 0; // 射影変換行列を求めます。 fnFIE_geotrans_estimate_perspective_matrix( a_pp, from, to, 4 ); // 求めた射影変換行列より、画像の射影変換を行います。 // 最近傍法により濃度補間で、結果画像を生成します。 // マスク画像は生成しません。 // 領域外になる画素は0でクリアします。 fnFIE_geotrans_perspective( hsrc, hdst, NULL, a_pp, TRUE, F_SAMPLING_NN ); // 結果画像を BMP 形式のファイルとして保存します。 fnFIE_save_bmp( "result/test2.bmp", hdst ); if( NULL != a_pp ) fnFIE_mat_afree( a_pp ); if( NULL != hsrc ) fnFIE_free_object( hsrc ); if( NULL != hdst ) fnFIE_free_object( hdst ); return; } INT main() { // FIEライブラリの使用前に必ずコールする必要があります。 fnFIE_setup(); affine_trans(); perspective_trans(); // 終了処理 fnFIE_teardown(); return 0; }
INT FVALGAPI fnFIE_geotrans_estimate_affine_matrix | ( | FMATRIX * | fpMat, | |
const DPNT_T * | pntspFrom, | |||
const DPNT_T * | pntspTo, | |||
UINT | uiNum | |||
) |
アフィン変換の変換行列を計算
本関数は最小二乗法を使用し、「変換前の点座標と変換後の点座標のペア」の 配列からアフィン変換行列を求めます。求められた行列はアフィン変換 (fnFIE_geotrans_affine) 等で変換行列として使用できます。
アフィン変換は、一般に原図形の長さや角度は保たれませんが、線分の直線性や平行性は保たれます。 つまり、任意の平行四辺形を、別の任意の平行四辺形に移すような変換であるといえます。
変換前の点座標を(x',y'), 変換後の点座標(x,y) とすると、アフィン変換は
と与えられます。この時(x,y)と(x',y')のペアが複数分かっているとき、 本関数により行列 M を求めることができます。なお、点のペアは同一直線上にない3組以上が必要です。
[out] | fpMat | 求められたアフィン変換の変換行列 |
[in] | pntspFrom | アフィン変換前の点列の座標 |
[in] | pntspTo | アフィン変換後の点列の座標 |
[in] | uiNum | pntspFrom/pntspTo の点数 |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足で確保に失敗した | |
F_ERR_INVALID_PARAM | パラメータ不正
| |
F_ERR_INVALID_OBJECT | fpMat が3×3の行列ではない | |
F_ERR_CALC_IMPOSSIBLE | 計算不能で異常終了
| |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_geotrans_estimate_similarity_matrix | ( | FMATRIX * | trans_mat, | |
const DPNT_T * | pnts_from, | |||
const DPNT_T * | pnts_to, | |||
UINT | pnts_num | |||
) |
相似変換の変換行列を計算
最小二乗法を使用し、「変換前の点座標と変換後の点座標のペア」の 配列から相似変換行列を求めます。求められた行列はアフィン変換 (fnFIE_geotrans_affine) 等で変換行列として使用できます。
相似変換は、任意の平行移動、回転、および縦横の倍率が等しいスケーリングを組み合わせた変換であり、原図形の直線性や角度を保ちます。 つまり、任意の四角形を、その四角形と相似で鏡映でない別の四角形に移すような変換であるといえます。
変換前の点座標を(x',y'), 変換後の点座標(x,y) とすると、相似変換は
と与えられます。この時(x,y)と(x',y')のペアが複数分かっているとき、 本関数により行列 M を求めることができます。なお、点のペアは相違なる2組以上が必要です。
[out] | trans_mat | 求められた相似変換の変換行列 |
[in] | pnts_from | 相似変換前の点列の座標 |
[in] | pnts_to | 相似変換後の点列の座標 |
[in] | pnts_num | pnts_from/pnts_to の点数 |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足で確保に失敗した | |
F_ERR_INVALID_PARAM | パラメータ不正
| |
F_ERR_INVALID_OBJECT | trans_mat が3×3の行列ではない | |
F_ERR_CALC_IMPOSSIBLE | 計算不能で異常終了
| |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_geotrans_estimate_euclidean_matrix | ( | FMATRIX * | trans_mat, | |
const DPNT_T * | pnts_from, | |||
const DPNT_T * | pnts_to, | |||
UINT | pnts_num | |||
) |
ユークリッド変換の変換行列を計算
最小二乗法を使用し、「変換前の点座標と変換後の点座標のペア」の 配列からユークリッド変換行列を求めます。求められた行列はアフィン変換 (fnFIE_geotrans_affine) 等で変換行列として使用できます。
ユークリッド変換は、任意の平行移動・回転を組み合わせた変換であり、原図形の長さや角度を保ちます。 つまり、任意の四角形を、その四角形と合同な別の四角形に移すような変換であるといえます。
変換前の点座標を(x',y'), 変換後の点座標(x,y) とすると、ユークリッド変換は
と与えられます。この時(x,y)と(x',y')のペアが複数分かっているとき、 本関数により行列 M を求めることができます。なお、点のペアは相違なる2組以上が必要です。
[out] | trans_mat | 求められたユークリッド変換の変換行列 |
[in] | pnts_from | ユークリッド変換前の点列の座標 |
[in] | pnts_to | ユークリッド変換後の点列の座標 |
[in] | pnts_num | pnts_from/pnts_to の点数 |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足で確保に失敗した | |
F_ERR_INVALID_PARAM | パラメータ不正
| |
F_ERR_INVALID_OBJECT | trans_mat が3×3の行列ではない | |
F_ERR_CALC_IMPOSSIBLE | 計算不能で異常終了
| |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
INT FVALGAPI fnFIE_geotrans_estimate_warp_map | ( | FHANDLE | hmap, | |
const DPNT_T * | pnts_from, | |||
const DPNT_T * | pnts_to, | |||
UINT | pnts_num, | |||
enum f_geotrans_warp_mode | warp_mode, | |||
DOUBLE | param | |||
) |
変換前後の点列を用いて座標変換マップを作成
「変換前の点座標と変換後の点座標のペア」の配列から座標変換マップを作成します。 求められた変換マップ hmap は fnFIE_geotrans_warpping() で使用できます。
hmap の画素タイプは F_IMG_DOUBLE または F_IMG_FLOAT でなければなりません。 hmap のチャネル数は2であり、チャネル0に x 座標が、チャネル1に y 座標が出力されます。
座標変換マップを作成するための処理モードはパラメータ warp_mode で設定します。 warp_mode の値は下記のいずれかです。
[out] | hmap | 座標変換マップ (type:float, double, ch:2) |
[in] | pnts_from | 座標変換前の点列の座標 |
[in] | pnts_to | 座標変換後の点列の座標 |
[in] | pnts_num | pnts_from/pnts_to の点数 |
[in] | warp_mode | 変換マップ作成モード
|
[in] | param | 変換マップ作成モードごとのパラメータ |
F_ERR_NONE | 正常終了 | |
F_ERR_NOMEMORY | メモリ不足で確保に失敗した | |
F_ERR_INVALID_PARAM | パラメータ不正 | |
F_ERR_INVALID_IMAGE | 不正な画像オブジェクトハンドルが渡された | |
F_ERR_CALC_IMPOSSIBLE | 計算不能で異常終了 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
#include <stdio.h> #include "fie.h" // FIE関数の異常終了時に処理終了するためのマクロ定義 #define ERROR_CHECK(expr) if ((err = (expr)) != F_ERR_NONE) { printf("err: %d, line: %d\n", err, __LINE__); goto exit; } // 縦方向の点の数 #define NUM_POINT_ROWS 10 // 横方向の点の数 #define NUM_POINT_COLS 10 // 点の数 #define NUM_POINTS (NUM_POINT_ROWS * NUM_POINT_COLS) // アーチ状に画像を変形するサンプル INT warp_image_like_arch() { // 入力画像 FHANDLE hsrc = NULL; // 出力画像 FHANDLE hdst = NULL; // 座標変換マップ FHANDLE hmap = NULL; // 点列のプロット用画像 FHANDLE hsrc_plot = NULL; FHANDLE hdst_plot = NULL; // 変換前座標点列 DPNT_T pnts_from[NUM_POINTS]; // 変換後座標点列 DPNT_T pnts_to[NUM_POINTS]; // 画像パラメータ INT type, channels, width, height; INT dst_height; // 変換パラメータ // 変換マップ作成モード。複雑な変形に対応できるものを設定 enum f_geotrans_warp_mode warp_mode = F_WARP_MODE_LOCAL_WEIGHTED_MEAN_LINEAR; // 近傍点の数 DOUBLE param = 8.0; // 濃度補間法 enum f_sampling_mode sampling_mode = F_SAMPLING_BILINEAR; INT err = F_ERR_NONE; INT x, y, i; // 入力画像読み込み。1チャネルまたは3チャネルの濃淡画像(F_IMG_UC8)を想定 ERROR_CHECK( fnFIE_load_img_file("sample.png", &hsrc, F_COLOR_IMG_TYPE_UC8) ); // 入力画像のパラメータ取得 ERROR_CHECK( fnFIE_img_get_params(hsrc, &channels, &type, NULL, &width, &height) ); // アーチ状に変形させるため、出力画像の高さを少し追加 dst_height = height * 5 / 4; // 出力画像と座標変換マップのメモリ確保 hdst = fnFIE_img_root_alloc(type, channels, width, dst_height); hmap = fnFIE_img_root_alloc(F_IMG_DOUBLE, 2, width, dst_height); // 変換前後の点列の設定 for (y = 0; y < NUM_POINT_ROWS; y++) { for (x = 0; x < NUM_POINT_COLS; x++) { DOUBLE x_ratio = (DOUBLE)x / (NUM_POINT_COLS - 1); DOUBLE y_ratio = (DOUBLE)y / (NUM_POINT_ROWS - 1); // 変換前点は格子状に配置 DPNT_T from = {x_ratio * width, y_ratio * height}; // 変換後点列のY方向差分。アーチ状に変形するので、X座標が画像中央に近いほどY座標を小さくする DOUBLE y_shift_to = (x_ratio - 0.5) * (x_ratio - 0.5) * height; // 変換後点 DPNT_T to = {from.x, from.y + y_shift_to}; INT idx = y * NUM_POINT_COLS + x; pnts_from[idx] = from; pnts_to[idx] = to; } } // 変換マップ作成 ERROR_CHECK( fnFIE_geotrans_estimate_warp_map(hmap, pnts_from, pnts_to, NUM_POINTS, warp_mode, param) ); // 変換実施 ERROR_CHECK( fnFIE_geotrans_warpping(hsrc, hmap, hdst, NULL, TRUE, sampling_mode) ); // 結果画像保存 ERROR_CHECK( fnFIE_save_png("sample_deformed.png", hdst, -1) ); // 可視化用に、点列を赤色で入出力画像にプロットして表示 hsrc_plot = fnFIE_img_root_alloc(type, 3, width, height); hdst_plot = fnFIE_img_root_alloc(type, 3, width, dst_height); if (channels == 1) { ERROR_CHECK( fnFIE_color_convert(hsrc, F_CS_GRAY, hsrc_plot, F_CS_RGB, NULL) ); ERROR_CHECK( fnFIE_color_convert(hdst, F_CS_GRAY, hdst_plot, F_CS_RGB, NULL) ); } else { // channel == 3 ERROR_CHECK( fnFIE_img_copy(hsrc, hsrc_plot) ); ERROR_CHECK( fnFIE_img_copy(hdst, hdst_plot) ); } for (i = 0; i < NUM_POINTS; i++) { DOUBLE val[3] = {255.0, 0.0, 0.0}; ERROR_CHECK( fnFIE_draw_circle(hsrc_plot, val, F_DRAW_FILL_IN, pnts_from[i], 2) ); ERROR_CHECK( fnFIE_draw_circle(hdst_plot, val, F_DRAW_FILL_IN, pnts_to[i], 2) ); } // 点列可視化画像保存 ERROR_CHECK( fnFIE_save_png("sample_keypoints.png", hsrc_plot, -1) ); ERROR_CHECK( fnFIE_save_png("sample_deformed_keypoints.png", hdst_plot, -1) ); exit: // 画像の解放 fnFIE_free_object(hsrc); fnFIE_free_object(hdst); fnFIE_free_object(hmap); fnFIE_free_object(hsrc_plot); fnFIE_free_object(hdst_plot); return err; } int main() { INT err; // FIEライブラリのセットアップ fnFIE_setup(); err = warp_image_like_arch(); // ライブラリの終了処理 fnFIE_teardown(); return err; }
![]() 入力画像 | ![]() 作成した変換マップにより入力画像を変形した画像 |
![]() 変換前点列の可視化画像 | ![]() 変換後点列の可視化画像 |