5

更新された画像を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で画像オブジェクトを更新するより速い方法はありますか?

4

1 に答える 1

4

すべての画像のサイズが同じである場合は、コマンドを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の数値はビデオの表示用に最適化されていないため、これはまだ低速です。アプリケーションで前処理が許可されている場合は、ムービーファイルとしてディスクに保存し、外部プログラムを呼び出して表示します。

于 2012-06-01T16:17:05.723 に答える