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