【问题标题】:fast way to update image objects in Matlab figure在 Matlab 图中更新图像对象的快速方法
【发布时间】:2012-06-01 15:58:46
【问题描述】:

我需要在 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 中更新图像对象?

【问题讨论】:

    标签: matlab image-processing


    【解决方案1】:

    如果所有图像的大小相同,您可以使用一次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 图形并未针对显示视频进行优化。如果应用程序允许进行预处理,则将其作为电影文件保存到磁盘,并调用外部程序进行显示。

    【讨论】:

    • 这给出了一个错误,“名称 'CData' 不是类 'axes' 实例的可访问属性。”
    • 斯帕西博安德烈!这种方法提供了两倍的速度,secPerFrame = 0.0049 现在。
    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多