2012-06-01 60 views
4

我需要在Matlab图中尽可能快地显示更新后的图像。每个图像都被处理并显示。但是,彩色图像的显示速度很慢。 例如,当我运行下面的代码在Matlab中更新图像对象的快速方法图

videoObj = VideoReader('sample.avi'); 
nFrames = videoObj.NumberOfFrames; 
h = videoObj.Height; 
w = videoObj.Width; 
mov(1:nFrames) = struct('cdata', zeros(h, w, 3, 'uint8'), 'colormap', []); 
for k = 1 : nFrames 
    mov(k).cdata = read(interObj, k); 
end 

tic 
for i=1:nFrames 
    frame = mov(i).cdata; 
    image(frame); 
    drawnow; 
end 
secPerFrame = toc/nFrames 

花费secPerFrame = 0.012秒更新每个帧。每帧都是640x480像素的RGB图像。因此,如果我想要以每秒30帧的速度处理视频流,则在减去与图像显示相关的开销后,实际图像处理的“秒数”仅“0.033 - 0.012 = 0.021秒”。

有更快的方式来更新Matlab中的图像对象吗?

回答

3

如果所有图像的大小相同,则可以使用image命令一次,然后更新轴的CData属性。

videoObj = VideoReader('sample.avi'); 
nFrames = videoObj.NumberOfFrames; 
mov(1:nFrames) = ... 
    struct('cdata', zeros(vidHeight, vidWidth, 3, 'uint8'), 'colormap', []); 
for k = 1 : nFrames 
    mov(k).cdata = read(interObj, k); 
end 

tic 
    image(mov(1).cdata); 
    imageHandle = get(gca,'Children'); 
for i=1:number 
    frame = mov(i).cdata; 
    set(imageHandle ,'CData',frame); 
    drawnow; 
end 
secPerFrame = toc/number 

由于Matlab数字未针对显示视频进行优化,所以这仍然很慢。如果应用程序允许执行预处理,将其作为电影文件保存到磁盘,然后调用外部程序进行显示。

+0

这给出了一个错误,即“名称'CData'不是'轴'类实例的可访问属性。” – Alexey

+0

@Alex,我更新了我的答案 –

+0

Spasibo Andrey!这种方法提供了两倍的速度,现在“secPerFrame = 0.0049”。 – Alexey