フレームフィルタ
フレームフィルタを使うことによって、多様かつ効果的な画像データの編集が可能となります。他の機能に加えて、フレームフィルタは動画フォーマットの変更や変換、画像処理の実装、またどのフレームを処理するかの指定することもできます。
概要
他のDirectShow ライブラリとは違って、IC Imaging ControlのフレームフィルタはDirectShowのそれとは異なります。しかし画像ストリームの処理を行うDirectShowスレッドのコンテキスト内で実行されるため、プログラマーはDirectShowフィルタモジュールを作成する際の面倒な作業、e.g.フィルタの登録やパラメータのためのインターフェース定義から解放されます。フレームフィルタはフィルタモジュールの一部としてC++内に実装されます。それらはモジュールからOCXによりオンデマンドでロードされ、画像ストリーム上の3カ所に挿入することも可能です。フレームフィルタは画像処理能力においては基本的にDirectShowフィルタと同程度のパフォーマンスを発揮しながら、より簡単に実装が可能となっています。VB6ではフレームフィルタ、フレームフィルタモジュールの実装はできません。VB.NETとC#のみプログラムの一部として実装が可能となっております。なおフレームフィルタモジュールを作成する場合には C++を使う必要があります。
フィルタカテゴリー
フレームフィルタの機能によって、新しいIC Imaging Controlベースで多種多様なアプリケーションの作成が可能となりました。この新しい機能をつかってどういったことができるかを紹介するために、フレームフィルタと共に実装可能なタスクのカテゴリーについて説明します。それらのうちいくつかはIC Imaging Controlに標準で備わっています。
Gate: ゲートフィルタ | ゲートフィルタは不要なファイルを除去します。それは画像分析の結果やフレームカウント、タイムスタンプの情報に基づき決定され ます。 |
---|---|
Color Space Conversion: 色空間変換 | あるカラーフォーマットから他のフォーマットへの変換は全てこのカテゴリーに属します。また、ピクセル深度の低減e.g.10または12ビットのモノクロのフォーマットから8ビット分だけを抽出するというようなことも色空間変換とみなされます。ピクセル深度の低減は10,12ビットのモノクロ画像を表示するのに使用されます。色空間変換の例としてはstdfilters.ftfにあるDeBayerフィルタIC Imaging Controlスタンダードフィルタ>DeBayerフィルタがあげられます。BayerフォーマットのRawカラーデータをRGBに変換するフィルタです。 |
ROI: Region Of Interest (関心領域) | このカテゴリーのフィルタは画像ストリームにおけるROI(関心領域)だけを切りだすことができます。stdfilters.ftf内にあるROI フィルタIC Imaging Controlスタンダードフィルタ>ROI (関心領域)フィルタはこの機能を実装します。 |
Rotation: 回転・反転 | このカテゴリーは画像の回転や反転を含みます。stdfilters.ftf内にあるRotate Flip フィルタIC Imaging Controlスタンダードフィルタ>Rotate Flip(回転・反転) フィルタは90度、180度、270度の回転と、水平、垂直軸での反転を可能にします。DemoFilter.ftf内にあるデモ用フィルタを使ってどのアングルにでも回転させることが可能ですが、あくまでデモの実装であり動作はかなり遅くなってしまいます。 |
Scaling: スケーリング | スケールのアップ、ダウンは監視アプリケーション用などに使われる際にディスプレイのサイズやデータストレージの容量に合わせて調整する時に使用されます。 |
Sink: シンクフィルタ | シンクフィルタはデータの行きつく先です。画像ストリームをTransformメソッドにおいて完全に処理をして、IC Imaging Controlシンクにはフレームを送りません。専門的で高度なコーデックを使用したい場合にはシンクフィルタを実装してそのコーデックのAPIを組み込むといいでしょう。大抵の専門的なコーデックはDirectShowコーデックではなくDLLであるためこの方法が必要になります。これらのコーデックは画像データを圧縮すると同時にファイルに書き込む機能を持つため、シンクは使われなくなっています。 もちろんFrameHandlerSinkのImageBuffersを使って画像データにアクセスし、コーデックのAPIに送ることも可能です。その場合、画像データはシンクによってImageBuffersにコピーされているでしょう。フレームフィルタを使用してコーデックを連結すればこのようなことはありません。言い換えればこのシンクフィルタを使用することでフレームごとにコピーする処理を省くことができるため、特に容量の大きなフレームを扱っている場合には劇的にパフォーマンスを向上させることが可能です。 |
Extraction: 抽出フィルタ | 抽出フィルタは画像ストリームより特定のフレームだけを取り出し処理を行います。e.g.画像ファイルとしてディスクに保存するなど。画像ストリーム自体に変化が加えられることはなく、そのままシンクに送られます。MediaStreamSinkクラスライブラリリファレンス>クラス>MediaStreamSinkが圧縮された映像ファイルを作るのに対してこのフィルタは特定の画像を非圧縮で保存します。 |
Image Processing: 画像処理 | 一つの画像だけを出力する画像処理機能は全て、フレームフィルタを使うことで簡単に実装が可能です。複数の画像を生成するための機能に関しては特別に仕様を開発する必要があります。一つの方法としてはできあがった画像に出力画像を順番に書き込んでいくというものです。その機能によって画像ではなくデータが生成される場合(e.g.ブロブ解析によってつくられたデータ)、アプリケーションはフィルタパラメータを使うことでこのデータを出力します。 |
Buffer Format Conversion: バッファフォーマット変換 |
ほとんどの画像処理ライブラリは特殊なイメージバッファフォーマットを持っています。フレームフィルタは画像ストリームのイメージバッファをそういった特殊なフォーマットに変換するのにも使用できます。そうすることで FrameHandlerSinkクラスライブラリリファレンス>クラス>FrameHandlerSinkのリングバッファの要素が特殊なフォーマットのデータを含むことになります。よってこれらのバッファのデータを対応する画像処理ライブラリに直接渡されるようにすることができ、コピーする処理が省かれるため、システムの処理能力を向上させることになります。 |
既存のフレームフィルタを使用する
先ほど説明したように、フレームフィルタはアプリケーション内に直接作成したり、フィルタモジュールよりロードすることが可能です。IC Imaging Controlはstdfilters.ftfモ ジュールに数種類かのフィルタを備えています。 現在利用可能な全フィルタモジュールにあるフレームフィルタの一覧を見たい場合はICImagingControl.FrameFilterInfosクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.FrameFilterInfos Propertyを参照してください。ICImagingControl.FrameFilterPathクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.FrameFilterPath Propertyプロパティを使って、追加のフィルタモジュール用パスを指定することも可能です。ICImagingControl.FrameFilterCreateクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.FrameFilterCreate Methodへの呼び出しが一覧リストから選択されたフィルタのインスタンスを作成します。フィルタフレームインスタンスを取得できましたので、これを画像ストリーム上にある以下の3カ所に挿入することができます。
- デバイスの後ろ : DeviceFrameFiltersクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.DeviceFrameFilters Property
- ディスプレイの前 : DisplayFrameFiltersクラスライブラリリファレンス>クラス>ICImagingControl>ICImagingControl.DisplayFrameFilters Property
- シンクの前 : MediaStreamSink.FrameFiltersクラスライブラリリファレンス>クラス>MediaStreamSink>MediaStreamSink.FrameFilters Property, FrameHandlerSink.FrameFiltersクラスライブラリリファレンス>クラス>FrameHandlerSink>FrameHandlerSink.FrameFilters Property
同じインスタンスのフレームフィルタを画像ストリーム上の複数箇所で使用しないでください。内部不整合を引き起こす可能性があります。特に
FrameFilterImpl.NotifyStartクラスライブラリリファレンス>クラス>FrameFilterImpl>FrameFilterImpl.NotifyStart Method
と FrameFilterImpl.NotifyStopクラスライブラリリファレンス>クラス>FrameFilterImpl>FrameFilterImpl.NotifyStop Method
を使用している場合には注意してください。もし同じフィルタを複数個所に挿入する必要がある場合、別のインスタンスを使うようにしてくださ
い。
フレームフィルタの内部データはパラメータインターフェースからアクセスすることができます。以下にあげるメソッドを使用することで、基本的
なデータ型(book, long, float,
string)のフィルタからの読み取り、またはフィルタへの書き込みが可能となります。
FrameFilter.SetIntParameterクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.SetIntParameter Method,
FrameFilter.GetIntParameterクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.GetIntParameter Method,
FrameFilter.SetBoolParameterクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.SetBoolParameter Method,
FrameFilter.GetBoolParameterクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.GetBoolParameter Method,
FrameFilter.SetStringParameterクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.SetStringParameter Method,
FrameFilter.GetStringParameterクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.GetStringParameter Method,
FrameFilter.SetFloatParameterクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.SetFloatParameter Method,
FrameFilter.GetFloatParameterクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.GetFloatParameter Method,
バイナリデータのブロックはFrameFilter.SetDataParameterクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.SetDataParameter MethodとFrameFilter.GetDataParameterクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.GetDataParameter Method
メソッドを使用することでフレームフィルタと交換することができます。この方法はDirectShow
スレッドの中で実行されるため、フィルタデータへの外部アクセスと内部アクセスを同期させることがとても重要になります。よって上記で述べた4つのメソッドへのコールの前にFrameFilter.BeginParameterTransferクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.BeginParameterTransfer Methodへのコールが、それに続いてFrameFilter.EndParameterTransferクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.EndParameterTransfer Methodへのコールが行われる必要があります。
フレームフィルタをFilterInspectorプログラマーズガイド>フィルタインスペクタのような包括的アプリケーションで使用する場合、パラメータが双方向的に変更されるようダイアログを実装されることが望まれます。フレームフィルタはFrameFilter.HasDialogクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.HasDialog Propertyメソッドにおいてtrue を返すことでパラメータダイアログの提供を示唆します。FrameFilter.ShowDialogクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.ShowDialog Methodメソッドがコールされるとダイアログが表示されるはずです。
フレームフィルタの設定を残しておきたい時はFrameFilter.FilterDataクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.FilterData Property
プロパティを使用します。 直接ファイルに保存する場合は FrameFilter.SaveFilterDataクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.SaveFilterData MethodとFrameFilter.LoadFilterDataクラスライブラリリファレンス>クラス>FrameFilter>FrameFilter.LoadFilterData Methodメソッドを使用します。
フレームフィルタの作成
Visual Studio .NET では、ウィザードを使うことによって簡単なマウス操作だけでフレームフィルタの作成が可能です。 詳細は プロジェクト ウィザード for Visual Studioをご参照ください。ウィザードがどういったものかを理解したいというのであれば、フレームフィルタを記述する: 2値化プログラマーズガイド>フレームフィルタの記述: 二値化処理 において詳細を段階的に説明しております。