0

ハードウェアのタイミングなどをリアルタイムで制御する関数を実行しています。ビデオも録画できるようにしたいので、matlab でグローバルビデオオブジェクトを作成し、トリガーを手動に設定しました。現在、リアルタイムループの各反復でフレームを記録してディスクに書き込むようにしています。制限に達するまでメモリに記録してからディスクに書き込むように変更しています。ただし、リアルタイム ループの実行速度に関係なく、1 秒あたり 15 フレームしかキャプチャできないことを保証したいと思います。

しかし、考えてみると、15 フレームが互いにそれほど劇的に接近しないようにするにはどうすればよいでしょうか? リアルタイム ループが電光石火の速さで実行されている場合、15 フレームは「最初」に収集され、その 1 秒間に発生した変更はほとんどキャプチャされません。言い換えれば、リアルタイム ループが高速であるほど、サンプリングは 1 秒あたり 1 フレームのように動作します (これにより、14 個のコピーが作成されます)。

例えば、

% Main File
function start()

global vid;
global myLogger;
vid = videoinput('winvideo', 1, 'MJPG_160x120');
src = getselectedsource(vid);
triggerconfig(vid, 'manual');
vid.FramesPerTrigger = 1;
vid.LoggingMode = 'disk&memory';
imaqmem(512000000); % 512 MB
myLogger = VideoWriter('C:\Users\myname\Desktop\output.avi', 'Motion JPEG AVI');
myLogger.Quality = 50;
myLogger.FrameRate = 15;
vid.DiskLogger = myLogger;
src.FrameRate = '15.0000';
vid.ReturnedColorspace = 'grayscale';

start(vid);
open(myLogger);

initiateFastLoop();

close(myLogger);

stop(vid);


end

リアルタイム部分:

function initiateFastLoop


global vid;
global myLogger;

while(flag)
    % perform lightning fast stuff
    frame = getsnapshot(vid);
    writeVideo(myLogger, frame);
end

end

生成されたビデオのフレームレートははるかに高く、リアルタイム ループが実行されるたびにフレームをキャプチャしたくありません。また、上記の問題のために単純な上限を設定したくありません。どんな助けでも素晴らしいでしょう!

4

0 に答える 0