コンセプトとコンポーネント
ここではIC Imaging Controlを構成する各機能の説明とライブラリの基本的コンセプトに関して説明します。
概要
IC Imaging ControlはMicrosoft社のDirectShowに対応したAPIであり、ハードウェアへの非依存性をもつことでさらに手軽にDirectShowを活用することができるようになります。IC Imaging Controlによる抽象化の実装はフレームグラバー(画像取り込み)に精通したプログラマーに向けられています。言い換えれば、IC Imaging Control はDirectShow をフレームグラバーのように機能させるのです。
基本コンポーネント
フレームグラバーと同じような働きをするものを構築するという性質上、IC Imaging Controlは主に入力や動画フォーマット、画像取り込みを制御するためのメソッドを提供します。これらは通常のフレームグラバーAPI群にも含まれる典型的なものではありますが、IC Imaging Controlにはさらに以下のようなものも含まれます。
- ソフトウェア圧縮(AviCompressorクラスライブラリリファレンス>クラス>AviCompressor)を伴った画像ストリームファイル作成( MediaStreamSinkクラスライブラリリファレンス>クラス>MediaStreamSink, MediaStreamContainerクラスライブラリリファレンス>クラス>MediaStreamContainer )
- 直接的なイメージデータへのアクセス(IFrameQueueSinkListener.FramesQueuedクラスライブラリリファレンス>クラス>IFrameQueueSinkListener>FramesQueued Method) が可能な画像 バッファ(FrameQueueSinkクラスライブラリリファレンス>クラス>FrameQueueSink) の取り扱い
- プロパティやメソッドによって制御できるスクロールやズームのような高度な表示機能
ビデオキャプチャデバイスによってとらえられた画像データは連続するフレームであり、それが画像ストリームとなってデバイスからシンクに転送されます。ディスプレイが作動している場合、その画像ストリームは分岐され、シンクとディスプレイそれぞれに流れていくことになります。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にする
- FrameNotificationSinkクラスライブラリリファレンス>クラス>FrameNotificationSinkを 使い、Sinkに入ったフレームを直接呼び出して使用します。
- デバイスパス、またはシンクパスに余計なフレームフィルタをはさまないようにする
これらのことを実行することで画像データはIC Imaging Control や DirectShow によって編集されたりコピーされることがなくなります。