2011年1月27日木曜日

[LabVIEW]NI-IMAQを使わないで動画再生&静止画キャプチャ その3

前回のエントリでは、[IBasicVideo.GetCurrentImage()]メソッドによるキャプチャでしたが、
今回は[SampleGrabber]フィルタによるキャプチャを行ってみます。

作ったダイアグラムはコレ、はいドンw
デカっw もう自分でも何の言語で何を書いてるのか分からなくなってきましたw

各部の説明をしていくと、

まず、[SampleGrabber]インスタンスを作成し、[AMMediaType]を使って動画形式を設定します。

次に、[FilterGraph]を作成し、先ほど作った[SampleGrabber]をフィルターとして追加した後に、動画ファイルを与えてRenderFile()でフィルターグラフを生成させます。

フィルターグラフ生成後に、[SampleGrabber]のグラブ設定(バッファ有り・ワンショット無し・コールバック無し)と、グラブに必要なバッファーサイズを取得しています。取得されたサイズを持つ連続したメモリ空間を.NETオブジェクトとして、1バイト整数配列をLabVIEWで作成します。

この部分はこれまで同様に、フロントパネル内PictureBoxへの再生表示です。


ここがキャプチャ部分。[ISampleGrabber.GetCurrentBuffer()]メソッドに、先ほど作成した連続メモリ空間のポインターを渡して画像データを取得し、そのメモリ空間をLabVIEW配列にコピーしてやります。
コピーされたLabVIEWの配列の中には、画像を構成するピクセルが、RGB各1バイトずつ計3バイトでズラーっと格納されます(並び順は前回の[GetCurrentImage()]と同じく一番下のピクセル列から上に向かって)。この配列を4バイトRGBの配列に変換し、2次元化の後にピクチャーに変換しています。

この例では配列反転をしていませんので、得られるピクチャーは上下が反転したものになります。

前回作った[GetCurrentImage]のものと動作を比較すると、
[SampleGrabber]を使った今回のもののほうが若干動作が軽い気がします。


~~~

さて、次回はUSB接続Webカメラのプレビュー表示です
…といきたいところですが、そろそろ仕事がヤバげなので、
どうなるか不明ですw

0 件のコメント:

コメントを投稿