フィルターの適用
概要
このサンプルはライブ画像に画像処理のフィルタの適用を行っております。
ここではフレームフィルタモジュールである「stdfilters.ftf」と「Lenscorrection_32.ftf」を読み込み、それらのモジュールを適用することで画像をリアルタイムでライブ画像に適用しています。
なお、使用するフレームフィルタモジュールである「stdfilters.ftf」と「Lenscorrection_32.ftf」には下記のフィルタが含まれています。
DeBayer | ディベイヤ処理:Raw画像データをRGBに変換します。 |
---|---|
DeNoise | ディノイズ処理:複数の画像データの平均化によるノイズ除去。 |
ROI | 関心領域(Region of Interest)指定しての画素切り出し。 |
Rotate Flip | 画像を回転、反転させる。 |
Bayer to Y800 | BY8 を Y800 に変換。 |
ケラレ | 画像の周辺減光を補正します。 |
---|---|
射影ゆがみ | レンズ収差を補正します。 |
サンプルプログラム
Software | IC Imaging Control 3.5, Visual Studio™ 2019 |
---|---|
サンプル(C#) | filter_inspector_cs_3.5.zip |
サンプル(VB.NET) | filter_inspector_vb_3.5.zip |
フレームフィルタモジュール
ケラレ・射影歪み補正 モジュール |
lenscorrection_ic3.5.zip |
---|
上記のzipファイルを解凍し、下記のように各ファイルをFilter Inspector.exeと同じフォルダに置いてください。
※「stdfilters.ftf」は標準でIC Imaging Control3.5にインストールされていますので新たに「stdfilters.ftf」をダウンロードする必要はありません。
実行結果
Visual Studioのプログラム上ではすでにボタンの設置や関数は定義済ですので、IC Imaging Contorl3.5をインストールされていれば、実行ボタンだけですぐにデバッグで動作確認することができます。
画面にあるそれぞれのボタンなどのコントローラの機能は下記の通りです。
[Device]ボタン | デバイスダイアログの表示します。 |
---|---|
[Properties]ボタン | デバイスプロパティダイアログの表示します。 |
[Start Live]ボタン | ライブストリームを停止します。 |
[Stop Live]ボタン | ライブストリームを開始します。 |
[Frame Filter Modules]リストボックス | フレームフィルタモジュール「stdfilters.ftf」を読み込みます。 |
[Frame Fileters]リストボックス | フレームフィルタモジュール「stdfilters.ftf」内にあるフィルタを表示します。 |
"groupBox1"グループ内の[Dialog]ボタン | [Frame Fileters]リストボックスで選択したフィルタの項目を設定する ダイアログを呼び出します。 |
"groupBox1"グループ内の[Remove]ボタン | [Frame Fileters]リストボックスで選択したフィルタを解除します。 |
初期設定時
private void Form1_Load(object sender, EventArgs e)
{
//デバイスの選択
if ( !icImagingControl1.LoadShowSaveDeviceState("lastSelectedDeviceState.xml") )
{
MessageBox.Show("No device was selected.", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();
return;
}
// カメラの設定した解像度に合わせて表示画面を変更
icImagingControl1.LiveDisplayDefault = false;
icImagingControl1.LiveDisplaySize = icImagingControl1.Size;
// すべてのオーバーレイを無効にして、画像ストリームのカラー形式に影響を与えないようにします。
icImagingControl1.OverlayBitmapPosition = TIS.Imaging.PathPositions.None;
// ライブストリーミング開始
icImagingControl1.LiveStart();
// コレクションを利用して、フレームフィルタモジュール「stdfilters.ftf」へのフルパスを保存します。
modulePathCollection = new System.Collections.Specialized.StringCollection();
// - フィルターのパスがモジュールパスコレクションに既に存在するかどうかを確認
// - ない場合は、モジュール名を"Frame Filter Modules"リスト ボックスに追加
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);
}
}
}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not IcImagingControl1.DeviceValid Then
IcImagingControl1.ShowDeviceSettingsDialog()
If Not IcImagingControl1.DeviceValid Then
Close()
Return
End If
End If
'カメラの設定した解像度に合わせて表示画面を変更
IcImagingControl1.LiveDisplayDefault = False
IcImagingControl1.LiveDisplaySize = IcImagingControl1.Size
' すべてのオーバーレイを無効にして、画像ストリームのカラー形式に影響を与えないようにします。
IcImagingControl1.OverlayBitmapPosition = TIS.Imaging.PathPositions.None
' ライブストリーミング開始
IcImagingControl1.LiveStart()
' コレクションを利用して、フレームフィルタモジュール「stdfilters.ftf」へのフルパスを保存します。
modulePathCollection = New System.Collections.Specialized.StringCollection
' - フィルターのパスがモジュールパスコレクションに既に存在するかどうかを確認
' - ない場合は、モジュール名を"Frame Filter Modules"リスト ボックスに追加
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
End Sub
フォームロードするタイミングの処理内容です。
フィルタを適用するためには、ライブストリーミング開始前にカメラから送られてくる画像に影響がないようにOverlayBitmapPositionプロパティでオーバーレイを無効化する必要があります。
[Frame Filter Modules]リストボックス選択時のイベントハンドラー
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);
}
}
}
Private Sub lstFrameFilterModules_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstFrameFilterModules.SelectedIndexChanged
' ModulePaths コレクションから選択したモジュールへのフルパスを取得します。
If lstFrameFilterModules.SelectedIndex >= 0 Then
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
End If
End Sub
リストボックスに表示されたフレームフィルタモジュール「stdfilters.ftf」を選択すると下記のロジックが実行されます。
フレームフィルタモジュール「stdfilters.ftf」内にあるフィルターが[Frame Fileters]リストボックスに表示しており、ICImagingControl.FrameFilterInfosプロパティよりFrameFilterInfoオブジェクトを含むリストを返します。これによって、FrameFilterInfoオブジェクトはフレームフィルタモジュール「stdfilters.ftf」よりロードして利用できるフレームフィルタを表示します。
[Frame Fileters]リストボックス選択時のイベントハンドラー
private void lstFrameFilters_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
// 選択した FrameFilterInfo オブジェクトを取得
TIS.Imaging.FrameFilterInfo ffi = (TIS.Imaging.FrameFilterInfo)lstFrameFilters.SelectedItem;
if (ffi != null)
{
// FrameFilterをインスタンス化
TIS.Imaging.FrameFilter newFrameFilter = TIS.Imaging.FrameFilter.Create(ffi);
// ライブストリーミング開始されていれば停止
bool wasLive = icImagingControl1.LiveVideoRunning;
if (wasLive)
{
icImagingControl1.LiveStop();
}
// フレームフィルターフィルタをセット
// フレームフィルターを追加
icImagingControl1.DeviceFrameFilters.Clear();
icImagingControl1.DeviceFrameFilters.Add(newFrameFilter);
// ライブストリーミングしていれば再度開始
if (wasLive)
{
icImagingControl1.LiveStart();
}
// >>
lblSelectedFilter.Text = newFrameFilter.Name;
btnDialog.Enabled = newFrameFilter.HasDialog;
btnRemove.Enabled = true;
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message);
}
}
Private Sub lstFrameFilters_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstFrameFilters.SelectedIndexChanged
' 選択した 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)
' ライブストリーミング開始されていれば停止
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
lblSelectedFilter.Text = newFrameFilter.Name
btnDialog.Enabled = newFrameFilter.HasDialog
btnRemove.Enabled = True
End If
End Sub
[Frame Filter Modules]リストボックスよりフィルタモジュール「stdfilters.ftf」を選択すると、下記のイベントハンドラが呼び出され、[Frame Fileters]リストボックス内にそのモジュールが持っているフィルタ名が入ります。フィルタリストよりフレームフィルタをクリックすると、ListBox.ItemDataによって選択された項目の項目データが読みだされます。すでにフィルタのインデックスをフィルタリストに格納しているので、この番号を使ってICImagingControl.FrameFilterInfosのFrameFilterInfoを選択することができます。
選択フレームフィルタをセットするためにはライブモードを停止する必要がありますので、一度ライブストリームを停止します。
その後、DeviceFrameFiltersプロパティに新しいフレームフィルタを追加したのちにダイアログを呼び出します。
下記のAPIリファレンスマニュアルにもその他関数などの説明があります。
プログラマーズガイド:フィルタインスペクタ
IC Imaging Control_Ver3.5(C#/VB.NET) APIリファレンスマニュアル