フィルタモジュールの作成
ここではライブ画像に2値化処理を実行するフレームフィルタの作成方法について説明します。
以下の処理の手順について紹介します。
- フィルタモジュール作成のためのVisual Studio プロジェクトをセットアップする
- フィルタモジュールからロードできるフレームフィルタクラスを作成する
- フレームフィルタにダイアログを追加する
Visual Studio プロジェクトとフレームフィルタモジュールは IC Imaging Controlインストールディレクトリのsamples\VC\DemoFiltersにあります。
ここではフレームフィルタを記述する: 2値化プログラマーズガイド>フレームフィルタの記述: 二値化処理フレームフィルタの記述: 二値化内で作成されたフィルタを使用します。フレームフィルタの実装についてはこのページをご覧ください。
フレームフィルタクラスの実装
ではフレームフィルタを記述する: 2値化プログラマーズガイド>フレームフィルタの記述: 二値化処理フレームフィルタの記述: 二値化で作成した二値化フィルタをフィルタモジュール内で動作するように拡張したいと思います。
フィルタをロードするジェネリックアプリケーションはフィルタのインターフェース ( CBinarizationFilter::enableやCBinarizationFilter::setThresholdメソッド)を知っています。そのプログラムからフィルタパラメータを設定するためにIFrameFilterクラスライブラリリファレンス>クラス>IFrameFilterやFrameFilterImplクラスライブラリリファレンス>クラス>FrameFilterImplにはジェネリックフィルタインターフェースが実装されております。アプリケーションはIFrameFilter::getAvailableParametersクラスライブラリリファレンス>クラス>IFrameFilter>IFrameFilter::getAvailableParameters Methodを使ってフィルタが対応しているパラメータを見つけ出し、IFrameFilter::setParameterクラスライブラリリファレンス>クラス>IFrameFilter>IFrameFilter::setParameter Methodをコールすることでパラメータの値を変更します。
二値化フィルタをそれらのパラメータに対応させるには、FrameFilterImpl::addBoolParamクラスライブラリリファレンス>クラス>FrameFilterImpl>FrameFilterImpl::addBoolParam Methodか他のパラメータ登録メソッドを使用する必要があります。2つのパラメータを登録するためCBinarizationFilterのコンストラクタを拡張します。
CBinarizationFilter::CBinarizationFilter()
: m_bEnabled( false ),
m_threshold( 127 )
{
// 二値化の有効/無効化を設定するため の 'enable' パラメータの追加
addBoolParam( "enable", &CBinarizationFilter::getEnable, &CBinarizationFilter::setEnable );
// 二値化の際のしきい値設定のための 'threshold' パラメータの追加
addLongParam( "threshold", &CBinarizationFilter::getThreshold, &CBinarizationFilter::setThreshold );
}
登録関数の最初のパラメータは、アプリケーションがそのパラメータにアクセスするための名前となります。
2番目と3番目のパラメータはCBinarizationFilterのメンバ関数の名前
となります。以下のコードによって古いenableとsetThreshold
メソッドを新しいものに入れ替えます。
public:
// 二値化の有効/無効化
DShowLib::tFilterError getEnable( bool& bEnable );
DShowLib::tFilterError setEnable( bool bEnable );
// 二値化の際のしきい値を設定
DShowLib::tFilterError getThreshold( long& threshold );
DShowLib::tFilterError setThreshold( long threshold );
private:
bool m_bEnabled;
int m_threshold;
};
これらのメソッドはフィルタをロードしたプログラムがsetParameter( "enable", true )、もしくはsetParameter( "threshold", 100 )をコールした時に呼び出されます。
実装はとても簡単です。
/*
* 二値化の状態を'enabled' として返す
*/
tFilterError CBinarizationFilter::getEnable( bool& bEnable )
{
bEnable = m_bEnabled;
return eNO_ERROR;
}
/*
* 二値化の状態を'enabled'に設定
*/
tFilterError CBinarizationFilter::setEnable( bool bEnable )
{
m_bEnabled = bEnable;
return eNO_ERROR;
}
/*
* 二値化のしきい値を返す
*/
tFilterError CBinarizationFilter::getThreshold( long& threshold )
{
threshold = m_threshold;
return eNO_ERROR;
}
/*
* 二値化のしきい値を設定
*/
tFilterError CBinarizationFilter::setThreshold( long threshold )
{
m_threshold = threshold;
return eNO_ERROR;
}
ジェネリックアプリケーションで動作するフィルタを作成したので、メソッドgetStaticFilterInfoを変更し、フィルタをeFC_GENERICとして宣言できるようにします。
FilterInfo CBinarizationFilter::getStaticFilterInfo()
{
// フィルタ名を返し、eFC_GENERICとして宣言する
FilterInfo fi = { L"Demo_Binarization", L"", eFC_GENERIC };
return fi;
}
フレームフィルタの登録
フィルタモジュールのメインファイルに移動し、FILTERDLL_BEGIN_EXPORTとFILTERDLL_END_EXPORTの間の部分にフィルタの名登録用のFILTERDLL_REGISTER_FILTERコードをいれていきます。
FILTERDLL_BEGIN_EXPORT()
FILTERDLL_REGISTER_FILTER(CRotateTransform)
FILTERDLL_REGISTER_FILTER(CDeNoiseTransform)
FILTERDLL_REGISTER_FILTER(CSnapFilter)
FILTERDLL_REGISTER_FILTER(CBinarizationFilter)
FILTERDLL_END_EXPORT()
フレームフィルタにダイアログを追加する
フィルタにユーザーインターフェースを追加するのにIFrameFilter::hasDialogクラスライブラリリファレンス>クラス>IFrameFilter>IFrameFilter::hasDialog MethodとIFrameFilter::callDialogクラスライブラリリファレンス>クラス>IFrameFilter>IFrameFilter::callDialog Methodメソッドをオーバーライドすることができます。
hasDialogのデフォルトの実装ではfalseを返すため、これをtrueに変更します。
bool CBinarizationFilter::hasDialog() const
{
return true;
}
callDialogの実装においてはIFrameFilter::getSettingsクラスライブラリリファレンス>クラス>IFrameFilter>IFrameFilter::getSettings Methodを使用して現在のフィルタ設定を保存します。そしてダイアログボックスを表示させることでフィルタのパラメータを変更できるようにします。もしユーザーがキャンセルボタンによってダイアログを閉じた場合、フィルタの設定が保存した値に戻ることになります。
bool CBinarizationFilter::callDialog( HWND hParent )
{
// セッティングの保存
std::string data = getSettings();
// モーダルダイアログの表示
// このインスタンスへのポインタをWM_INITDIALOGに渡す
INT_PTR result = DialogBoxParam( g_hInst,
MAKEINTRESOURCE(IDD_BINARIZATION_CONFIG),
hParent,
BinarizationConfigDlgProc,
(LPARAM)this );
// ユーザーが'cancel'をクリックした場合、セッティングを 戻す。
if( result == IDCANCEL )
{
setSettings( data );
}
// ダイアログが表示された時にtrueを返す
return result >= 1;
}