如何使用MATLAB以定时间隔获取图像?

时间:2009-09-23 18:11:58

标签: image matlab camera timer capture

我是一名MATLAB初学者,我想知道如何以5秒的间隔从相机中获取和保存20张图像。非常感谢你。

4 个答案:

答案 0 :(得分:6)

首先构建一个视频输入界面

vid = videoinput('winvideo',1,'RGB24_400x300');

您需要调整网络摄像头的最后一位。要查找网络摄像头设备列表(以及其他内容),请使用:

imaqhwinfo

以下内容将第一个网络摄像头变为对象

a=imaqhwinfo('winvideo',1)

使用

查找支持的视频格式列表
a.SupportedFormats

然后你想要启动界面:

start(vid);
preview(vid);

现在您可以执行以下操作:

pics=cell(1,20)
for i=1:20
   pause(5);
   pics{i}=getsnapshot(vid);
end

或者,正如其他评论员所指出的那样,您也可以使用Matlab计时器进行间隔。

如果您希望以相当短的间隔(每秒1次或更多)捕获图像,将网络摄像头视为视频源可能更有用。我已经给this question留下了答案,其中列出了实现这一目标的方法。

答案 1 :(得分:1)

这是一个关于获取一张图片的快速教程http://www.mathworks.com/products/imaq/description5.html你有这种工作吗?

修改

既然你可以获得一张图片,那么你想得到二十张。您将需要一个计时器对象或一个简单的for循环。

Simple timer object example

Video example of timers in MATLAB

务必将“要执行的任务”字段设置为20。此外,您应该将一张图片的所有代码汇总到一个函数中。

答案 2 :(得分:1)

有几种方法可以解决这个问题,每种方法都有优点和缺点。根据您目前发布的信息,我将如何执行此操作:

vid = videoinput('dcam', 1'); % Change for your hardware of course.
vid.FramesPerTrigger = 20;
vid.TriggerRepeat = inf;
triggerconfig(vid, 'manual');
vid.TimerFcn = 'trigger(vid)';
vid.TimerPeriod = 5;
start(vid);

这将每五秒钟获取20张图像,直到您调用STOP。您可以更改TriggerRepeat参数以更改获取的次数。

这显然不会在获取图像后对图像进行任何处理。

答案 3 :(得分:0)

要获取图像,相机是否带有一些记录的方式来控制它从计算机? MATLAB支持链接到outside libraries。或者您可以按照MatlabDoug的建议购买合适的MATLAB工具箱。

要保存图像,IMWRITE可能是最简单的选择。

要重复此操作,使用FOR的简单PAUSE循环将以极少的工作量为您提供您想要的内容:

 for ctr = 1:20
   img = AcquireImage(); % your function goes here
   fname = ['Image' num2str(ctr)]; % make a file name
   imwrite(img, fname, 'TIFF');
   pause(5); % or whatever number suits your needs
 end

但是,如果您需要精确的5秒间隔,则必须深入TIMER秒。这是一个简单的例子:

function AcquireAndSave
  persistent FileNum;
  if isempty(FileNum)
    FileNum = 1;
  end
  img = AcquireImage();
  fname = ['Image' num2str(FileNum)];
  imwrite(img, fname, 'TIFF');
  disp(['Just saved image ' fname]);
  FileNum = FileNum + 1;
end

>> t = timer('TimerFcn', 'ShowTime', 'Period', 5.0, 'ExecutionMode', 'fixedRate');
>> start(t); 
...you should see the disp line from AcquireAndSave repeat every 5 seconds...
>> stop(t);
>> delete(t);