Matlab videoinput:Matlab遇到内部错误,需要关闭

时间:2014-02-19 06:30:54

标签: matlab video video-capture

我正在尝试运行一个打开网络摄像头的程序,截取屏幕截图,处理它并显示输出。我的代码运行正常,我正在输出,但是当我关闭输出窗口时,我每次都会收到此错误:

  

Matlab系统错误:Matlab遇到了内部问题,需要关闭。

因为我是Matlab的新手,任何人都可以帮助我吗?我使用的是Windows 8操作系统和Matlab R2013a。

这是代码:

    clear all;
    close all;
    clc;
    video=videoinput('winvideo',1);
    preview(video);
    while(true)
    data=getsnapshot(video);
    R=data(:,:,1);
    G=data(:,:,2);
    B=data(:,:,3);
    for i=1:768
        for j=1:1024
           if(R(i,j)<128)
               out(i,j)=1;
           else
               out(i,j)=0;
           end
       end
   end
   cla; % Prevent stuffing too many images into the axes.
   imshow(out);
   drawnow;
   end

1 个答案:

答案 0 :(得分:0)

这是一些更简单的代码,可以在Windows或Mac上为我复制错误(R2013b,内置FaceTime高清摄像头):

clear all;
close all;
% video = videoinput('macvideo',1);
video = videoinput('winvideo',1);
while true
    data = getsnapshot(video);
    cla;
    imshow(data);
    drawnow;
end

运行上面的内容并在绘制图像后关闭窗口,您可能会让它崩溃。奇怪的是,在我可靠地使其崩溃几次后,它停止了这样做。

发生了什么事?

错误随机消失的事实让我怀疑某种竞争条件。你的代码不是特别正确,但Matlab不应该像这样崩溃,所以should be reported as a bug

你如何解决这个问题?

问题是你正在关闭一个被无限while循环内部绘制的窗口。当数字关闭时,你需要打破while循环。您可能还想执行一些清理,例如删除video对象。这是一些不应该产生错误的快速代码:

clear all;
close all;
clc;
if ispc
    video = videoinput('winvideo',1);
elseif ismac
    video = videoinput('macvideo',1);
else
    video = videoinput(imaq.VideoDevice);
end
% preview(video);

% Create figure and get handle to image data
data = getsnapshot(video);
R = data(:,:,1);
out = double(R < 128);
h = imshow(out);

while true
    data = getsnapshot(video);
    R = data(:,:,1);
    out = double(R < 128);
    if ishghandle(h)        % Only if figure still open
        set(h,'CData',out); % Replace image data
    else
        break;
    end
end
delete(video); % Clean up