この記事で扱っていること
- トリガを受ける前後の画像を動画として保存する方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
以前別の記事でトリガを受けた前後の画像を撮影するプログラムの例を紹介しました。
トリガを受けた以降の画像を保存するだけでなく、トリガ前の画像も指定枚数保存するというプログラムにしています。
本記事はこのプログラムを少し修正しトリガ前後の動画を撮影する場合を紹介します。
要は画像ファイルを出力する部分をAVI用の関数に置き換えてやるだけですが、もう少し改造を施すことができるのでその例も紹介していきます。
どんな結果になるか
フロントパネルにはカメラの指定を行う制御器と、作成するAVIファイルを保存するパス、そしてトリガが来る前にどの程度のフレーム数が必要かとトリガとなるブールボタンと停止ボタンを用意しています。
プログラム実行前にトリガ前のフレーム数を指定しておくことでその分のフレームを一時的にためておき、トリガが来るとそのためた画像をAVIファイルに書き込むとともにトリガ以降の画像も書き込んでいきます。
プログラムの構造
ベースの構造は以前、トリガ前後の画像を取得する方法を紹介したときのプログラムと同じです。撮影とAVIファイルへの出力(書き込み)を分けるために生産者消費者のデザインとしていますが、消費者ループの方はステートマシンの形式もとりいれています。
トリガが来る前の画像は2次元配列データとしてためておきます。2次元配列を複数ためておくために3次元配列を必要とするので配列初期化の関数で用意し、これを使いまわしていきます。
配列初期化で用意した画像配列用の3次元配列にどのように実際の画像の配列データを渡していくかについては部分配列置換の関数に対して「この要素を置換する」という指定をずらしてく必要があり、それをWhileループの反復端子と商&余りの関数との組み合わせで行っています。
この辺りの仕組みは動画ではなく画像にして出力するプログラムと全く同じで、そちらのプログラムを紹介した記事により詳細に仕組みを解説しています。もし興味がある方は本記事冒頭で紹介した画像出力の記事で確認してみてください。
なお、IMAQ AVI2 Createの関数に対してこの記事で紹介しているプログラムではCodecやFrames per secondを特に指定していませんが、必要に応じてこれらを指定する必要があります。
トリガがきたら、それまでためていた画像をAVIファイルに書き込んでいきます。この仕組みも画像出力のプログラムと全く同じにできます。
トリガ前の画像をAVIに書き込めたら後はプログラムが終了するまで、都度画像をAVIに書き込んでいけるようにします。
指定したフレーム数より少ない場合
トリガ前のフレーム数として指定した数を得られる前にトリガを受けた場合のプログラム側の対応としては、もし開始ボタンを押すことをトリガとしている場合には「そもそもトリガとなる開始ボタンを押せないようにする」方法があります。
それ以外の方法では、指定フレームより少なくても柔軟に対応しそれらのフレームをAVIファイルに書き込みかつトリガ以降の画像も書き込むように修正する必要があります。
動画全体の時間も指定する
トリガ前のフレーム数を指定するのに加えて、画像を取得している時間の合計を指定して時間が来たら終わらせるように組むこともできます。(ただしframe per secondの設定によっては、動画そのものが指定した時間の長さになっているとは限らないようです)
トリガが来る前までの画像取得にかかった時間を記録しておき、トリガが来た時点でそれらの時間の合計を計算、あとはトリガ以降の画像取得の時間を都度足していき、指定の時間を超えたら生産者ループを止めるようにします。
この記事では、トリガの前後で取得した画像をAVIファイルに保存する方法を紹介しました。画像ファイルに出力するプログラムとほぼ同じ作りで構成できるので、片方を作っておけばもう片方への修正も時間がかからずできると思います。参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント