Fig1. 極座標系
Fig2. 極座標変換と逆変換
Fig3に回転軸位置の設定について示します。 それぞれ塗りつぶされている部分が、対象領域です。 回転軸位置は coord_mode パラメータとして与えられます。 coord_mode により、左側の座標での回転軸位置を設定します。 回転軸位置は4つのパターンから指定します。 F_PT_LEFT は左辺、 F_PT_RIGHT は右辺、 F_PT_UPPER は上辺, そして F_PT_LOWER は下辺が回転軸となります。 指定されるパターンにより左側と右側の座標では対応する 座標と xy 座標が異なります。 左側の座標で F_PT_LEFT と F_PT_RIGHT が指定されていれば、 r が x 軸,
が y 軸、 F_PT_UPPER と F_PT_LOWER が指定されていれば、 r が y 軸、
が x 軸とそれぞれ対応しています。 そのため、回転中心座標
とw、hの位置関係や、座標変換式の符号等が異なります。
Fig3において、 と
がそれぞれの回転中心座標であり、対応関係となります。 以後,本節では coord_mode が F_PT_LEFT を指定した場合を用いて説明をします。 以下に、
から
への変換式と、その逆変換式を示します。 なお、簡単のため
の処理開始角度は0、処理範囲は
とします。 ここで、
を原点とした
での r を r' 、
を
とすると、
となります。r と w の対応関係より、以下の式が導かれます。
続いて、右側の座標での円弧長を L とします。
とhの対応関係より、以下の式が導かれます。
以上より、 から
への変換式が求められました。
から
への変換式は、 まず、 r' と
を求めます。
続いて、 p と q を求めます。
Fig3. 回転軸位置の設定
F_PT_UPPER
Fig.4の塗りつぶされている領域は、処理対象となる領域です。 本領域は、ユーザーが任意に指定するパラメータによって決定されます。 ここでのパラメータとは、 origin_in 、 width 、 height 、 origin_out 、 radius 、 start_angle 、 そして range_angle です。 入力画像、出力画像のサイズには依存しません。 画像領域は、処理対象領域と別に考えなければなりません。 入力側、出力側共に、処理対象領域と画像領域が重なり合う領域が必要です。 どちらか一方でも、重なり合う領域がない場合には、処理がなされません。
Fig4. パラメータとの対応関係
F_IMG_BIN | F_IMG_UC8 | F_IMG_US16 | F_IMG_DOUBLE | |
---|---|---|---|---|
F_SAMPLING_NN | ||||
F_SAMPLING_BILINEAR | ||||
F_SAMPLING_CUBIC |
列挙型 | |
enum | f_coord_mode { F_PT_UPPER = 1, F_PT_LOWER = 2, F_PT_LEFT = 3, F_PT_RIGHT = 4 } |
回転軸の位置を指定 [詳細] | |
関数 | |
INT FVALGAPI | fnFIE_polar_trans_img (const FHANDLE hsrc, FHANDLE hdst, DPNT_T origin_in, DOUBLE width, DOUBLE height, DPNT_T origin_out, DOUBLE radius, DOUBLE start_angle, DOUBLE range_angle, enum f_coord_mode coord_mode, INT back_clear, enum f_sampling_mode sampling_mode) |
画像間の極座標変換 | |
INT FVALGAPI | fnFIE_polar_trans_img_inv (const FHANDLE hsrc, FHANDLE hdst, DPNT_T origin_in, DOUBLE radius, DOUBLE start_angle, DOUBLE range_angle, DPNT_T origin_out, DOUBLE width, DOUBLE height, enum f_coord_mode coord_mode, INT back_clear, enum f_sampling_mode sampling_mode) |
画像間の逆極座標変換 | |
INT FVALGAPI | fnFIE_polar_trans_map (FHANDLE hmap, DPNT_T origin_in, DOUBLE width, DOUBLE height, DPNT_T origin_out, DOUBLE radius, DOUBLE start_angle, DOUBLE range_angle, enum f_coord_mode coord_mode) |
極座標変換マップの作成 | |
INT FVALGAPI | fnFIE_polar_trans_map_inv (FHANDLE hmap, DPNT_T origin_in, DOUBLE radius, DOUBLE start_angle, DOUBLE range_angle, DPNT_T origin_out, DOUBLE width, DOUBLE height, enum f_coord_mode coord_mode) |
逆極座標変換マップの作成 | |
INT FVALGAPI | fnFIE_polar_trans_pnt (const DPNT_T *psrc, DPNT_T *pdst, INT num_pnt, DPNT_T origin_in, DOUBLE width, DOUBLE height, DPNT_T origin_out, DOUBLE radius, DOUBLE start_angle, DOUBLE range_angle, enum f_coord_mode coord_mode) |
点群間の極座標変換 | |
INT FVALGAPI | fnFIE_polar_trans_pnt_inv (const DPNT_T *psrc, DPNT_T *pdst, INT num_pnt, DPNT_T origin_in, DOUBLE radius, DOUBLE start_angle, DOUBLE range_angle, DPNT_T origin_out, DOUBLE width, DOUBLE height, enum f_coord_mode coord_mode) |
点群間の逆極座標変換 |
enum f_coord_mode |
INT FVALGAPI fnFIE_polar_trans_img | ( | const FHANDLE | hsrc, | |
FHANDLE | hdst, | |||
DPNT_T | origin_in, | |||
DOUBLE | width, | |||
DOUBLE | height, | |||
DPNT_T | origin_out, | |||
DOUBLE | radius, | |||
DOUBLE | start_angle, | |||
DOUBLE | range_angle, | |||
enum f_coord_mode | coord_mode, | |||
INT | back_clear, | |||
enum f_sampling_mode | sampling_mode | |||
) |
画像間の極座標変換
画像間の極座標変換をします。
全般
back_clear
sampling_mode
[in] | hsrc | 入力画像( type : bin, uc8, us16, double ) |
[out] | hdst | 出力画像( type : bin, uc8, us16, double ) |
[in] | origin_in | 入力側での処理対象領域の開始座標 |
[in] | width | 入力側での処理対象領域の幅 |
[in] | height | 入力側での処理対象領域の高さ |
[in] | origin_out | 出力側での円板の回転中心 |
[in] | radius | 出力側での円板の半径 |
[in] | start_angle | 出力側での処理開始角度 |
[in] | range_angle | 出力側での角度の処理範囲 |
[in] | coord_mode | 入力側での回転中心位置
|
[in] | back_clear | 出力画像の背景処理方法
|
[in] | sampling_mode | 濃度補間法
|
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_INVALID_IMAGE | 不正な画像オブジェクトが渡された | |
F_ERR_NOMEMORY | メモリ不足(F_SAMPLING_CUBICを指定した場合のみ) | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
Fig1. cood_mode の指定例
入力画像 | |
![]() | |
(1)start_angle = 0 , range_angle = ![]() width = 400 , height = 800 | (2)start_angle = 0 , range_angle = ![]() width = 400 , height = 800 |
![]() | ![]() |
(3)start_angle = 0 , range_angle = ![]() width = 400 , height = 400 | (4)start_angle = 0 , range_angle = ![]() width = 400 , height = 400 |
![]() | ![]() |
(5)start_angle = 0 , range_angle = ![]() width = 400 , height = 800 | (6)start_angle = 0 , range_angle = ![]() width = 400 , height = 800 |
![]() | ![]() |
(7)start_angle = ![]() ![]() width = 400 , height = 800 | (8)start_angle = 0 , range_angle = ![]() width = 320 , height = 800 |
![]() | ![]() |
(9)start_angle = 0 , range_angle = ![]() width = 400 , height = 800 | (10)start_angle = 0 , range_angle = ![]() width = 400 , height = 800 |
![]() | ![]() |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" // 左図から右図への変換 VOID polar_transform_img() { FHANDLE hsrc = NULL, hdst = NULL; DPNT_T origin_in, origin_out; DOUBLE width, height, radius, start_angle, range_angle; // 入力画像の読み込み // width = 256.0, height = 256.0 fnFIE_load_tiff( "fie_poloar_transform.tif", &hsrc, F_COLOR_IMG_TYPE_UC8 ); // 出力画像のメモリ確保 // チャネル数は同じ必要がある hdst = fnFIE_img_root_alloc( F_IMG_UC8, 1, 128, 128 ); origin_out.x = 64.0; origin_out.y = 64.0; radius = 64.0; start_angle = 0.0; range_angle = 2.0 * PI; // F_PT_UPPER // 入力側の対象領域の右上の座標を指定する origin_in.x = 178.0; origin_in.y = 6.0; width = 64.0; height = 172.0; // 背景は0クリア // 濃度補間法は最近傍法 fnFIE_polar_trans_img( hsrc, hdst, origin_in, width, height, origin_out, radius, start_angle, range_angle, F_PT_UPPER, TRUE, F_SAMPLING_NN ); fnFIE_save_tiff( "fie_poloar_transform_upper.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 ); // F_PT_LOWER // 入力側の対象領域の左下の座標を指定する origin_in.x = 78.0; origin_in.y = 250.0; width = 64.0; height = 172.0; // 背景は0クリア // 濃度補間法は共一次線形補間法 fnFIE_polar_trans_img( hsrc, hdst, origin_in, width, height, origin_out, radius, start_angle, range_angle, F_PT_LOWER, TRUE, F_SAMPLING_BILINEAR ); fnFIE_save_tiff( "fie_poloar_transform_lower.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 ); // F_PT_LEFT // 入力側の対象領域の左上の座標を指定する origin_in.x = 6.0; origin_in.y = 78.0; width = 172.0; height = 64.0; // 背景は0クリア // 濃度補間法は三次畳み込み法 fnFIE_polar_trans_img( hsrc, hdst, origin_in, width, height, origin_out, radius, start_angle, range_angle, F_PT_LEFT, TRUE, F_SAMPLING_CUBIC ); fnFIE_save_tiff( "fie_poloar_transform_left.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 ); // F_PT_RIGHT // 入力側の対象領域の右下の座標を指定する origin_in.x = 250.0; origin_in.y = 178.0; width = 172.0; height = 64.0; // 背景は0クリア // 濃度補間法は三次畳み込み法 fnFIE_polar_trans_img( hsrc, hdst, origin_in, width, height, origin_out, radius, start_angle, range_angle, F_PT_RIGHT, TRUE, F_SAMPLING_CUBIC ); fnFIE_save_tiff( "fie_poloar_transform_right.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 ); fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); } INT main() { // FIEライブラリの初期化処理 fnFIE_setup(); polar_transform_img(); // FIEライブラリの終了処理 fnFIE_teardown(); return 0; }
INT FVALGAPI fnFIE_polar_trans_img_inv | ( | const FHANDLE | hsrc, | |
FHANDLE | hdst, | |||
DPNT_T | origin_in, | |||
DOUBLE | radius, | |||
DOUBLE | start_angle, | |||
DOUBLE | range_angle, | |||
DPNT_T | origin_out, | |||
DOUBLE | width, | |||
DOUBLE | height, | |||
enum f_coord_mode | coord_mode, | |||
INT | back_clear, | |||
enum f_sampling_mode | sampling_mode | |||
) |
画像間の逆極座標変換
画像間の逆極座標変換をします。
全般
back_clear
sampling_mode
[in] | hsrc | 入力画像( type : bin, uc8, us16, double ) |
[out] | hdst | 出力画像( type : bin, uc8, us16, double ) |
[in] | origin_in | 入力側での処理対象領域の開始座標 |
[in] | radius | 入力側での円板の半径 |
[in] | start_angle | 入力側での処理開始角度 |
[in] | range_angle | 入力側での角度の処理範囲 |
[in] | origin_out | 出力側での円板の回転中心 |
[in] | width | 出力側での処理対象領域の幅 |
[in] | height | 出力側での処理対象領域の高さ |
[in] | coord_mode | 出力側での回転中心位置
|
[in] | back_clear | 出力画像の背景処理方法
|
[in] | sampling_mode | 濃度補間法
|
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_INVALID_IMAGE | 不正な画像オブジェクトが渡された | |
F_ERR_NOMEMORY | メモリ不足(F_SAMPLING_CUBICを指定した場合のみ) | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
Fig1. 極座標変換ライブラリの使用例
入力画像 | |
![]() | |
(1)start_angle = 0 , range_angle = ![]() width = 400 , height = 800 | (2)start_angle = 0 , range_angle = ![]() width = 400 , height = 800 |
![]() | ![]() |
// エラー処理は省略しているので注意して下さい。 #include "fie.h" // 右図から左図への変換 VOID polar_transform_img_inv() { FHANDLE hsrc = NULL, hdst = NULL; DPNT_T origin_in, origin_out; DOUBLE width, height, radius, start_angle, range_angle; // 入力画像の読み込み // width = 128.0, height = 128.0 fnFIE_load_tiff( "fie_poloar_transform_inv.tif", &hsrc, F_COLOR_IMG_TYPE_UC8 ); // 出力画像のメモリ確保 // チャネル数は同じ必要がある hdst = fnFIE_img_root_alloc( F_IMG_UC8, 1, 256, 256 ); origin_in.x = 64.0; origin_in.y = 64.0; radius = 64.0; start_angle = 0.0; range_angle = 2.0 * PI; // F_PT_UPPER // 出力側の対象領域の右上の座標を指定する origin_out.x = 178.0; origin_out.y = 6.0; width = 64.0; height = 172.0; // 背景は処理しない // 濃度補間法は最近傍法 fnFIE_polar_trans_img_inv( hsrc, hdst, origin_in, radius, start_angle, range_angle, origin_out, width, height, F_PT_UPPER, FALSE, F_SAMPLING_NN ); fnFIE_save_tiff( "fie_poloar_transform_inv_upper.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 ); // F_PT_LOWER // 出力側の対象領域の左下の座標を指定する origin_out.x = 78.0; origin_out.y = 250.0; width = 64.0; height = 172.0; // 背景は処理しない // 濃度補間法は共一次線形補間法 fnFIE_polar_trans_img_inv( hsrc, hdst, origin_in, radius, start_angle, range_angle, origin_out, width, height, F_PT_LOWER, FALSE, F_SAMPLING_BILINEAR ); fnFIE_save_tiff( "fie_poloar_transform_inv_lower.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 ); // F_PT_LEFT // 出力側の対象領域の左上の座標を指定する origin_out.x = 6.0; origin_out.y = 78.0; width = 172.0; height = 64.0; // 背景は処理しない // 濃度補間法は三次畳み込み法 fnFIE_polar_trans_img_inv( hsrc, hdst, origin_in, radius, start_angle, range_angle, origin_out, width, height, F_PT_LEFT, FALSE, F_SAMPLING_CUBIC ); fnFIE_save_tiff( "fie_poloar_transform_inv_left.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 ); // F_PT_RIGHT // 出力側の対象領域の右下の座標を指定する origin_out.x = 250.0; origin_out.y = 178.0; width = 172.0; height = 64.0; // 背景は処理しない // 濃度補間法は三次畳み込み法 fnFIE_polar_trans_img_inv( hsrc, hdst, origin_in, radius, start_angle, range_angle, origin_out, width, height, F_PT_RIGHT, FALSE, F_SAMPLING_CUBIC ); fnFIE_save_tiff( "fie_poloar_transform_inv_right.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 ); fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); } INT main() { // FIEライブラリの初期化処理 fnFIE_setup(); polar_transform_img_inv(); // FIEライブラリの終了処理 fnFIE_teardown(); return 0; }
INT FVALGAPI fnFIE_polar_trans_map | ( | FHANDLE | hmap, | |
DPNT_T | origin_in, | |||
DOUBLE | width, | |||
DOUBLE | height, | |||
DPNT_T | origin_out, | |||
DOUBLE | radius, | |||
DOUBLE | start_angle, | |||
DOUBLE | range_angle, | |||
enum f_coord_mode | coord_mode | |||
) |
極座標変換マップの作成
極座標変換マップを作成します。極座標変換マップは、 fnFIE_geotrans_warpping で利用されます。
全般
[out] | hmap | 変換マップ( type : double, float / channel : 2 ) |
[in] | origin_in | 入力側での処理対象領域の開始座標 |
[in] | width | 入力側での処理対象領域の幅 |
[in] | height | 入力側での処理対象領域の高さ |
[in] | origin_out | 出力側での円板の回転中心 |
[in] | radius | 出力側での円板の半径 |
[in] | start_angle | 出力側での処理開始角度 |
[in] | range_angle | 出力側での角度の処理範囲 |
[in] | coord_mode | 入力側での回転中心位置
|
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_INVALID_IMAGE | 不正な画像オブジェクトが渡された | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
Fig1. 極座標変換ライブラリの使用例
// エラー処理は省略しているので注意して下さい。 #include "fie.h" // 左図から右図への変換 VOID polar_transform_map() { FHANDLE hsrc = NULL, hdst = NULL, hmap = NULL; DPNT_T origin_in, origin_out; DOUBLE width, height, radius, start_angle, range_angle; // 入力画像の読み込み // width = 256.0, height = 256.0 fnFIE_load_tiff( "fie_poloar_transform.tif", &hsrc, F_COLOR_IMG_TYPE_UC8 ); // 座標マップと出力画像のメモリ確保 // チャネル数は同じ必要がある hdst = fnFIE_img_root_alloc( F_IMG_UC8, 1, 128, 128 ); hmap = fnFIE_img_root_alloc( F_IMG_DOUBLE, 2, 128, 128 ); origin_out.x = 64.0; origin_out.y = 64.0; radius = 64.0; start_angle = 0.0; range_angle = 2.0 * PI; // F_PT_UPPER // 入力側の対象領域の右上の座標を指定する origin_in.x = 178.0; origin_in.y = 6.0; width = 64.0; height = 172.0; fnFIE_polar_trans_map( hmap, origin_in, width, height, origin_out, radius, start_angle, range_angle, F_PT_UPPER ); // 幾何変換ライブラリの fnFIE_geotrans_warpping() を使用して画像にする fnFIE_geotrans_warpping( hsrc, hmap, hdst, NULL, FALSE, F_SAMPLING_CUBIC ); fnFIE_save_tiff( "fie_poloar_transform_upper.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 ); // F_PT_LOWER // 入力側の対象領域の左下の座標を指定する origin_in.x = 78.0; origin_in.y = 250.0; width = 64.0; height = 172.0; fnFIE_polar_trans_map( hmap, origin_in, width, height, origin_out, radius, start_angle, range_angle, F_PT_LOWER ); // 幾何変換ライブラリの fnFIE_geotrans_warpping() を使用して画像にする fnFIE_geotrans_warpping( hsrc, hmap, hdst, NULL, FALSE, F_SAMPLING_CUBIC ); fnFIE_save_tiff( "fie_poloar_transform_lower.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 ); // F_PT_LEFT // 入力側の対象領域の左上の座標を指定する origin_in.x = 6.0; origin_in.y = 78.0; width = 172.0; height = 64.0; fnFIE_polar_trans_map( hmap, origin_in, width, height, origin_out, radius, start_angle, range_angle, F_PT_LEFT ); // 幾何変換ライブラリの fnFIE_geotrans_warpping() を使用して画像にする fnFIE_geotrans_warpping( hsrc, hmap, hdst, NULL, FALSE, F_SAMPLING_CUBIC ); fnFIE_save_tiff( "fie_poloar_transform_left.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 ); // F_PT_RIGHT // 入力側の対象領域の右下の座標を指定する origin_in.x = 250.0; origin_in.y = 178.0; width = 172.0; height = 64.0; fnFIE_polar_trans_map( hmap, origin_in, width, height, origin_out, radius, start_angle, range_angle, F_PT_RIGHT ); // 幾何変換ライブラリの fnFIE_geotrans_warpping() を使用して画像にする fnFIE_geotrans_warpping( hsrc, hmap, hdst, NULL, FALSE, F_SAMPLING_CUBIC ); fnFIE_save_tiff( "fie_poloar_transform_right.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 ); fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); fnFIE_free_object( hmap ); } INT main() { // FIEライブラリの初期化処理 fnFIE_setup(); polar_transform_map(); // FIEライブラリの終了処理 fnFIE_teardown(); return 0; }
INT FVALGAPI fnFIE_polar_trans_map_inv | ( | FHANDLE | hmap, | |
DPNT_T | origin_in, | |||
DOUBLE | radius, | |||
DOUBLE | start_angle, | |||
DOUBLE | range_angle, | |||
DPNT_T | origin_out, | |||
DOUBLE | width, | |||
DOUBLE | height, | |||
enum f_coord_mode | coord_mode | |||
) |
逆極座標変換マップの作成
逆極座標変換マップを作成します。極座標変換マップは、 fnFIE_geotrans_warpping で利用されます。
全般
[out] | hmap | 変換マップ( type : double, float / channel : 2 ) |
[in] | origin_in | 入力側での処理対象領域の開始座標 |
[in] | radius | 入力側での円板の半径 |
[in] | start_angle | 入力側での処理開始角度 |
[in] | range_angle | 入力側での角度の処理範囲 |
[in] | origin_out | 出力側での円板の回転中心 |
[in] | width | 出力側での処理対象領域の幅 |
[in] | height | 出力側での処理対象領域の高さ |
[in] | coord_mode | 出力側での回転中心位置
|
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_INVALID_IMAGE | 不正な画像オブジェクトが渡された | |
F_ERR_NOMEMORY | メモリ不足 | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
Fig1. 極座標変換ライブラリの使用例
// エラー処理は省略しているので注意して下さい。 #include "fie.h" // 右図から左図への変換 VOID polar_transform_map_inv() { FHANDLE hsrc = NULL, hdst = NULL, hmap = NULL; DPNT_T origin_in, origin_out; DOUBLE width, height, radius, start_angle, range_angle; // 入力画像の読み込み // width = 128.0, height = 128.0 fnFIE_load_tiff( "fie_poloar_transform_inv.tif", &hsrc, F_COLOR_IMG_TYPE_UC8 ); // 座標マップと出力画像のメモリ確保 // チャネル数は同じ必要がある hdst = fnFIE_img_root_alloc( F_IMG_UC8, 1, 256, 256 ); hmap = fnFIE_img_root_alloc( F_IMG_DOUBLE, 2, 256, 256 ); origin_in.x = 64.0; origin_in.y = 64.0; radius = 64.0; start_angle = 0.0; range_angle = 2.0 * PI; // F_PT_UPPER // 出力側の対象領域の右上の座標を指定する origin_out.x = 178.0; origin_out.y = 6.0; width = 64.0; height = 172.0; fnFIE_polar_trans_map_inv( hmap, origin_in, radius, start_angle, range_angle, origin_out, width, height, F_PT_UPPER ); // 幾何変換ライブラリの fnFIE_geotrans_warpping() を使用して画像にする fnFIE_geotrans_warpping( hsrc, hmap, hdst, NULL, FALSE, F_SAMPLING_CUBIC ); fnFIE_save_tiff( "fie_poloar_transform_inv_upper.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 ); // F_PT_LOWER // 出力側の対象領域の左下の座標を指定する origin_out.x = 78.0; origin_out.y = 250.0; width = 64.0; height = 172.0; fnFIE_polar_trans_map_inv( hmap, origin_in, radius, start_angle, range_angle, origin_out, width, height, F_PT_LOWER ); // 幾何変換ライブラリの fnFIE_geotrans_warpping() を使用して画像にする fnFIE_geotrans_warpping( hsrc, hmap, hdst, NULL, FALSE, F_SAMPLING_CUBIC ); fnFIE_save_tiff( "fie_poloar_transform_inv_lower.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 ); // F_PT_LEFT // 出力側の対象領域の左上の座標を指定する origin_out.x = 6.0; origin_out.y = 78.0; width = 172.0; height = 64.0; fnFIE_polar_trans_map_inv( hmap, origin_in, radius, start_angle, range_angle, origin_out, width, height, F_PT_LEFT ); // 幾何変換ライブラリの fnFIE_geotrans_warpping() を使用して画像にする fnFIE_geotrans_warpping( hsrc, hmap, hdst, NULL, FALSE, F_SAMPLING_CUBIC ); fnFIE_save_tiff( "fie_poloar_transform_inv_left.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 ); // F_PT_RIGHT // 出力側の対象領域の右下の座標を指定する origin_out.x = 250.0; origin_out.y = 178.0; width = 172.0; height = 64.0; fnFIE_polar_trans_map_inv( hmap, origin_in, radius, start_angle, range_angle, origin_out, width, height, F_PT_RIGHT ); // 幾何変換ライブラリの fnFIE_geotrans_warpping() を使用して画像にする fnFIE_geotrans_warpping( hsrc, hmap, hdst, NULL, FALSE, F_SAMPLING_CUBIC ); fnFIE_save_tiff( "fie_poloar_transform_inv_right.tif", hdst, F_TIFF_COMPRESSION_DEFLATE, -1 ); fnFIE_free_object( hsrc ); fnFIE_free_object( hdst ); fnFIE_free_object( hmap ); } INT main() { // FIEライブラリの初期化処理 fnFIE_setup(); polar_transform_map_inv(); // FIEライブラリの終了処理 fnFIE_teardown(); return 0; }
INT FVALGAPI fnFIE_polar_trans_pnt | ( | const DPNT_T * | psrc, | |
DPNT_T * | pdst, | |||
INT | num_pnt, | |||
DPNT_T | origin_in, | |||
DOUBLE | width, | |||
DOUBLE | height, | |||
DPNT_T | origin_out, | |||
DOUBLE | radius, | |||
DOUBLE | start_angle, | |||
DOUBLE | range_angle, | |||
enum f_coord_mode | coord_mode | |||
) |
点群間の極座標変換
点群間の極座標変換をします。
全般
[in] | psrc | 入力座標群配列の先頭ポインタ |
[out] | pdst | 出力座標群配列の先頭ポインタ |
[in] | num_pnt | 座標数 |
[in] | origin_in | 入力側での処理対象領域の開始座標 |
[in] | width | 入力側での処理対象領域の幅 |
[in] | height | 入力側での処理対象領域の高さ |
[in] | origin_out | 出力側での円板の回転中心 |
[in] | radius | 出力側での円板の半径 |
[in] | start_angle | 出力側での処理開始角度 |
[in] | range_angle | 出力側での角度の処理範囲 |
[in] | coord_mode | 入力側での回転中心位置
|
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
Fig1. 極座標変換ライブラリの使用例
// エラー処理は省略しているので注意して下さい。 #include "oal_aloc.h" #include "fie.h" // 左図から右図への変換 VOID polar_transform_pnt() { DPNT_T *psrc = NULL, *pdst = NULL; DPNT_T origin_in, origin_out; DOUBLE width, height, radius, start_angle, range_angle; F_RANDDESC r; INT i; // メモリの確保 psrc = (DPNT_T*) fnOAL_malloc( sizeof( DPNT_T ) * 100 ); pdst = (DPNT_T*) fnOAL_malloc( sizeof( DPNT_T ) * 100 ); fnFIE_mtrand_init( 234796, &r ); // 入力点群に適当な値を代入する for( i = 0; i < 100; i ++ ){ psrc[i].x = fnFIE_mtrand_real1(&r) * 1024.0; psrc[i].y = fnFIE_mtrand_real1(&r) * 1024.0; } origin_out.x = 64.0; origin_out.y = 64.0; radius = 64.0; start_angle = 0.0; range_angle = 2.0 * PI; // F_PT_UPPER // 入力側の対象領域の右上の座標を指定する origin_in.x = 178.0; origin_in.y = 6.0; width = 64.0; height = 172.0; fnFIE_polar_trans_pnt( psrc, pdst, 100, origin_in, width, height, origin_out, radius, start_angle, range_angle, F_PT_UPPER ); // F_PT_LOWER // 入力側の対象領域の左下の座標を指定する origin_in.x = 78.0; origin_in.y = 250.0; width = 64.0; height = 172.0; fnFIE_polar_trans_pnt( psrc, pdst, 100, origin_in, width, height, origin_out, radius, start_angle, range_angle, F_PT_LOWER ); // F_PT_LEFT // 入力側の対象領域の左上の座標を指定する origin_in.x = 6.0; origin_in.y = 78.0; width = 172.0; height = 64.0; fnFIE_polar_trans_pnt( psrc, pdst, 100, origin_in, width, height, origin_out, radius, start_angle, range_angle, F_PT_LEFT ); // F_PT_RIGHT // 入力側の対象領域の右下の座標を指定する origin_in.x = 250.0; origin_in.y = 178.0; width = 172.0; height = 64.0; fnFIE_polar_trans_pnt( psrc, pdst, 100, origin_in, width, height, origin_out, radius, start_angle, range_angle, F_PT_RIGHT ); fnOAL_free( psrc ); fnOAL_free( pdst ); } INT main() { // FIEライブラリの初期化処理 fnFIE_setup(); polar_transform_pnt(); // FIEライブラリの終了処理 fnFIE_teardown(); return 0; }
INT FVALGAPI fnFIE_polar_trans_pnt_inv | ( | const DPNT_T * | psrc, | |
DPNT_T * | pdst, | |||
INT | num_pnt, | |||
DPNT_T | origin_in, | |||
DOUBLE | radius, | |||
DOUBLE | start_angle, | |||
DOUBLE | range_angle, | |||
DPNT_T | origin_out, | |||
DOUBLE | width, | |||
DOUBLE | height, | |||
enum f_coord_mode | coord_mode | |||
) |
点群間の逆極座標変換
点群間の逆極座標変換をします。
[in] | psrc | 入力座標群配列の先頭ポインタ |
[out] | pdst | 出力座標群配列の先頭ポインタ |
[in] | num_pnt | 座標数 |
[in] | origin_in | 入力側での処理対象領域の開始座標 |
[in] | radius | 入力側での円板の半径 |
[in] | start_angle | 入力側での処理開始角度 |
[in] | range_angle | 入力側での角度の処理範囲 |
[in] | origin_out | 出力側での円板の回転中心 |
[in] | width | 出力側での処理対象領域の幅 |
[in] | height | 出力側での処理対象領域の高さ |
[in] | coord_mode | 出力側での回転中心位置
|
F_ERR_NONE | 正常終了 | |
F_ERR_INVALID_PARAM | 不正なパラメータが渡された | |
F_ERR_NO_LICENCE | ライセンスエラー、または未初期化エラー |
Fig1. 極座標変換ライブラリの使用例
// エラー処理は省略しているので注意して下さい。 #include "oal_aloc.h" #include "fie.h" // 右図から左図への変換 VOID polar_transform_pnt_inv() { DPNT_T *psrc = NULL, *pdst = NULL; DPNT_T origin_in, origin_out; DOUBLE width, height, radius, start_angle, range_angle; F_RANDDESC r; INT i; // メモリの確保 psrc = (DPNT_T*) fnOAL_malloc( sizeof( DPNT_T ) * 100 ); pdst = (DPNT_T*) fnOAL_malloc( sizeof( DPNT_T ) * 100 ); fnFIE_mtrand_init( 234796, &r ); // 入力点群に適当な値を代入する for( i = 0; i < 100; i ++ ){ psrc[i].x = fnFIE_mtrand_real1(&r) * 1024.0; psrc[i].y = fnFIE_mtrand_real1(&r) * 1024.0; } origin_in.x = 64.0; origin_in.y = 64.0; radius = 64.0; start_angle = 0.0; range_angle = 2.0 * PI; // F_PT_UPPER // 出力側の対象領域の右上の座標を指定する origin_out.x = 178.0; origin_out.y = 6.0; width = 64.0; height = 172.0; fnFIE_polar_trans_pnt_inv( psrc, pdst, 100, origin_in, radius, start_angle, range_angle, origin_out, width, height, F_PT_UPPER ); // F_PT_LOWER // 出力側の対象領域の左下の座標を指定する origin_out.x = 78.0; origin_out.y = 250.0; width = 64.0; height = 172.0; fnFIE_polar_trans_pnt_inv( psrc, pdst, 100, origin_in, radius, start_angle, range_angle, origin_out, width, height, F_PT_LOWER ); // F_PT_LEFT // 出力側の対象領域の左上の座標を指定する origin_out.x = 6.0; origin_out.y = 78.0; width = 172.0; height = 64.0; fnFIE_polar_trans_pnt_inv( psrc, pdst, 100, origin_in, radius, start_angle, range_angle, origin_out, width, height, F_PT_LEFT ); // F_PT_RIGHT // 出力側の対象領域の右下の座標を指定する origin_out.x = 250.0; origin_out.y = 178.0; width = 172.0; height = 64.0; fnFIE_polar_trans_pnt_inv( psrc, pdst, 100, origin_in, radius, start_angle, range_angle, origin_out, width, height, F_PT_RIGHT ); fnOAL_free( psrc ); fnOAL_free( pdst ); } INT main() { // FIEライブラリの初期化処理 fnFIE_setup(); polar_transform_pnt_inv(); // FIEライブラリの終了処理 fnFIE_teardown(); return 0; }