VideoWriterについての質問です

16 views (last 30 days)
KO
KO on 27 Jun 2021
Commented: Shunichi Kusano on 30 Jun 2021
フレームレート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 Comment
KO
KO on 27 Jun 2021
なお、画像データはunit8です。

Sign in to comment.

Answers (1)

Shunichi Kusano
Shunichi Kusano on 27 Jun 2021
複数フレームをまとめて書き込めるようですね。R2016だとこれできない、ということでしょうか。
メモリに収まりきる分だけのフレームを保持して書込み、をforで回せば良いかと思います。
  6 Comments
KO
KO on 30 Jun 2021
ご回答ありがとうございます。
matlabでも画像データの処理には時間がかかってしまうのでしょうかね。
上の式を完全に理解するのにまだ時間がかかりそうですが、たくさんのヒントをありがとうございました。とても勉強になりました。
Shunichi Kusano
Shunichi Kusano on 30 Jun 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を足した方がいいですね。

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!