コンセプトとコンポーネント
ここではIC Imaging Controlを構成する各機能の説明とライブラリの基本的コンセプトに関して説明します。
概要
IC Imaging ControlはMicrosoft社のDirectShow に対応したAPIであり、ハードウェアへの非依存性をもつことでさらに手軽にDirectShow を活用することができるようになります。クラスライブラリによる抽象化の実装はフレームグラバー(画像取り込み)に精通したプログラマーに向けられています。言い換えれば、 IC Imaging ControlはDirectShow をフレームグラバーのように機能させるのです。
基本コンポーネント
IC Imaging Controlはフレームグラバーと同様の機能を構築することを念頭にしており、メインクラスがGrabberクラスライブラリリファレンス>クラス>Grabberと呼ばれるのもそのためです。 通常、フレームグラバーのAPIは入力、ビデオフォーマット、取り込みプロセスを制御する関数群から構成されています。だからこそGrabberクラスはこれらの機能をひとつの"ファットインターフェース"としてまとめて提供します。他にも各項目の列挙、指定を可能とする以下のクラスを備えています― VideoCaptureDeviceItemクラスライブラリリファレンス>クラス>VideoCaptureDeviceItem(デバイス)、VideoFormatItemクラスライブラリリファレンス>クラス>VideoFormatItem(ビデオ規格)、VideoFormatItemクラスライブラリリファレンス>クラス>VideoFormatItem(フォーマット)、AnalogChannelItemクラスライブラリリファレンス>クラス>AnalogChannelItem(入力チャンネル)。一般的なフレームグラバーAPI群と違い、IC Imaging Control は以下のようなクラスも備えています。
- 画像ストリームファイル作成のためのシンクコンセプト( MediaStreamSinkクラスライブラリリファレンス>クラス>MediaStreamSink, MediaStreamContainerクラスライブラリリファレンス>クラス>MediaStreamContainer )、 ソフトウェア圧縮 ( Codecクラスライブラリリファレンス>クラス>Codec )
- イメージバッファ用のシンクコンセプト ( FrameHandlerSinkクラスライブラリリファレンス>クラス>FrameHandlerSink )、リングバッファマネジメント ( MemBufferCollectionクラスライブラリリファレンス>クラス>MemBufferCollection, MemBufferクラスライブラリリファレンス>クラス>MemBuffer ) 、バッファのロックやコールバック ( GrabberListenerクラスライブラリリファレンス>クラス>GrabberListener )による画像データアクセス。
- Grabberクラスが提供するスクロールやズームといった高度な表示機能。
ビデオキャプチャデバイスによってとらえられた画像データは連続するフレームであり、それが画像ストリームとなってデバイスからシンクに転送されます。表示機能が動作している場合、その画像ストリームはシンクとディスプレイそれぞれに分岐し流れていくことになります。以下のY字型の画像ストリームはそれぞれこのように区分されています。
- デバイスパス : デバイスと分岐点の間の部分を指します
- ディスプレイパス: 分岐点とディスプレイの間の部分を指します
- シンクパス : 分岐点とシンクの間の部分を指します
上の図は画像データのフローを表しています。そして下の図は画像ストリームとクラスの関係性を表しています。
高度な処理を扱うコンポーネント
IC Imaging Controlは画像ストリーム上の別々の場所においてデバイスプロパティ、マルチプルオーバーレイ、フィルタチェインへの包括的なアクセスを提供します。
- 汎用的デバイスプロパティ:DirectShowではVideoProcAmpとCameraControlという2つの定義されたプロパティを使用しデバイス非依存型のコードを記述できますが、それに伴いかなりの制限があります。多くのビデオキャプチャデバイスはDirectShowが定義する数以上のプロパティを提供します。しかしプロパティ用に指定される値は意味を持っていません。 VCDProperties技術関連項目>VCDプロパティを使うことによって、IC Imaging Control は汎用的かつ拡張可能な方法によってそれらのプロパティを扱い、プロパティ値に意味を持たせることができます。
- マルチプルオーバレイ: クラス OverlayBitmapクラスライブラリリファレンス>クラス>OverlayBitmapは画像ストリーム上にあるデバイスパス、ディスプレイパス、シンクパスの3か所にオーバーレイを描く機能をを実装するものです。テキストや長方形、直線などのグラフィック要素用の各メソッド、またフレームベースのオーバーレイを描画するためのコールバックも同様に提供されます。
- フィルタチェイン: フィルタ、もしくはフィルタチェインを画像ストリーム上にあるデバイスパス、ディスプレイパス、シンクパスの3カ所に挿入することができます。フィルタはフレームフィルタと呼ばれ、動画フォーマットの変更や変換、画像処理の実装、またどのフレームを処理するかの指定することも可能です。さらに詳しい内容については フレームフィルタ技術関連項目>フレームフィルタをご参照ください。
パフォーマンス
上記で述べたように、 IC Imaging Control は画像ストリームの取り込みや表示をコントロールする上で非常に大きな働きをするコンポーネントを提供します。それゆえに高速で画像処理を行うアプリケーションとしては負荷が大きくなり向かないのではと思われるかもしれませんが、そういった心配はありません。IC Imaging Controlにおいて複雑なアプリケーション作成をサポートするための機能は全てOffにすることができ、画像処理のためにCPUに大きな負荷がかかるようなアプリケーションを使用する場合、それらの機能を調整することで画像処理にかかる負荷を低スペックのフレームグラバーやFireWireのライブラリと同程度にまで落とすことができます。内部の負荷を最小限に抑えるためには以下のことを実行する必要があります。
- ディスプレイの電源をOff にして、画像ストリームよりディスプレイパスを完全に取り除く
- デバイス用とシンク用に同じビデオ形式を指定して 自動的に色空間変換を行わないようにする
- 全てのオーバーレイをOffにする
- リングバッファの使用をやめる。画像処理を実装するフレームフィルタをシンクパスに挿入するか、画像フレームをシンクに送る代わりに サードパーティーの画像処理ライブラリとインターフェースで連動させる。
- デバイスパス、またはシンクパスに余計なフレームフィルタをはさまないようにする
これらのことを実行することで画像データはIC Imaging Control や DirectShowDoing によって編集されたりコピーされることがなくなります。下の図はこの設定における画像ストリームのレイアウトイメージです。