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