Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab videoinput:Matlab遇到内部错误,需要关闭_Matlab_Video_Video Capture - Fatal编程技术网

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

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

我试图运行一个程序,打开一个网络摄像头,截图,处理它,并显示输出。我的代码运行正常,并且获得了输出,但是当我关闭输出窗口时,每次都会出现以下错误:

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

因为我是Matlab新手,有人能帮我吗?我使用的是Windows8操作系统和MatlabR2013A

代码如下:

    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