0

我有一个实时运行的功能控制硬件时序等。我也希望能够录制视频,所以我在 matlab 中创建了一个全局视频对象,并将触发设置为手动。现在,我拥有它,以便实时循环的每次迭代我都会记录一个帧并将其写入磁盘。我正在更改它,以便我记录到内存直到我达到某个限制,然后写入磁盘。但是,我想保证无论实时循环运行得有多快,我每秒只能捕获 15 帧。

不过想一想,我怎样才能让我捕捉到的 15 帧彼此不那么接近呢?如果实时循环以闪电般的速度运行,则 15 帧将仅在“开始”处收集,并且几乎没有捕获在那一秒内发生的任何变化。换句话说,实时循环越快,我的采样就会越快,就像每秒 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