主要内容

图像随时间的平均

这个示例展示了如何对随时间获取的图像进行平均。

对于一些高级应用程序,采集过程可能要求图像在采集时进行处理,同时将处理结果记录到磁盘上。

使用Image Acquisition Toolbox™回调、触发和日志功能,本示例演示了如何完成以下任务:

  • 每10秒获得5帧

  • 重复获取10次

  • 在获取图像时,平均获取的帧并将结果保存到磁盘。

实验装置由一个沙漏组成,随着时间的推移,白沙逐渐流下。的回调函数

  • MATLABROOT \工具箱\ imaq \ imaqdemos \ html \平均

目录,使用图像处理工具箱™函数对获取的图像帧进行平均。

配置采集

创建并配置用于采集的视频输入对象。

%使用24位RGB格式访问设备。vid = videoinput (“winvideo”, 1“RGB24_320x240”);%假设数据记录可以立即开始启动,%立即触发。triggerconfig(视频,“立即”);%配置采集采集5帧…framesPerTrigger = 5;从视频。FramesPerTrigger = FramesPerTrigger;%……再重复扳机9次%(总共执行10次触发器)。nAdditionalTrigs = 9;从视频。TriggerRepeat = nAdditionalTrigs;

要控制记录帧的速率,有两个选项:

  • 配置设备的帧速率

  • 使用TimerFcn执行回调

首先,将显示一个使用设备的帧速率的解决方案,然后是一个使用计时器回调的替代方案。

使用帧速率选项将提供与设备实际视频流速率最接近的采集结果,而使用计时器方法提供的采集结果与设备的流速率无关。

基于帧速率的采集(解决方案1)

设备帧速率只有在设备支持的情况下才能配置。金宝app因为它是一个设备特定的属性,它可以在视频源对象中找到。

%访问选定的视频源进行采集。src = getselectedsource (vid);%注意这个设备提供了一个帧速率属性。get (src)
一般设置:Parent = [1x1 videoinput] Selected = on SourceName = input1 Tag = Type = videosource UserData = [] Device Specific Properties:BacklightCompensation = on亮度= 255 BrightnessMode =自动对比度= 127 Exposure = 511 ExposureMode =自动对焦= 58帧速率= 15.1500 Gamma = 0 Iris = 4饱和度= 108锐度= 127 WhiteBalance = 100 WhiteBalanceMode =自动
%使用FrameRate属性,可以配置获取源%以提供工具箱每秒30帧。fps = 30;src。帧速率= num2str (fps);%因为目标是每10秒获得5帧,工具箱%在设备提供第300帧之前不会获得任何帧%框架:acqPeriod = 10;帧延迟= fps * acqPeriod
frameDelay = 300
%如果触发器被这个值延迟,工具箱将不会缓存%在设备提供300帧之前的任何帧。从视频。TriggerFrameDelay = frameDelay;%为了确保收购不会接近超时,配置略高于预期获取时间的超时值。totalTrigs = nAdditionalTrigs + 1;acqDuration = (acqPeriod * totalTrigs) + 3
acqDuration = 103
从视频。超时= acqDuration;

图像平均

为了将处理过的图像保存到磁盘,使用了VIDEOWRITER对象。利用图像处理工具箱函数对获取的每一组帧进行平均,然后写入磁盘。

%创建并配置AVI文件。vwObj = VideoWriter (“imaverages.avi”未压缩的AVI的);vwObj。帧速率= fps;%使用视频输入对象的UserData存储处理信息。用户数据。平均= {};用户数据。avi = vwObj;从视频。用户数据=用户数据;%配置视频输入对象处理每5帧获取指定在每个触发器上执行的回调例程。从视频。TriggerFcn = {“util_imaverage”framesPerTrigger};%现在图像采集和处理配置已经完成,%开始收购。开始(vid)%等待收购完成。这就提供了获取在删除对象之前,%时间完成。等待(vid acqDuration);验证平均帧被保存到AVI文件。用户数据= vid.UserData;vwObj = userdata.avi;framesWritten1 = vwObj。FrameCount
framesWritten1 = 10
%显示获得的帧的结果平均值。注意沙漏下腔随时间的变化。imaqmontage (userdata.average);标题(“平均结果-基于帧率”);

%一旦视频输入对象不再需要,删除%并将其从工作区中清除。还要删除并清除VideoWriter对象。删除(vid)删除(vwObj)清晰从视频vwObj

基于定时器的采集(方案2)

这个任务的替代解决方案是使用TimerFcn。TimerFcn可以每10秒执行一次,在此时间点获取5帧并取平均值。为了在正确的时刻启动采集,使用手动触发器。

注意,这种方法与配置设备的帧速率无关。

%访问设备并配置获取。有% TimerFcn每10秒触发一次采集。vid = videoinput (“winvideo”, 1“RGB24_320x240”);triggerconfig(视频,“手动”);从视频。TimerFcn = @trigger;从视频。TimerPeriod = acqPeriod;%配置采集,每次采集5帧%设备被触发。再重复触发9次。从视频。FramesPerTrigger = FramesPerTrigger;从视频。TriggerRepeat = nAdditionalTrigs;%配置处理例程和AVI文件。从视频。TriggerFcn = {“util_imaverage”framesPerTrigger};vwObj2 = VideoWriter (“imaverages2.avi”未压缩的AVI的);vwObj2。帧速率= fps;%使用视频输入对象的UserData存储处理信息。userdata2。平均= {};userdata2。avi = vwObj2;从视频。用户数据= userdata2;%开始收购。开始(vid);等待(vid acqDuration);验证平均帧被保存到AVI文件。userdata2 = vid.UserData;vwObj2 = userdata2.avi;framesWritten2 = vwObj2。FrameCount
framesWritten2 = 10
%显示获得的帧的结果平均值。注意沙漏下腔随时间的变化。imaqmontage (userdata2.average);标题(“平均结果-基于计时器”);

%一旦视频输入对象不再需要,删除%并将其从工作区中清除。还要删除并清除VideoWriter对象。删除(vid)删除(vwObj2)清晰从视频vwObj2