こんにちは.
ぱっと思いつくのは,video input オブジェクトのタイマー機能を使用する方法でしょうか.
video input オブジェクトには,様々なタイミング(トリガー)で画像を取得するための機能が実装されています.今回は,次のような設定を行います.
- マニュアルでトリガーをかける
- トリガー1回につき画像を1枚取得
- タイマー機能を使って,一定時間経過毎に「マニュアルトリガーを発生する関数(下記では mySnapshot)」を起動する.
vid = videoinput('winvideo',2,'MJPG_1024x576');
triggerconfig(vid,'manual');
vid.FramesPerTrigger = 1;
vid.TimerFcn = @mySnapshot;
また,データをメモリ上に保持されたいとの事でしたので,そのための仕掛けを仕込みます.やり方は色々ありますが,ここでは video input オブジェクトの UserData プロパティを使います.具体的には,フィールド images と counts を持つ構造体を UserData とします.
imageBuffer.images = repmat(uint8(0),[576 1024 3 maxImageNumber]);
imageBuffer.size = size(imageBuffer.images,4);
vid.UserData = imageBuffer;
ここまで準備したところで video input オブジェクトを走らせると,設定時間間隔で画像を取得し,UserData プロパティに保存してくれます.
trigger を既定の回数受け付けたら video input オブジェクトは自動的に停止します.TriggerRepeat の値を Inf に設定した場合には,マニュアルで停止する必要があります.
記録されている画像を確認しましょう.どういうわけだか,vid.UserData.images といったドット表記の連鎖が上手く使えない(エラーになる)ので,getfield でバッファの内容を取得しています.
numFrames = vid.FramesAcquired;
imgData = getfield(vid.UserData,'images');
imgData = imgData(:,:,:,1:numFrames);
関数 mySnapshot はこちら.
function mySnapshot(vid,~)
buffer.counts = buffer.counts + 1;
if buffer.counts <= buffer.size
buffer.images(:,:,:,buffer.counts) = img;