VideoReade​rを使って動画を再生​したいが、容量オーバ​ーのエラーが出る

16 Ansichten (letzte 30 Tage)
Hernia Baby
Hernia Baby am 18 Feb. 2021
Kommentiert: Hernia Baby am 24 Feb. 2021
Matlab Home2020bを使用しています。
VideoReaderを使って動画の再生まで行いたいです。
v = VideoReader('sample_video.mp4');
m = zeros(v.Height, v.Width, 3, int64(v.FrameRate*v.Duration),'uint8');
k = 1;
while hasFrame(v)
m(:,:,:,k) = readFrame(v);
k = k + 1;
end
implay(m, v.FrameRate)
imtool(m(:,:,:,1),'InitialMagnification','fit')
imtool(m(:,:,:,800),'InitialMagnification','fit')
しかし、2行目の処理で以下のようなエラーが出てしまいます。
-------------------------
エラー: zeros
要求された 1080x1920x3x1501 (8.7GB) 配列は、最大配列サイズの基本設定を超えています。この制限より大きい配列を作成すると、処理に時間がかかり、MATLAB が反応しなくなることがあります。
-------------------------
CPUのメモリ不足が原因なのでしょうか?
参考画像:変数 v の詳細

Akzeptierte Antwort

Atsushi Ohashi
Atsushi Ohashi am 22 Feb. 2021
連続する配列領域として大きすぎるため、配列を確保しようとするとページングが発生し、長い処理時間がかかるようになり、結果としてMATLABが反応しなくなる危険があるため、エラーとなっております。
ワークスペース変数で利用できる配列サイズは下記に記載がありますので、ご参照ください。
もし、フレームごとに画像として取得したい場合は、セルに格納する手段がありますし、implayのような巻き戻しなどはないですが、動画として見たいのであればimshowで代用はいかがでしょうか。
cellImage = cell(int64(v.FrameRate*v.Duration), 1);
% m = zeros(v.Height, v.Width, 3, int64(v.FrameRate*v.Duration),'uint8');
k = 1;
while hasFrame(v)
img = readFrame(v);
cellImage{k, 1} = img;
imshow(img);
k = k + 1;
end
  3 Kommentare
Atsushi Ohashi
Atsushi Ohashi am 24 Feb. 2021
事前に表示用にFigureを用意しておき、そのFigureが表示されている間は画像を表示し、Figureを閉じたらwhile処理をbreakするのが1つの方法になると思います。
f = figure;
while hasFrame(v)
img = readFrame(v);
if ishandle(f)
imshow(img);
else
break;
end
k = k + 1;
end
Hernia Baby
Hernia Baby am 24 Feb. 2021
ありがとうございます。やりたいことができました。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Produkte


Version

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!