WIL説明書(C++)  3.0.0
サンプルコード (処理範囲指定)

限られた範囲をサーチする場合は2つの方法があります。

  1. 画像オブジェクトの処理範囲を指定する。
  2. チャイルド画像を指定する。


一般的には 前者 1) の方法で行いますが、対象画像が非常に大きく、処理範囲が非常に小さい場合は、
後者 2) の方法で行うことにより、画像圧縮処理の時間を短縮することができます。

画像圧縮処理とは、指定された画像の幅/高さをそれぞれ 1/2N に圧縮する処理です。
詳しくは、別冊 FIE ライブラリ説明書のグレイサーチの説明のページに記載されている "粗密探索と画像圧縮" の項をご参照ください。
説明は、下記の階層にあります。

モジュール > FIE module > サーチ > グレイサーチ(正規化相関サーチ) > 説明

サーチ処理の時間に差異はありませんが、サーチ処理の前の画像圧縮の処理量が下記のように異なります。

前者 1) の方法は、画像全体の圧縮を行います。
後者 2) の方法は、部分画像の圧縮を行います。

但し、サーチ結果の座標が異なることにご注意ください。
後者 2) は、部分画像の左上を原点(0,0)とする座標を返します。
画像全体の左上を原点とする座標に変換するには、サーチ結果にオフセット値を加算する必要があります。
対象画像:

1) 画像全体
GS2.fvc06_parts_window.png
2) 部分画像
GS2.fvc06_parts_result.png

出力結果:

[1]     1.556 msec
  867.000,  151.000,9999
[2]     1.036 msec
  867.000,  151.000,9999


ソースコード:

void SearchC2()
{
_tprintf(_T("%s\n"), __TFUNCTION__);
// 対象画像の読み込み.
FVCL::Data::CFvImage src( _T(".\\fvc06_full.png") );
// パタン生成.
FVCL::Data::CFvImage pat( _T(".\\fvc06_pattern.png") );
FVCL::Data::CFvPoint offset(0, 0);
// インスタンスの準備.
parser.Open();
parser.SetResult( &result );
parser.GetParam().SetCount( 1 );
parser.GetParam().SetThresholdMid( 5000 );
parser.GetParam().SetThresholdFinal ( 8000 );
parser.GetParam().SetEdgeDetect( false );
parser.GetParam().SetReverseMode( false );
parser.GetParam().SetFirstUnit( 1 );
parser.GetParam().SetLastUnit( 0 );
// 1) 処理範囲指定.
{
src.SetWindow( 756, 127, 354, 74 );
// 画像とパタンの設定.
parser.SetSrcImage( 0, &src );
parser.SetPattern( &pattern );
result.Clear();
watch.Start();
parser.Execute();
double msec = watch.Stop();
// --- 確認.
_tprintf(_T("[1] %9.3f msec\n"), msec);
if (result.GetCount() > 0)
{
FVCL::GS2::CFvGS2Data data(result[0]);
_tprintf(_T("%9.3f,%9.3f,%04d\n")
, data.GetPosition().x
, data.GetPosition().y
, data.GetScore()
);
}
}
// 2) FIE チャイルド画像指定.
{
// 部分画像の生成.
FVCL::Rectangle window( 756, 127, 354, 74 );
FVCL::Data::CFvImage part( src.GetFIE(), 0, window );
// 画像とパタンの設定.
parser.SetSrcImage( 0, &part );
parser.SetPattern( &pattern );
result.Clear();
watch.Start();
parser.Execute();
double msec = watch.Stop();
// --- 確認.
_tprintf(_T("[2] %9.3f msec\n"), msec);
if (result.GetCount() > 0)
{
FVCL::GS2::CFvGS2Data data(result[0]);
_tprintf(_T("%9.3f,%9.3f,%04d\n")
, data.GetPosition().x + window.X
, data.GetPosition().y + window.Y
, data.GetScore()
);
}
}
}

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