MATLAB固定工业相机曝光时间和增益系数
- 为什么写这篇博文?
- 正文
为什么写这篇博文?
两个原因。
Matlab可以控制工业相机很多参数。但是,网络上关于其参数的配置文章较少,更多出现在论坛之中。这是其一。
在做光学实验时候,常常需要亮度的绝对值。但是,Matlab获取相机参数往往会自动调整增益和曝光,导致亮度值不断在变。
正文
首先查看相机有那些可以配置的参数。
vid = videoinput('winvideo', 2, 'RGB8_1280x1024');
src = getselectedsource(vid);
get(src);
在get(src)后,出现可配置参数的列表。
General Settings:Parent = [1x1 videoinput]Selected = onSourceName = input1Tag = [0x0 string]Type = videosourceDevice Specific Properties:Brightness = 0Contrast = 0Exposure = -5ExposureMode = autoFrameRate = 30.0000Gain = 8GainMode = auto
其中’ExposureMode’和’GainMode’分别是曝光模式和增益模式。如果是自动,即auto,Matlab会自动调整曝光。对亮度的绝对值无要求的实验这不是障碍,甚至是优点。但是对于亮度绝对值敏感的实验,这就要命了。
更改方法如下:
set(src,'ExposureMode','Manual');
set(src,'GainMode','Manual');
此时,相机将工作在固定的曝光模式和增益系数下。
另外,关于getsnapshot()这个函数,有很多细节值得注意。通常,人们习惯如此配置相机。
set(vid,'FramesPerTrigger',1)
set(vid,'TriggerRepeat',1)
或者
vid.FramesPerTrigger = 1;
vid.TriggerRepeat=1;
以上两个代码段含义相同,是同一种做法的两种代码。
So far so good,看起来没什么问题。问题在于,紧随其后的是
img=getsnapshot(vid);
看看官方文档怎么描述“getsnapshot()”的:
翻译一下这段注释:Frame=GETSNAPSHOT(OBJ)立刻返回一帧图像。被返回的此帧数据独立于FramesPerTrigger特性,也不影响FramesAvailable或者FramesAcquired 特性。既然此函数不需要配置相机帧率和Trigger,为什么还要配置呢?答案在于运行时间。
相机工作在默认状态,参数如下
General Settings:DeviceID = 2DiskLogger = []DiskLoggerFrameCount = 0EventLog = [1×0 struct]FrameGrabInterval = 1FramesAcquired = 0FramesAvailable = 0FramesPerTrigger = 10Logging = offLoggingMode = memoryName = RGB8_1280x1024-winvideo-2NumberOfBands = 1Previewing = offROIPosition = [0 0 1280 1024]Running = offTag = Timeout = 10Type = videoinputUserData = []VideoFormat = RGB8_1280x1024VideoResolution = [1280 1024]Color Space Settings:BayerSensorAlignment = grbgReturnedColorSpace = grayscaleCallback Function Settings:ErrorFcn = @imaqcallbackFramesAcquiredFcn = []FramesAcquiredFcnCount = 0StartFcn = []StopFcn = []TimerFcn = []TimerPeriod = 1TriggerFcn = []Trigger Settings:InitialTriggerTime = []TriggerCondition = noneTriggerFrameDelay = 0TriggerRepeat = 0TriggersExecuted = 0TriggerSource = noneTriggerType = immediateAcquisition Sources:SelectedSourceName = input1Source = [1×1 videosource]
在默认状态下,我拍摄了诸多激光干涉图样。拍摄正常。从目前实验看来,TriggerRepeat和FramesPerTrigger并没有影响到Getsnapshot()函数的运行结果。但是,尽管不影响运行结果,它会影响运行时间(11代i7,仅这个函数就用时1s)。如果不设置这两个参数,Getsnapshot()函数会变得非常耗时。
通常,为了追求更少的运行时间,会进行如下配置
set(vid,'FramesPerTrigger',inf)
set(vid,'TriggerRepeat',0) % 相机默认即是0,可以不写此行代码。
另外,随着运行时间增加,相机会在电脑存入很多数据,占用RAM。常用flushdata()函数清理。