主要内容

图像随时间的平均

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

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

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

  • 每10秒获取5帧

  • 重复获取10次

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

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

配置采集

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

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

为了控制帧被记录的速率,有两个可用的选项:

  • 配置设备帧速率

  • 使用TimerFcn来执行回调

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

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

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

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

访问用于采集的视频源。src = getselectedsource (vid);注意这个设备提供了一个FrameRate属性。get (src)
一般设置:Parent = [1x1 videoinput] Selected = on SourceName = input1 Tag = Type = videosource UserData =[]设备特定属性:BacklightCompensation = on亮度= 255 BrightnessMode = auto对比度= 127曝光= 511 ExposureMode = auto Focus = 58 FrameRate = 15.1500 Gamma = 0虹膜= 4饱和度= 108清晰度= 127 WhiteBalance = 100 WhiteBalanceMode = auto
使用FrameRate属性,可以配置采集源%为工具箱提供每秒30帧。fps = 30;src。帧速率= 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。帧速率= 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
Baidu
map