VideoReaderを使って動画を再生したいが、容量オーバーのエラーが出る
22 views (last 30 days)
Show older comments
Hernia Baby
on 18 Feb 2021
Commented: Hernia Baby
on 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 の詳細
0 Comments
Accepted Answer
Atsushi Ohashi
on 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 Comments
Atsushi Ohashi
on 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
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!