WIL説明書(C++)  3.0.0
サンプルコード (ソーベル)

CFvFPM2Matching を使用したマッチング処理の例を示します。
この例では特徴点の抽出にソーベルエッジを使用しています。
マッチングテンプレート(CFvPattern)は、 処理対象画像から MakePattern を行って保存していたものを使用しています。 マッチングテンプレートの生成やファイル保存については、 FVCL::Data::CFvPattern のサンプルコードを参考にしてください。
処理結果の画像下に記述している処理時間は、Intel Core2 2.13GHz 2.0GB RAM で実行した時のものです。 画像サイズは 320x240 です。処理対象画像の状態やパラメータの設定内容によって速度は変化します。

1) 線幅が細い画像  
FPM2.Search_SobelEdge-0_0.png
【パタン画像】
Pattern.clip.png

【関数の出力】

User::SampleCode::FPM2::Search_Sobel
pattern edges=244
image edges=1585
execute. 75.078488 msec, count=10



2) 線幅が太い画像  
FPM2.Search_SobelEdge-1_0.png
【パタン画像】
Pattern.key1.png

【関数の出力】

User::SampleCode::FPM2::Search_Sobel
pattern edges=396
image edges=1888
execute. 42.086758 msec, count=3 


ソースコード:
上記 1) の処理は、下記の関数に引数 0,0 を指定して実行したものです。 2) の処理は、引数 1,0 を指定して実行したものです。

void Search_Sobel(int target = 0, int option = 0)
{
_tprintf(_T("%s\n"), __TFUNCTION__);
// 1) インスタンスの準備.
// 2-1) 処理対象画像の取り込み.
LPCTSTR szSrcFile[] =
{
_T(".\\clip_UC8_M.png"),
_T(".\\key_UC8_M.png"),
};
INT status = FVCL::File::LoadImageFile( szSrcFile[target], &src );
if( status != FVCL_ErrorCode::_SUCCESS )
{
_tprintf(_T("%s: Failed to load image file. code=%d\n"), __TFUNCTION__, status);
return;
}
// 2-2) パタン画像の読み込み.
LPCTSTR szPatFile[] =
{
_T(".\\clip.pat"),
_T(".\\key1.pat"),
};
if( ! pattern.Load( szPatFile[target] ) )
{
_tprintf(_T("Failed to load pattern file. code=%d\n"), pattern.GetErrorCode());
return;
}
// 3) パラメータ準備.
// ※パラメータを既定値から変更した部分は、コメントに [*] を記述しています.
//
// 3-1) (FPM2) 基本パラメータ設定
FVCL::FPM2::CFvFPM2Param& param = matching.GetParam();
param.SetCount( 10 ); // [*] 検索個数.
param.SetAngleMin( FVCL::Data::CFvAngle(-180) ); // [ ] 回転角(下限)
param.SetAngleMax( FVCL::Data::CFvAngle(180) ); // [ ] 回転角(上限)
param.SetScaleMin( 100 ); // [ ] スケール(下限) (%)
param.SetScaleMax( 100 ); // [ ] スケール(上限) (%)
param.SetCompressionLevel( 3); // [ ] 圧縮レベル (3: 1/8)
param.SetErrorRange( 1 ); // [ ] 誤差範囲 (画素)
param.SetScoreThresholdL( 50 ); // [ ] 低圧縮処理時のスコア閾値.
param.SetScoreThresholdH( 50 ); // [ ] 高圧縮処理時のスコア閾値.
// 3-2) (FPM2) 領域スコア算出用パラメータ設定
paramA.SetErrorRangeTx( 0.5 ); // [ ] 誤差範囲(X方向並進値) (画素)
paramA.SetErrorRangeTy( 0.5 ); // [ ] 誤差範囲(Y方向並進値) (画素)
paramA.SetErrorRangeTq( 0.5 ); // [ ] 誤差範囲(回転角) (度)
paramA.SetErrorRangeTs( 0.5 ); // [ ] 誤差範囲(スケール) (%)
paramA.SetErrorRange( 1 ); // [ ] 誤差範囲 (画素)
paramA.SetNoiseWeight( 0.2 ); // [ ] ノイズデータ重み係数.
paramA.SetScoreThreshold( 60 ); // [ ] スコア閾値 (領域スコア算出時)
// 3-3) (FPM2) 不可欠領域スコア算出用パラメータ設定
paramE.SetErrorRange( 1 ); // [ ] 誤差範囲 (画素)
paramE.SetScoreThreshold( 60 ); // [ ] スコア閾値 (高精度ポーズ推定時)
// 3-4) (FPM2) 特徴量
// (ソーベル) 特徴量抽出用パラメータ生成
edge_param.SetEdgeThreshold( 120 ); // [ ] エッジ強度値に対する閾値.
edge_param.SetNmsLength( 3 ); // [ ] 非極大抑制処理のフィルタ片幅.
switch (option)
{
case 0: // Nms=3
break;
case 1: // Nms=7
edge_param.SetNmsLength( 7 ); // [*] 非極大抑制処理のフィルタ片幅.
break;
}
// 3-4-1) (FPM2) 特徴量(テンプレート) 生成
templ.Create(pattern, FVCL::FPM2::MatchMode::Normal, edge_param);
// 3-4-2) (FPM2) 特徴量(処理対象画像) 生成
feature.Create(src, FVCL::FPM2::MatchMode::Normal, edge_param, false);
// 4) 画像処理準備.
// 4-1) 処理対象オブジェクトの設定.
matching.SetParam( param ); // 3-1 基本パラメータ.
matching.SetParamAreaScore( paramA ); // 3-2 領域スコア算出.
matching.SetParamEssential( paramE ); // 3-3 不可欠領域スコア計算.
matching.SetTarget( &feature ); // 3-4-1 特徴量(処理対象画像)
matching.SetTemplate( &templ ); // 3-4-2 特徴量(テンプレート)
matching.SetEnableAreaScore( false ); // [ ] 領域スコア算出 (false:行わない)
matching.SetEnableEssential( false ); // [ ] 不可欠領域スコア計算 (false:行わない)
// 確認用) パタンのエッジ点
{
_tprintf(_T("pattern edges=%d \n"), edges_pattern.size());
}
// 確認用) 処理対象画像のエッジ点
{
_tprintf(_T("image edges=%d \n"), edges_image.size());
}
// 5) 画像処理実行.
timer.Start();
matching.Execute();
double msec = timer.Stop();
_tprintf(_T("execute. %f msec, count=%d \n"), msec, matching.GetResultSize());
// E) 確認用.
filename.Format(_T("FPM2.Search_SobelEdge-%d_%d.png"), target, option);
SaveResult(src, templ, matching, filename);
}
{
INT horz, vert;
src.GetWindow( NULL, NULL, &horz, &vert );
RECT rect = { 0, 0, horz, vert };
// 画像表示の準備.
display.Create( 1 );
display.SetImage( &src );
display.SetDisplayRect( rect );
display.ReadImage();
// オーバレイの生成.
FVCL::GDI::CFvOverlay* pOverlay0 = display.GetOverlay(0);
pOverlay0->SetScaling( true );
FVCL::Data::CFvPoint offset = templ.GetOffset(); // パタン登録時の基準点.
double width = templ.GetWidth();
double height = templ.GetHeight();
for (UINT i = 0; i < matching.GetResultSize(); i++)
{
FVCL::FPM2::CFvFPM2Data data = matching[i];
// マッチング結果の取得.
FVCL::Data::CFvPoint pos = data.GetPosition(); // 回答位置.
FVCL::Data::CFvAngle angle = data.GetAngle(); // 回転角
double scale = data.GetScale(); // スケール (%)
int score = data.GetScore(); // スコア (%)
FVCL::Data::CFvRectangle rect; // 矩形.
st.x = pos.x - offset.x; st.y = pos.y - offset.y;
ed.x = st.x + width; ed.y = st.y + height;
rect.st = st;
rect.ed = ed;
rect.center = offset;
rect.angle = angle;
// 描画用.
// --- 矩形(塗りつぶし)
_fill.SetSize( 1, 1, 32 );
FVCL::tagRGB32 rgb = {0x00,0x00,0xFF,0xFF}; // B,G,R,A
_fill.SetPixelRGB( 0, 0, rgb );
_fill.SetPosition( rect.st );
_fill.SetAxis( rect.center );
_fill.SetAngle( rect.angle.GetDegree() );
_fill.SetAlpha( 0x3F );
_fill.SetAlphaFormat( 0 );
_fill.SetStretchHorzSize( (UINT)(width) );
_fill.SetStretchVertSize( (UINT)(height) );
// --- 矩形
_rect.SetPosition( rect.st );
_rect.SetAxis( rect.center );
_rect.SetAngle( rect.angle.GetDegree() );
_rect.GetPen().SetColor(RGB(0x00, 0x00, 0xFF));
// --- 回答位置.
_pos.SetSize(5, 5);
_pos.GetPen().SetColor( RGB(0xFF, 0x00, 0x00) );
_pos.SetAngle( rect.angle.GetDegree() );
// --- 文字列処理用
// --- スコア.
str.Format( _T("%d"), score );
_score.SetText(LPCTSTR( str ) );
_score.SetPosition( pos );
_score.SetColor( RGB(0xFF, 0xFF, 0x00) );
_score.SetAngle( rect.angle.GetDegree() );
// --- スケール.
str.Format( _T("%d"), (int)scale );
_scale.SetText( LPCTSTR(str) );
_scale.SetPosition( pos );
_scale.SetColor( RGB(0x7F, 0xFF, 0x00) );
_scale.SetAngle( rect.angle.GetDegree() );
// --- 傾き.
str.Format(_T("%d"), (int)rect.angle.GetDegree());
_angle.SetText( LPCTSTR(str) );
_angle.SetPosition( FVCL::Data::CFvPoint(pos.x, pos.y + _scale.GetFont().lfHeight) );
_angle.SetColor( RGB(0x00, 0xFF, 0xFF) );
_angle.SetAngle( rect.angle.GetDegree() );
_angle.SetAxis( FVCL::Data::CFvPoint(0, -_scale.GetFont().lfHeight) );
// 追加.
pOverlay0->DrawFigure(_fill);
pOverlay0->DrawFigure(_rect);
pOverlay0->DrawFigure(_pos);
pOverlay0->DrawFigure(_score);
pOverlay0->DrawFigure(_scale);
pOverlay0->DrawFigure(_angle);
}
// 保存.
display.SaveImage(&canvas, display.GetDisplayRect(), 1.0);
FVCL::File::SaveImageFile(filename, canvas);
}

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