WIL説明書(C++)  3.0.0
関数

詳解

関数

FVCL_API INT FVCL::PolarTrans::Transform (const FVCL::Data::CFvImage &src, FVCL::Data::CFvImage *dst, const FVCL::PolarTrans::CFvPolarTransParam &param, bool invert=false, bool clearback=true, INT sampling_mode=FVCL::PolarTrans::SamplingMode::NearestNeighbor)
 画像の極座標変換 [詳解]
 
FVCL_API INT FVCL::PolarTrans::Transform (const FVCL::CFvMultiData< FVCL::Data::CFvPoint > &src, FVCL::CFvMultiData< FVCL::Data::CFvPoint > *dst, const FVCL::PolarTrans::CFvPolarTransParam &param, bool invert=false)
 点群の極座標変換 [詳解]
 

関数詳解

FVCL::PolarTrans::Transform ( const FVCL::Data::CFvImage src,
FVCL::Data::CFvImage dst,
const FVCL::PolarTrans::CFvPolarTransParam param,
bool  invert = false,
bool  clearback = true,
INT  sampling_mode = FVCL::PolarTrans::SamplingMode::NearestNeighbor 
)

画像の極座標変換

namespace FVCL::PolarTrans

画像の極座標変換を行います。

引数
[in]src処理対象の画像
※処理可能な条件については CFvPolarTrans::CheckValidity をご参照ください。
[out]dst変換後の画像
※内部で有効化されます。(解説をご参照ください。)
[in]param極座標変換パラメータ
[in]invert変換方向の反転
  • false : 矩形の領域から円形の領域への変換
  • true : 円形の領域から矩形の領域への変換

[in]clearback背景の処理方法
座標変換後の領域の外側の画素の処理方法を指定します。
  • true : 0 クリアする
  • false : 処理しない

[in]sampling_mode濃度補間方法
  • FVCL::PolarTrans::SamplingMode::NearestNeighbor : 最近傍法
  • FVCL::PolarTrans::SamplingMode::Bilinear : 共通一次線形補間法
  • FVCL::PolarTrans::SamplingMode::Cubic : 三次畳み込み法

戻り値
FVCL_ErrorCode::_SUCCESS正常終了
FVCL_ErrorCode::LICENSE_ERRORライセンスエラー
FVCL_ErrorCode::INVALID_PARAMETERパラメータが不正です。
FVCL_ErrorCode::FAILED_TO_ALLOCATEメモリが不足しています。
FVCL_ErrorCode::INVALID_SRC_IMAGETYPE処理対象画像の画像種別が不正です。
必要条件:
ヘッダー: FVCLbasic.h
FIE:
fnFIE_polar_trans_img
fnFIE_polar_trans_img_inv
解説:
画像の極座標変換を行います。
詳細については CFvPolarTrans の解説をご参照ください。
内部では、以下の手順で CFvPolarTrans を実行しています。
この関数内部の手順:
  • 1) 入力画像の有効性を確認します。
    有効性の検査には CheckValidity を使用しています。
  • 2) 極座標変換クラスのインスタンスを生成します。
  • 3) 引数に指定されたパラメータをインスタンスに設定します。
  • 4) 出力画像を有効化します。(現状の有効性に関わらず必ず有効化します)
    有効化には Validate(1) を使用しています。 出力画像のサイズは、引数の paraminvert の条件に従います。
  • 5) 極座標変換を実行します。

この関数内部のコード:
if( dst == NULL )
// 1) 入力画像の有効性を確認します。
return valid;
// 2) 極座標変換クラスのインスタンスを生成します。
CFvPolarTrans parser;
// 3) 引数に指定されたパラメータをインスタンスに設定します。
parser.SetSrcImage( 0, &src ); // 入力画像の設定
parser.SetDstImage( 0, dst ); // 出力画像の設定
parser.SetParam( param ); // パラメータの設定
parser.SetClearBackMode( clearback );
if( ! parser.SetSamplingMode( sampling_mode ) )
parser.SetInvert( invert );
// 4) 出力画像を有効化します。
if( ! parser.Validate(1) )
return parser.GetErrorCode();
// 5) 極座標変換を実行します。
if( ! parser.Execute() )
return parser.GetErrorCode();

サンプルコード:
極座標変換の処理例:
回転するCD-ROMをラインセンサで撮像した画像(下図左)を極座標変換して、 元の円形の状態(下図右)に復元する処理例を示します。
【入力画像】   【出力画像】
disk_left.png
arrow.png
PolarTrans.TransformForImage.png
ソースコード:
// $Revision: 1.1 $
void TransformForImage()
{
// 1) インスタンスの準備
// 2) 処理対象画像の取り込み
INT status = FVCL::File::LoadImageFile( _T("disk_left.png"), &src );
if( status != FVCL_ErrorCode::_SUCCESS )
{
_tprintf(_T("%s: Failed to load image file. code=%d\n"), __TFUNCTION__, status);
return;
}
// 3) パラメータ設定
INT horz, vert;
src.GetWindow( NULL, NULL, &horz, &vert );
param.SetOriginIn( src.GetWindow().st );
param.SetWidth( horz );
param.SetHeight( vert );
param.SetRadius( param.GetWidth() );
// 4) 画像処理実行
// E) 処理結果画像の保存
FVCL::File::SaveImageFile(_T("PolarTrans.TransformForImage.png"), dst);
}
参照
CFvPolarTrans
FVCL::PolarTrans::Transform ( const FVCL::CFvMultiData< FVCL::Data::CFvPoint > &  src,
FVCL::CFvMultiData< FVCL::Data::CFvPoint > *  dst,
const FVCL::PolarTrans::CFvPolarTransParam param,
bool  invert = false 
)

点群の極座標変換

namespace FVCL::PolarTrans

点群の極座標変換を行います。

引数
[in]src処理対象の点群 (1点以上)
[out]dst変換後の点群
※ src と同サイズで再確保されます。
[in]param極座標変換パラメータ
[in]invert変換方向の反転
  • false : 矩形の領域から円形の領域への変換
  • true : 円形の領域から矩形の領域への変換

戻り値
FVCL_ErrorCode::_SUCCESS正常終了
FVCL_ErrorCode::LICENSE_ERRORライセンスエラー
FVCL_ErrorCode::INVALID_PARAMETERパラメータが不正です。
FVCL_ErrorCode::FAILED_TO_ALLOCATEメモリが不足しています。
必要条件:
ヘッダー: FVCLbasic.h
FIE:
fnFIE_polar_trans_pnt
fnFIE_polar_trans_pnt_inv
解説:
点群の極座標変換を行います。
変換対象の違いを除けば、 CFvPolarTrans と同様です。 詳細については CFvPolarTrans の解説をご参照ください。
サンプルコード:
極座標変換の処理例:
回転するCD-ROMをラインセンサで撮像した画像からエッジ検出した点列(下図左)を極座標変換して、 元の円形の状態(下図右)に復元する処理例を示します。 ここでは、出力点列を視覚的に確認する為、画像の極座標変換を行っていますが、必須ではありません。
【入力点列】   【出力点列】
PolarTrans.TransformForPoints-src.png
arrow.png
PolarTrans.TransformForPoints-dst.png
ソースコード:
// $Revision: 1.1 $
void TransformForPoints()
{
// 1) 点群の取得
INT status = FVCL::File::LoadImageFile( _T("disk_left.png"), &src );
if( status != FVCL_ErrorCode::_SUCCESS )
{
_tprintf(_T("%s: Failed to load image file. code=%d\n"), __TFUNCTION__, status);
return;
}
parser.SetSrcImage( 0, &src );
parser.SetResult( &edges );
if( !parser.Execute() )
{
_tprintf( _T("Could not detect the edge. code=%d\n"), parser.GetErrorCode() );
return;
}
// 2) パラメータ設定
INT horz, vert;
src.GetWindow( NULL, NULL, &horz, &vert );
param.SetOriginIn( src.GetWindow().st );
param.SetWidth( horz );
param.SetHeight( vert );
param.SetRadius( param.GetWidth() );
// 3) 入出力データの準備
src_points.resize( edges.GetCount() );
for( UINT i=0 ; i<src_points.size() ; i++ )
src_points[i] = edges.m_datas[i].GetPosition();
// 4) 処理実行
status = FVCL::PolarTrans::Transform( src_points, &dst_points, param, false );
if( status != FVCL_ErrorCode::_SUCCESS )
{
_tprintf( _T("Failed to execute polar trasformation. code=%d\n"), status );
return;
}
// E) 確認用 (入力点群)
{
// 表示範囲
RECT rect;
rect.left = 0;
rect.top = 0;
rect.right = src.GetHorzSize();
rect.bottom = src.GetVertSize();
// 画像表示の準備
display.Create( 1 );
display.SetImage( &src );
display.SetDisplayRect( rect );
// オーバレイの生成
FVCL::GDI::CFvOverlay* pOverlay0 = display.GetOverlay(0);
pOverlay0->SetScaling( true );
// 描画図形の生成と追加
for( UINT i=0 ; i<src_points.size() ; i++ )
{
FVCL::GDI::CFvGdiPoint point( src_points[i] );
point.GetPen().SetColor( RGB(255,0,0) );
point.SetStyle( FVCL::GDI::FigureStyle::Cross );
point.SetSize( 1, 1 );
pOverlay0->DrawFigure( point );
}
// 画像保存
display.SaveImage( &canvas, display.GetDisplayRect(), 1.0 );
FVCL::File::SaveImageFile(_T("PolarTrans.TransformForPoints-src.png"), canvas);
}
// E) 確認用 (出力点群)
{
// 画像の極座標変換
// 表示範囲
RECT rect;
rect.left = 0;
rect.top = 0;
rect.right = dst.GetHorzSize();
rect.bottom = dst.GetVertSize();
// 画像表示の準備
display.Create( 1 );
display.SetImage( &dst );
display.SetDisplayRect( rect );
// オーバレイの生成
FVCL::GDI::CFvOverlay* pOverlay0 = display.GetOverlay(0);
pOverlay0->SetScaling( true );
// 描画図形の生成と追加
for( UINT i=0 ; i<dst_points.size() ; i++ )
{
FVCL::GDI::CFvGdiPoint point( dst_points[i] );
point.GetPen().SetColor( RGB(0,0,255) );
point.SetStyle( FVCL::GDI::FigureStyle::Cross );
point.SetSize( 1, 1 );
pOverlay0->DrawFigure( point );
}
// 画像保存
display.SaveImage( &canvas, display.GetDisplayRect(), 1.0 );
FVCL::File::SaveImageFile(_T("PolarTrans.TransformForPoints-dst.png"), canvas);
}
}
参照
CFvPolarTrans

Documentation copyright © 2007 FAST Corporation. [B-001864]
Generated on 2023年11月02日(木) 10時12分56秒 for WIL説明書(C++) by doxygen 1.8.11