使用计时器对象执行嵌套函数

时间:2015-05-27 19:54:58

标签: matlab function image-processing timer video-capture

我正在尝试编写一个程序,该程序从网络摄像头获取图像,对几个垂直像素行进行平均,显示结果,然后应用高斯拟合以高精度定位峰值位置。所有这些都是实时完成的。我使用了一个计时器对象来运行触发摄像头并获取数据的函数(称为datain)。为了迭代和更新数据,该函数包括while循环。我的代码工作得很好,直到我在while循环中添加一个命令来调用另一个执行拟合的函数(称为GaussianFit)。添加此功能时,我收到一个错误,表示定时器中的回调函数没有足够的输入。

"评估定时器'定时器-1'的TimerFcn时出错没有足够的输入参数。"

这似乎很奇怪,因为数据采集功能提供了拟合功能所需的所有输入。我的代码如下:

function WaveAQ()
global webcamin


%%%%%%%%%%%%%%%%%%%%%%%
% Create video object %
%%%%%%%%%%%%%%%%%%%%%%%
dID = 2; vForm = 'MJPG_1280x720';

% Search for existing video objects to avoid creating multiple handles
vObj = imaqfind('DeviceID', dID, 'VideoFormat', vForm);

if isempty(vObj)
webcamin = videoinput('winvideo',dID,vForm);
else
webcamin = vObj{1};
end

% Configure # datasets to be averaged per measurement
set(webcamin,'FramesPerTrigger',1);
% Repeat until stopped
set(webcamin,'TriggerRepeat',Inf);
% Set to grayscale
set(webcamin,'ReturnedColorSpace','grayscale');
% Allow webcam to be triggered by timer
triggerconfig(webcamin,'manual')

% % View the properties for the selected video source object.
% src_obj = getselectedsource(webcamin);
% get(src_obj)

% Prompt for dark reading
j = 1;
j = input('Would you like to take a dark reading? (y/n): ','s');
switch j
    case 'y'
        j = 1;
    case 'n'
        j = 2;
end

if j == 1
    prompt = input('Block input and enter any number to continue: ');
end
% We now define a function which will acquire data from the camera to be
% executed by the timer function
fig1 = figure(1);

function datain(~,event,input) 
persistent image
h = 1; % Initialize Loop
bg = 0;
avgroi = 0;


% Calibration and fitting constants
tol = 1;
calib_slope = .003126;
calib_offset = 781.8;
spect = (1:1280)*calib_slope + calib_offset;


while h == 1
    % Check if figure is open
    h = ishandle(fig1);
    trigger(input);

    % First run finds dark reading
    if j == 1
        bg = getdata(input,1,'uint8');
        j = 2;
    else 
    image = getdata(input,1,'uint8');
    image = image - bg; % Correct for background

    npxy = length(image(:,1));
    npxx = length(image(1,:));
    % Region of interest for spectral data
    dy_roi = 200;
    y_roi = npxy/2;
    % Region of interest for beam position
    dx_roi = npxx/2;
    x_roi = npxx/2;

    avgroi = sum(image((y_roi-dy_roi):(y_roi+dy_roi),:))/(2*dy_roi);
    avgroi = avgroi/256; % Normalize units
    avg_y = (sum(image(:,(x_roi-dx_roi+1):(x_roi+dx_roi))).'/(2*dx_roi)).';

    [cx,sx,Ipeak] = GaussianFit(avgroi,tol);
% cx = max(avgroi);
% sx = 2;
% Ipeak = max(avgroi);

    subplot(2,1,1)
    plot(spect,avgroi)
    title('Spectrogram')
    xlabel('Wavelength (nm)')
    ylabel('Intensity (arb.)')
    legend(['\lambda_P_e_a_k = ',num2str(cx),'nm'])
    subplot(2,1,2)
    plot(1:length(avg_y),avg_y/256)
    title('Beam Profile in Y')
    xlabel('Pixel #')
    ylabel('Intensity (arb.)')
    end
end
end


%%%%%%%%%%%%%%%%%%%
% Define timer object to execute daq %
%%%%%%%%%%%%%%%%%%%

% Set callback properies
timerfcn = @datain;
% Image acquisition rate
Raq = 5;

timer_exec = timer('TimerFcn',{timerfcn,webcamin},'period',1/Raq,'BusyMode','drop');% Maybe change busy mode to queue if regular acquisition interval needed.
% timer_exec2 = timer('TimerFcn',@GaussianFit,'period',1/Raq,'BusyMode','drop');
% Execute acquistion
start(webcamin);
preview(webcamin);
start(timer_exec);
% start(timer_exec2);

% Clean system
stop(timer_exec);
% stop(timer_exec2);
delete(timer);
stop(webcamin);
delete(webcamin);
clear functions;
end 

有人能告诉我为什么在循环内调用GaussianFit时计时器需要更多输入吗?

0 个答案:

没有答案