VideoWriterについての質問です
12 次查看(过去 30 天)
显示 更早的评论
フレームレート100の各画像上に10ミリ秒ごとのプロットを重ね、最終的にそれらを結合してアニメーションを作りたいのですが、いちいち各画像をimreadしてその時点に対応するプロットをhold onしてwriteVideoするというやり方だとループが膨大になり時間がかかってしまいます。
プロット結合画像をあらかじめcell配列などに格納してからwriteVideoするというようなやり方はありますでしょうか。ちなみにMatlab R2016aを使用しています。
参考までに私のスクリプトの一部を添付いたします。
*movieimgというcellにもとの画像ファイル名が格納されています。
savefn=['C:\Users\Desktop\Movie_File'];
v = VideoWriter(savefn);
v.FrameRate = 100;
open(v);
for t=1:length(movieimg)
imread(cell2mat(movieimg(t)));
hold on;
scatter(x,y,'r');
frame = getframe(gcf);
writeVideo(v,frame);
end
回答(1 个)
Shunichi Kusano
2021-6-27
複数フレームをまとめて書き込めるようですね。R2016だとこれできない、ということでしょうか。
メモリに収まりきる分だけのフレームを保持して書込み、をforで回せば良いかと思います。
6 个评论
Shunichi Kusano
2021-6-30
バタバタしたときに回答したので、説明が少なくすみません。上のコードも一部訂正しました。
(figureのVisibleプロパティですが、offにしても大して実行時間は変わらずでした)
上のコードでわかりづらいところはif文のあたりかと思いますが、少し解説します。
frame_modはframei / frameStepを計算したときの余りです。frameiは現在何回目のfor文内実行か、frameStepは一時保存するフレーム数です。frameiはfor文繰り返しごとに2から3,4,5…と増えていきますが、余りも同じように2,3,4,5…と増えていきます。が、このときは、描画した画像のデータをどんどんs_framesに保存していきます。
frameiがframeStepで割り切れる数まで来ると、これまで保存してきたフレームデータを一気にまとめてwriteVideoします。
次のループではframe_modはまた1から2,3,4…と増えていくことになるので、s_framesに保存するだけとなり、またframeiがframeStepで割り切れる数まで来たら保存、と、これを繰り返して、必要なフレーム数maxFrameまで達したら終了、という流れとなります。文章だとわかりづらいと思いますが、コードと見比べながら咀嚼してみてください。
いま気付きましたが、上のコードですと、maxFrameがframeStepで割り切れないときは、最後の端数分の書込みが実行されないことになるので、elseif framei == maxFrameを足した方がいいですね。
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 オーディオとビデオ 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!