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中图形更新的加速帧率_Matlab_Video_Frame Rate - Fatal编程技术网

MATLAB中图形更新的加速帧率

MATLAB中图形更新的加速帧率,matlab,video,frame-rate,Matlab,Video,Frame Rate,我在MATLAB的视频中读到如下内容: v = VideoReader('testvid.wmv') cnt = 0; while hasFrame(v) cnt = cnt + 1; video(cnt,:,:,:) = readFrame(v); end 如果我签出视频对象,我会告诉我视频有24帧。 但是,如果在读取后直接显示它(因此基本上是在for循环内部以每秒大约5帧的速度显示) 这就是为什么我像上面的代码那样编写它,这样框架就可以被预先存储到工作区中,现在我可以像这

我在MATLAB的视频中读到如下内容:

v = VideoReader('testvid.wmv')

cnt = 0;
while hasFrame(v)
    cnt = cnt + 1;
    video(cnt,:,:,:) = readFrame(v);
end
如果我签出视频对象,我会告诉我视频有24帧。 但是,如果在读取后直接显示它(因此基本上是在for循环内部以每秒大约5帧的速度显示)

这就是为什么我像上面的代码那样编写它,这样框架就可以被预先存储到工作区中,现在我可以像这样显示它们

figure
for i=1:cnt
   tic
   imshow(squeeze(video(i,:,:,:)))
   toc
end

然而,我仍然只能得到10帧-MATLAB是否在这个方向受到限制?是否有更好的方法在MATLAB中以足够快的帧速率显示视频?

您可以更新绘图CData,而不是每次都重新填充它

% Prepare 24 fake RGB coloured frames
A = randn(100,100,3,24);

figure

% Time the frame display time when replotting
tic
for k = 1 : 24
     h = imshow(A(:,:,:,k));
     drawnow
end
t = toc;
disp(t / 24)


% Time the frame display time when updating CData
tic
for k = 1 : 24
    if k == 1
        % Create the image object
        h = imshow(A(:,:,:,k));
    else
       % Update the Cdata property of image
       set(h , 'cdata' , A(:,:,:,k));
    end
    drawnow
end
t = toc;
disp(t / 24)
我的输出是:


因此,我在更新CData时得到了十倍的改进。这实际上比每秒24帧更快!

您可以更新绘图CData,而不是每次都重新填充它

% Prepare 24 fake RGB coloured frames
A = randn(100,100,3,24);

figure

% Time the frame display time when replotting
tic
for k = 1 : 24
     h = imshow(A(:,:,:,k));
     drawnow
end
t = toc;
disp(t / 24)


% Time the frame display time when updating CData
tic
for k = 1 : 24
    if k == 1
        % Create the image object
        h = imshow(A(:,:,:,k));
    else
       % Update the Cdata property of image
       set(h , 'cdata' , A(:,:,:,k));
    end
    drawnow
end
t = toc;
disp(t / 24)
我的输出是:


因此,我在更新CData时得到了十倍的改进。这实际上比每秒24帧快!

每秒有24帧,就像在视频中一样,在视频播放器中播放的速度很快。如你所知,MATLAB不是视频播放器,所以它会尽可能快地绘制内容。实际上,你不是在复制视频,而是告诉MATLAB“尽可能快地逐个显示这些图像”。如果你有一台功能强大的计算机,它甚至可以比24/s更快地显示它们。但是,你可以做的一件事是让MATLAB打开VLC来读取你的电影文件。如果你想这样做,请参阅命令。每秒有24帧,就像在视频中一样,在视频播放器中播放的速度很快。如你所知,MATLAB不是视频播放器,所以它会尽可能快地绘制内容。实际上,你不是在复制视频,而是告诉MATLAB“尽可能快地逐个显示这些图像”。如果你有一台功能强大的计算机,它甚至可能以超过24/s的速度显示它们。但你可以做的一件事是让MATLAB打开VLC来读取你的电影文件。如果你想这样做,请参阅命令