主要内容

平均图像随时间变化

这个例子展示了如何在一段时间内平均获取的图像。

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

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

  • 每10秒获得5帧

  • 重复采集10次

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

实验装置由一个沙漏组成,随着时间的推移,沙漏中有白沙滴下。该示例使用了一个回调函数,该函数使用image Processing Toolbox™函数对获取的图像帧进行平均。

配置采集

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

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

要控制记录帧的速率,有2个可用的选项:

  • 配置设备帧速率

  • 使用TimerFcn来执行回调

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

使用帧速率选项将提供与设备的实际视频流速率最紧密一致的采集结果,而使用计时器方法提供独立于设备的流速率的采集结果。

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

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

访问所选采集的视频源。SRC = getselectedsource(vid);注意这个设备提供了一个FrameRate属性。get (src)
一般设置:Parent = [1x1 videoinput] Selected = on SourceName = input1 Tag = Type = videosource UserData = [] Device Specific Properties: BacklightCompensation = on亮度= 255 BrightnessMode = auto对比度= 127曝光= 511 ExposureMode = auto Focus = 58 framamerate = 15.1500 Gamma = 0虹膜= 4饱和度= 108清晰度= 127 WhiteBalance = 100 WhiteBalanceMode = auto
使用FrameRate属性,可以配置采集源%为工具箱提供每秒30帧。FPS = 30;src。FrameRate = num2str(fps);由于目标是每10秒获得5帧,工具箱%不应该获取任何帧,直到设备提供第300个帧%框架:acqPeriod = 10;frameDelay = 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。FrameRate = fps;使用视频输入对象的UserData存储处理信息。用户数据。平均= {};用户数据。avi = vwObj;从视频。UserData = UserData;将视频输入对象配置为每5帧处理一次%指定每次触发时执行的回调例程。从视频。TriggerFcn = {“util_imaverage”framesPerTrigger};现在图像采集和处理配置已经完成,%采集已开始。开始(vid)等待获取完成。这就提供了收购%在删除对象之前完成的时间。等待(vid acqDuration);验证平均帧是否保存到AVI文件中。userdata = vid.UserData;vwObj = userdata.avi;framesWritten1 = vwObj。FrameCount
framesWritten1 = 10
显示所获取帧的平均结果。注意沙漏下腔随时间的变化。。imaqmontage (userdata.average);标题(“平均结果-基于帧速率”);

当视频输入对象不再需要时,删除% it,并将其从工作空间中清除。还可以删除和清除VideoWriter对象。delete(vid) delete(vwObj) clear从视频vwObj

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

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

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

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

当视频输入对象不再需要时,删除% it,并将其从工作空间中清除。还可以删除和清除VideoWriter对象。delete(vid) delete(vwObj2) clear从视频vwObj2