フィルタインスペクタ

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

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

今回のサンプルプログラムのVB.NET 、C#用のソースコードはMy Documents/IC Imaging Control 3.4内の以下のディレクトリに格納されています。
samples\VB *\Filter Inspector
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に設定します。

[VB.NET]
If Not IcImagingControl1.DeviceValid Then
     IcImagingControl1.ShowDeviceSettingsDialog()
     If Not IcImagingControl1.DeviceValid Then
         Close()
         Return
     End If
End If

' オーバレイを全て無効にして画像ストリームの
' カラーフォーマットへの影響をなくす
IcImagingControl1.OverlayBitmapPosition = TIS.Imaging.PathPositions.None

' ライブモードの開始
IcImagingControl1.LiveStart()
[C#]
if (!icImagingControl1.DeviceValid)
{
     icImagingControl1.ShowDeviceSettingsDialog();

     if (!icImagingControl1.DeviceValid)
     {
         Close();
         return;
     }
}

// オーバレイを全て無効にして画像ストリームの
// カラーフォーマットへの影響をなくす
icImagingControl1.OverlayBitmapPosition = TIS.Imaging.PathPositions.None;

// ライブモードの開始
icImagingControl1.LiveStart();

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

フレームフィルタの一覧を取得するためにICImagingControl.FrameFilterInfosクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.FrameFilterInfos Propertyを使います。これがFrameFilterInfoクラスライブラリリファレンス>クラス>FrameFilterInfoオブジェクトのコレクションを返します。
そして検出されたフィルタを持つファイル名をリストボックスに入れていきたいと思いますので、フィルタのモジュールパスをModulePathsにいれていくと同時に各フィルタを見てそのモジュール名をリストに追加していきます。すでにモジュールパスがコレクションにある場合にはモジュール名は追加されません。

[VB.NET]
' フィルタモジュールへのフルパスの保存にコレクションを使う
modulePathCollection = New System.Collections.Specialized.StringCollection

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

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

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

[VB.NET]
Private Sub lstFrameFilterModules_SelectedIndexChanged(ByVal sender As System.Object,
  ByVal e As System.EventArgs) Handles lstFrameFilterModules.SelectedIndexChanged
     ' ModulePaths コレクションより選択されたモジュールのフルパスを取得
      Dim selectedModulePath As String = modulePathCollection(lstFrameFilterModules.SelectedIndex)

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

     lstFrameFilters.Items.Clear();
     foreach (TIS.Imaging.FrameFilterInfo ffi in icImagingControl1.FrameFilterInfos)
     {
         if (ffi.ModulePath == selectedModulePath)
         {
             lstFrameFilters.Items.Add(ffi);
         }
     }
}

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

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

ユーザーがフィルタリストよりフレームフィルタを選択すると、ListBox.ItemDataによって選択された項目の項目データが読みだされます。すでにフィルタのインデックスをフィルタリストに格納しているので、この番号を使ってICImagingControl.FrameFilterInfosクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.FrameFilterInfos PropertyFrameFilterInfoクラスライブラリリファレンス>クラス>FrameFilterInfo を選択することができます。
[VB.NET]
' 選択されたFrameFilterInfoオブジェクトの取得
Dim ffi As TIS.Imaging.FrameFilterInfo = CType(lstFrameFilters.SelectedItem, TIS.Imaging.FrameFilterInfo)

If Not ffi Is Nothing Then
     ' 新しいFrameFilterインスタンスの作成
     Dim newFrameFilter As TIS.Imaging.FrameFilter = IcImagingControl1.FrameFilterCreate(ffi)
[C#]
// 選択されたFrameFilterInfoオブジェクトの取得
TIS.Imaging.FrameFilterInfo ffi = (TIS.Imaging.FrameFilterInfo)lstFrameFilters.SelectedItem;

if (ffi != null)
{
     // 新しいFrameFilterインスタンスの作成
     TIS.Imaging.FrameFilter newFrameFilter = icImagingControl1.FrameFilterCreate(ffi);

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

フレームフィルタをアクティブにするためにはICImagingControlクラスライブラリリファレンス>クラス>ICImagingControl オブジェクトで登録する必要があります。ICImagingControl.DeviceFrameFiltersクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.DeviceFrameFilters Property コレクションがクリアされ、新しいフィルタが挿入されます。デバイスフレームフィルタが画像取り込みデバイスより送られて来る画像データを処理するのに使われます。

[VB.NET]
' ライブモードである場合は停止する
Dim wasLive As Boolean = IcImagingControl1.LiveVideoRunning
If wasLive Then
     IcImagingControl1.LiveStop() End If

' 新しいフレームフィルタをセットする
IcImagingControl1.DeviceFrameFilters.Clear()
IcImagingControl1.DeviceFrameFilters.Add(newFrameFilter)

' ライブモードがアクティブであった場合、再スタートする
If wasLive Then
     IcImagingControl1.LiveStart()
End If
[C#]
// ライブモードである場合は停止する
bool wasLive = icImagingControl1.LiveVideoRunning;
if (wasLive)
{
     icImagingControl1.LiveStop();
}

// 新しいフレームフィルタをセットする
icImagingControl1.DeviceFrameFilters.Clear();
icImagingControl1.DeviceFrameFilters.Add(newFrameFilter);

// ライブモードがアクティブであった場合、再スタートする
if (wasLive)
{
     icImagingControl1.LiveStart();
}

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