VideoWriterについての質問です
41 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
フレームレート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
Réponses (1)
Shunichi Kusano
le 27 Juin 2021
複数フレームをまとめて書き込めるようですね。R2016だとこれできない、ということでしょうか。
メモリに収まりきる分だけのフレームを保持して書込み、をforで回せば良いかと思います。
6 commentaires
Shunichi Kusano
le 30 Juin 2021
バタバタしたときに回答したので、説明が少なくすみません。上のコードも一部訂正しました。
(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を足した方がいいですね。
Voir également
Catégories
En savoir plus sur オーディオとビデオ dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!