2011年1月27日木曜日

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

前回のエントリでは、LabVIEWフロントパネル内で動画を再生しました。

では、ここから静止画キャプチャを行ってみましょう。

DirectShowでの静止画キャプチャには、
  1. [IBasicVideo.GetCurrentImage()]メソッドによるキャプチャ
  2. [SampleGrabber]フィルタによるキャプチャ
の2種類がありますが、今回は

・ [IBasicVideo.GetCurrentImage()]メソッドによるキャプチャ

の実装を行ってみます。



以下がサンプルと実行画面です。


簡単にブロックダイアグラムを説明しますと、
  • 1段目、2段目は前回のエントリと同じ
  • 3段目は、[IBasicVideo.GetCurrentImage()]メソッドで取得するデータを保存しておく配列(4バイト整数)を確保しています。 LabVIEW側で作った配列を渡せれば楽チンなんですが、出来ませんので .NETオブジェクトで作っています。作った配列のポインタを渡すために、GCHandleを使って細工しています。
  • 一番下の段がキャプチャ部分です。[IBasicVideo.GetCurrentImage()]メソッドを呼んだ後に配列操作をするよう、エラーワイヤで明示的に順序付けしています。
  • [IBasicVideo.GetCurrentImage()]メソッドに配列のポインターを渡した後、配列を.NETオブジェクトからLabVIEWの4バイト整数配列にバリアント経由で変換し、ヘッダ40バイト取り除いて、画像データ部分をピクチャーに変換しています。
  • 画像データはDIB形式なんですが、なぜか一番下のピクセル列から上に向かって格納されていて、そのピクセル色情報バイトもBGR順になっています。なので、[1D配列反転]を使って反転させてから2次元化→ピクチャー変換することで、正しい色にしています(その代わり画像の左右が反転します)。
  • 上記画像の左右反転の対処は、LabVIEWで高速に行なうロジックを思いつきませんw .NET上でDIB→Bitmap変換と左右反転をしてからLabVIEWへ持ってくるほうがイイでしょうかね?
次は、[SampleGrabber]フィルタによるキャプチャをやってみます。

0 件のコメント:

コメントを投稿