フィルタインスペクタ

ここでは基本的な画像処理を施すためのフレームフィルタの使用方法について説明します。
以下の手順について紹介します。

  • 利用可能なフレームフィルタの列挙(エニュメレート)
  • フレームフィルタ・インスタンスの作成
  • フレームフィルタを使ってライブ画像に画像処理をかける

今回のサンプルプログラムのC#用のソースコードはMy Documents/IC Imaging Control 3.5内の以下のディレクトリに格納されています。

samples\C# *\Filter Inspector

サンプルを使用する

ダイアログボックスの左側に2つのリストボックスがあり、上のボックスはIC Imaging Controlで検出された全フィルタモジュールを表示します。このリスト内のフィルタモジュールを選択すると、下のボックスに選択されたモジュールよりロード可能なフレームフィルタが表示されます。

2つ目のリストボックス内のフレームフィルタのいずれかをクリックすると、それがデバイスパス技術関連項目>コンセプトとコンポーネントに挿入されます。
これでダイアログボックス右側のライブ画像にフレームフィルタの効果が表れるはずです。
Dialog... ボタンをクリックして選択したフィルタのプロパティダイアログを表示できます。
新しいフィルタを選択した場合、前のフィルタは除去され新しいフィルタが使用されます。
画像取り込みデバイスからの画像データをそのまま見たい場合にはRemoveボタンを押してください。

初期化

Form_Loadイベントで、ICImagingControlクラスライブラリリファレンス>クラス>ICImagingControlを初期化します。デバイスが選択されていない場合、ShowDeviceSettingsDialogクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.ShowDeviceSettingsDialog Method がデバイス選択用のダイアログを表示します。ここで重要なのはグラフィックオーバレイを完全に無効化し、フレームフィルタが使用する可能性のあるカラーフォーマットとの干渉を避ける事です。
ですのでICImagingControl.OverlayBitmapPositionクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.OverlayBitmapPosition PropertyPathPositions.Noneクラスライブラリリファレンス>エニュメレーション(列挙)>refenum.PathPositionsに 設定します。

[C#]
if ( !icImagingControl1.LoadShowSaveDeviceState("lastSelectedDeviceState.xml") )
{
    MessageBox.Show("No device was selected.", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
    this.Close();
    return;
}
// オーバレイを全て無効にしてストリームのカラーフォーマットへの影響を なくす
icImagingControl1.OverlayBitmapPosition = TIS.Imaging.PathPositions.None;
// ライブモードの開始
icImagingControl1.LiveStart();

利用可能なフレームフィルタの列挙(エニュメレート)

フレームフィルタの一覧を取得するためにFrameFilterInfo.FrameFilterInfosクラスライブラリリファレンス>クラス>FrameFilterInfo>FrameFilterInfo.FrameFilterInfos Propertyを使います。これがFrameFilterInfoクラスライブラリリファレンス>クラス>FrameFilterInfoオブジェクトのコレクションを返します。

検出されたフィルタを持つファイル名をリストボックスに入れていくために、フィルタのモジュールパスをModulePathsに入れていくと同時に各フィルタを見てそのモジュール名をリストに追加していきます。すでにモジュールパスがコレクションにある場合にはモジュール名は追加されません。

[C#]
// フィルタモジュールへのフルパス の保存にコレクションを使う
modulePathCollection = new System.Collections.Specialized.StringCollection();
// 各フィルタごとに
// - フィルタのパスがすでにモジュールパスコレクションにあるかどうかをチェック
// - なかった場合はモジュール名をフィルタモジュールリストに追加する
foreach (TIS.Imaging.FrameFilterInfo ffi in Tis.Imaging.FrameFilterInfo.FrameFilterInfos)
{
     if (modulePathCollection.IndexOf(ffi.ModulePath) < 0)
     {
         lstFrameFilterModules.Items.Add(ffi.ModuleName);
         modulePathCollection.Add(ffi.ModulePath);
     }
}

リストボックスよりフィルタモジュール名を選択すると、イベントハンドラが呼び出され、2つ目のボックス内にそのモジュールが持っているフィルタ名が入ります。

[C#]
private void lstFrameFilterModules_SelectedIndexChanged(object sender, EventArgs e)
{
     // ModulePaths コレクションより選択されたモジュールのフルパスを取得
     string selectedModulePath = modulePathCollection[lstFrameFilterModules.SelectedIndex];
     lstFrameFilters.Items.Clear();
     foreach (TIS.Imaging.FrameFilterInfo ffi in TIS.Imaging.FrameFilterInfo.FrameFilterInfos)
     {
         if (ffi.ModulePath == selectedModulePath)
         {
             lstFrameFilters.Items.Add(ffi);
         }
     }
}

ループが指定されたモジュールよりロードされた全てのフレームフィルタをリストボックスに入れていきます。オリジナルのフィルタリスト(FrameFilterInfo.FrameFilterInfosクラスライブラリリファレンス>クラス>FrameFilterInfo>FrameFilterInfo.FrameFilterInfos Propertyより取得したもの)内に追加されたフィルタのインデックスはListBox.ItemDataを設定することでリストボックスの項目データに格納されます。これでユーザーがその項目をクリックしたときにフィルタがみつかるようになります。

フレームフィルタ・インスタンスの作成

ユーザーがフィルタリストよりフレームフィルタを選択すると、ListBox.ItemDataによって選択された項目の項目データが読みだされます。すでにフィルタのインデックスをフィルタリストに格納しているので、この番号を使ってFrameFilterInfo.FrameFilterInfosクラスライブラリリファレンス>クラス>FrameFilterInfo>FrameFilterInfo.FrameFilterInfos PropertyFrameFilterInfoクラスライブラリリファレンス>クラス>FrameFilterInfoを選択することができます。

[C#]
// 選択された FrameFilterInfoオブジェクトの取得
TIS.Imaging.FrameFilterInfo ffi = (TIS.Imaging.FrameFilterInfo)lstFrameFilters.SelectedItem;
if (ffi != null)
{
     // 新しい FrameFilterインスタンスの作成
     TIS.Imaging.FrameFilter newFrameFilter = TIS.Imaging.FrameFilterCreate(ffi);
}

フレームフィルタのインスタンスはFrameFilterInfoクラスライブラリリファレンス>クラス>FrameFilterInfoオブジェクトをパラメータとしてFrameFilterCreateクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.FrameFilterCreate Methodをコールすることで生成されます。

フレームフィルタをセットする

フレームフィルタをアクティブにするためにはICImagingControlクラスライブラリリファレンス>クラス>ICImagingControlオブジェクトで登録する必要があります。ICImagingControl.DeviceFrameFiltersクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.DeviceFrameFilters Propertyコレクションがクリアされ、新しいフィルタが挿入されます。デバイスフレームフィルタが画像取り込みデバイスより送られて来る画像データを処理するのに使われます。
[C#]
// ライブモードである場合は停止する
bool wasLive = icImagingControl1.LiveVideoRunning;
if (wasLive)
{
     icImagingControl1.LiveStop();
}
// 新しいフレームフィルタをセットする
icImagingControl1.DeviceFrameFilters.Clear();
icImagingControl1.DeviceFrameFilters.Add(newFrameFilter);
// ライブモードがアクティブであった場合、再スタートする
if (wasLive)
{
     icImagingControl1.LiveStart();
}

フレームフィルタをセットするためにはライブモードを停止する必要があります。