Matlab videoinput:Matlab遇到内部错误,需要关闭
我试图运行一个程序,打开一个网络摄像头,截图,处理它,并显示输出。我的代码运行正常,并且获得了输出,但是当我关闭输出窗口时,每次都会出现以下错误: Matlab系统错误:Matlab遇到内部问题,需要关闭 因为我是Matlab新手,有人能帮我吗?我使用的是Windows8操作系统和MatlabR2013A 代码如下:Matlab videoinput:Matlab遇到内部错误,需要关闭,matlab,video,video-capture,Matlab,Video,Video Capture,我试图运行一个程序,打开一个网络摄像头,截图,处理它,并显示输出。我的代码运行正常,并且获得了输出,但是当我关闭输出窗口时,每次都会出现以下错误: Matlab系统错误:Matlab遇到内部问题,需要关闭 因为我是Matlab新手,有人能帮我吗?我使用的是Windows8操作系统和MatlabR2013A 代码如下: clear all; close all; clc; video=videoinput('winvideo',1); preview(vid
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
全部清除;
全部关闭;
clc;
视频=视频输入(“winvideo”,1);
预览(视频);
while(true)
数据=获取快照(视频);
R=数据(:,:,1);
G=数据(:,:,2);
B=数据(:,:,3);
对于i=1:768
对于j=1:1024
如果(R(i,j)这里有一些简单的代码,可以在Windows或Mac上为我复制错误(R2013b,内置FaceTime高清摄像头):
运行上面的命令,在它绘制图像后关闭窗口,你可能会使它崩溃。奇怪的是,在我可靠地使它崩溃了几次之后,它停止了这样做
发生了什么事
这个错误对我来说是随机消失的,这让我怀疑某种竞争条件。你的代码不是特别正确,但是Matlab不应该像这样崩溃,所以它是正确的
你怎么能解决这个问题
问题是,您正在关闭一个窗口,该窗口被绘制到无限while
循环的内部。当图形关闭时,您需要中断while
循环。您可能还需要执行一些清理,例如删除视频
对象。下面是一些不应该产生错误的快速代码:
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
全部清除;
全部关闭;
clc;
如果ispc
视频=视频输入(“winvideo”,1);
艾尔塞夫·伊斯马克
视频=视频输入('macvideo',1);
其他的
视频=视频输入(imaq.视频设备);
结束
%预览(视频);
%创建图形并获取图像数据的句柄
数据=获取快照(视频);
R=数据(:,:,1);
输出=双(R<128);
h=imshow(out);
虽然是真的
数据=获取快照(视频);
R=数据(:,:,1);
输出=双(R<128);
如果IshHandle(h)%
设置(h,'CData',out);%替换图像数据
其他的
打破
结束
结束
删除(视频);%清除
不需要嵌套的,
-loop来计算out
:out=double(R<128);
就是这样。另一件事:这是最好的。@Shai-Meh.i
和j
作为循环索引,从那时起(本质上)就无处不在了时间的曙光。更好的解决方案是使用1i
或1j
来表示虚单位——这里没有模糊的可能性!+1用于指出使用1i和1j。另外R<128
返回与R(768x1024)大小相同的逻辑其中R
中大于128小于128的每个元素都是真的。Double将其转换为Double。与您所做的完全相同,但速度更快、更短。关于错误:它是每次发生还是只发生一次?@sebastian No。我没有使用任何第三方工具箱。我只使用MATLAB。
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