では、ここから静止画キャプチャを行ってみましょう。
DirectShowでの静止画キャプチャには、
- [IBasicVideo.GetCurrentImage()]メソッドによるキャプチャ
- [SampleGrabber]フィルタによるキャプチャ
・ [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へ持ってくるほうがイイでしょうかね?
0 件のコメント:
コメントを投稿