matlabで動画保存方法 - アニメーションの作成と正しい保存方法を教えてください

このQ&Aのポイント
  • 一次元偏微分方程式の解を格納した行列uをアニメーションとして表示したい場合、matlabを使用して動画を保存する方法があります。ただし、既存の方法で保存すると斜めに表示される問題が発生します。正しい保存方法をご教授ください。
  • アニメーションとして表示させたい行列uの1行目から最後の行までの行ベクトルを順に表示する方法を考えています。現在はwaterfall関数を使用して表示していますが、正しい保存方法がわかりません。movie関数とmovie2avi関数を使用してアニメーションを作成し、aviファイルとして保存しましたが、保存されたファイルが斜めに表示される問題があります。
  • 上記の問題を解決するために、正しいアニメーションの作成と保存方法を教えていただけませんか?アニメーションの作成にはmovie関数とmovie2avi関数を使用し、アウトプットとしてaviファイルを取得したいです。斜めに表示される問題を解消するために、適切な操作を教えてください。
回答を見る
  • ベストアンサー

matlabで動画保存したい

1次元の偏微分方程式の解を格納した uという100×Nの行列があるのですが, このuの1行目から最後の行までのそれぞれの行ベクトルを 順に表示させたいと考えています. つまり,アニメーションのように時間発展を表示させたいと考えています. (今までは単にwaterfallなどを使って表示していました) そこで,以下のように試してみました. >>hold on; M = moviein(100); for j = 1:100 waterfall(u(j,:)); view([44 62]); M(:,j) = getframe; end hold off; >> movie(M) としてみたところ,正常にアニメーションが表示されました. 次に >> movie2avi(M,'sample.avi') として,aviファイルとしてアニメーションを保存したのですが, 保存されたファイルを再生してみると,ファイルが斜めいたりしており, 正常にアウトプットされていませんでした. 上手く保存するやり方をご存知の方,ご教授ください.

質問者が選んだベストアンサー

  • ベストアンサー
  • Kules
  • ベストアンサー率47% (292/619)
回答No.3

A No.2のKulesです。 >> imwrite(M,'sample','gif') Mは100行の配列ですよね? imwriteは「画像を一枚書き込む」ための関数なので、 配列で保存された画像を一度に保存することはできなかったような気がします。 (そもそも私がimwriteを提案するのは、「画像サイズやループ回数によってメモリ不足になるのを回避するため」なので、 ループ中の画像データを一度全て持つ形で使うことは考えていません) 使うとしたら、 一度目は imwrite(画像データ、'ファイル名','gif'); で二度目以降は imwrite(画像データ、'ファイル名','gif','writemode','append'); という感じでしょうか。 そういえば昔gifじゃなくてavi形式でも同じようにやってたなあ…と思い過去のファイルを漁ってたら見つかりました。 aviobj=avifile('sample.avi'); でsample.aviにアクセスするためのファイルポインタ(のようなもの?)が作られるので、 後はループ内で addframe(aviobj,一枚分の画像データ); とすることでメモリ不足を気にすることなくaviファイルを作ることができます。 参考になれば幸いです。

hyenaydtekie
質問者

お礼

大変参考になりました! ご丁寧な指導,ありがとうございました!

その他の回答 (2)

  • Kules
  • ベストアンサー率47% (292/619)
回答No.2

avi形式のファイルで保存することを考えなければ gif形式でimwriteという手もありますかね。 http://www.mathworks.co.jp/help/ja_JP/techdoc/ref/imwrite.html WriteModeをappendにすることでgifアニメーションファイルが作れます。 コマおくりはDelayTimeで調整する感じで。 movie2aviはいっかい画像全部を変数として持つ形になるので コマ数が増えると対応できないんですよね… お望みの答えではないかも知れませんが。 参考になれば幸いです。

hyenaydtekie
質問者

お礼

ありがとうございます! >>hold on; M = moviein(100); for j = 1:100 waterfall(u(j,:)); view([44 62]); M(:,j) = getframe; end hold off; >> movie(M) >> imwrite(M,'sample','gif') としてみたのですが,以下のようにエラーが出ました・・ このデータ構造だとMは保存できないのでしょうか・・・? ??? Error using ==> imwrite>validateSizes at 596 Unsupported image datatype 'struct'. Error in ==> imwrite at 422 validateSizes(data);

  • m0r1_2006
  • ベストアンサー率36% (169/464)
回答No.1

matlab の movie2avi は,windows XP 32bit で matlab2007 くらいまでは動いてましたが, その後は,codex が無いとかエラーはきまくりでした. OS は, windows で良いのでしょうか? png に保存して ffmpeg というフリーソフトで avi 作った方がましです. FIG フォルダをすぐ下に作る for j = 1:100 waterfall(u(j,:)); view([44 62]); print('-dpng',['FIG/FIG',num2str(j,'%04d'),'.png']); end で FIG フォルダに FIG0001.png から連番で FIG0100.png まで画像ファイルができます. あとは,FIG フォルダに ffmpeg を入れて cmd から, ffmpeg -r 10 -i "FIG%04d.png" -vcodec mjpeg -sameq out.avi とうてば,out.avi という動画ができます. -r 10 は 1秒間に 10 画像です.

hyenaydtekie
質問者

お礼

ありがとうございます. そのような不具合についてはまったく知りませんでした. 教えて頂き本当にありがとうございます. ちなみにOSはlinuxなので,windowsとは違うかもしれませんが, 現状ではご指摘のようにエラーが見られるので, フリーソフトを試してみようと思います.

関連するQ&A

  • AVI動画の保存について

    こんばんは。最近動画編集を始めた者です。 AVI形式の動画について疑問があるので質問させてください。 PCで録画したMPEGファイルをムービーメーカーで 一度AVIファイルに変換(無圧縮で保存してます) ↓ ムービーメーカーで編集し、またAVI保存 (mpegのままだとムービーメーカーがエラーになる事があるので、  AVIに変換してから編集しています) ↓ そしてTMPGEncでサイズカットの編集をして、またAVI保存 ↓ Ulead VideoStudio 9.0で編集し、AVI保存 ↓ エンコ という手順でいつも動画を編集しているのですが、 何度も何度もAVIで保存していると、どんどん動画の画質って劣化して行ってしまうんでしょうか? 是非回答お待ちしてます。よろしくお願いします。

  • Windowsムービーメーカー2でWMVファイルをDV-AVI形式で保存できない

    Windowsムービーメーカー(バージョン2.1)を使用しています。 DV-AVIファイルを読み込んでWMV形式でコンピュータに保存することはできるのですが、WMVファイルを読み込んでDV-AVI(NTSC)形式で保存しようとすると、「ムービーを正常に保存できませんでした」「ムービーを指定した場所に保存できません。ムービーに使用されている元の素材ファイルが使用できること、使用場所が保存できること、および空きディスク領域が十分あることを確認して、もう一度やり直してください。」というメッセージが出て保存できません。 デジタルビデオカメラをIEEE1394でPCと接続して"DVカメラに送信"を選択しても同様のエラーメッセージが出ます。 HDDの空き容量は60GBありますので、容量不足ではないと思うのですが・・・ DV-AVIにエンコードできないというのは、DV-AVIのコーデックに問題があるのかもしれません(DV-AVIファイルは正常にムービーメーカーで再生できます)。 どなたか対処方法をご存知の方、ご教授お願いいたします。

  • matlabでファイルをn行目から変数に読み込む方法

    matlabでファイルをn行目から読み込む方法がわかりません。 具体的にはファイルの上9行に説明文が入っていて、10行目からtab区切りでn×m行列のデータが入っているファイルがあって、その中のn×m行列のデータを変数に代入したいのですが、その方法がわかりません。 loadで読み込もうとしたのですが上手くできません。もし読み込む方法があるのなら誰か教えてください。

  • MATLABで連続した画像の取り込み方

    1つのJPGファイルを取り込み、表示させるやり方は I = imread('sample000.jpg'); imshow(I) これででき、作業を書くと for t=1:1:10 if(t==1) A=imread('sample000.jpg'); imshow(A) hold on [xa, ya]=textread('sample01.txt','%d %d','headerlines',10); end plot(xa(t,1), ya(t,1), 'r+'); if(t==10) hold off end end ということになります。 10回ループさせるのは、sample01.txtの10行目以降の中身が10個ずつの座標だからです 以下はsample01.txtの中身を簡単に書いたものです ...         ※9行目 test coordinates  ※10行目 44 54        ※11行目 45 46 53 43 55 41 58 38 61 33 66 36 69 41 72 47 73 52        ※20行目 10         ※21行目 46 54        ※22行目 48 52 ... ... 77 51        ※31行目 10         ※32行目 47 52        ※33行目 ... ... という感じです。 で、本題ですが sample000.jpg sample001.jpg sample002.jpg ... ... など複数のjpgファイルをループを使って連続して取り込み、作業したいときは、どういうコマンドでどういうループを作ればいいでしょうか? 具体的には 1枚目のsample000.jpgファイルを読み込みhold on、sample01.txtの11行目から20行目の座標を赤い点でプロットし、最後にhold off 2枚目のsample001.jpgファイルを読み込みhold on、sample01.txtの22行目から31行目の座標を赤い点でプロットし、最後にhold off 3枚目の... というループです。 下手な説明でごめんなさい、誰かMATLABの画像処理に詳しい方がいたら応答よろしくおねがいします。

  • matlabでの長時間の計算について

    すみません、現在matlabで数値解析を行っております。 質問を以下にまとめたので、よろしければアドバイスをお願いします。 -------------------------------------------------------------- matlabで数十分かかると考えられる計算を行おうとしています。 その場合、計算後の大容量のデータは一般的にどのように保存すべきでしょうか? これまで、パラメータを50個用意してそれぞれ計算を行い、 後に見比べるために、目的の変数の値をプロットし、画像(角度などを指定してjpegに)として保存していました。 (for文を使って一定量パラメータを変化させる毎に、saveasを使ってグラフを保存していた。) 今まではパラメータ1つあたり数十秒程度で済む計算だったのでこれでも良かったのですが、 今後はパラメータ1個あたりに対しかかる計算時間が数十分になります。。 そこで、今までと同じように保存していくやり方では、もしグラフの保存方法(角度など)を間違えてしまった場合に かなりの損失になってしまうと思ったので質問しました。。 何か効果的なデータの保存の仕方はありませんでしょうか? 以後もパラメータをfor文を使って一定量変化させ、50個用意して計算していこうと思うのですが・・ 一応現状で考えているのは、saveを使ってworkspace内の変数(全て)をそれぞれ保存していくというものです。 何かその他に効果的なデータの保存方法などありましたら是非教えてください。 -------------------------------------------------------------- 上記のように、 計算時間のかかる計算をmatlabを使って行おうと考えているのですが、 計算機を走らせている間、動作が著しく重くなり、ほとんど他の作業が出来なくなります。 (これは避けられませんよね・・?) 私はmatlabを学校で使っているので、帰宅する際、計算機を走らせて帰ろうと考えています。 (節電家でなくてすみません。。) 問題は途中でメモリ不足などで計算がストップしてしまわないかということです・・ 一応、パラメータを変える毎に初期化すべき変数はzerosを使って初期化しているのですが、 パラメータ毎の目的の変数(6つ)は、多いとそれぞれ10^6×200ほどの配列となる可能性があります。 せっかく手間暇かけて走らせたのに、途中でメモリ不足などと表示されたら辛いなぁと思い・・ 現在使っている計算機はubuntu11.04で、メモリは992.8MiBなのですが、やはりこの計算機だと際どいでしょうか・・? -------------------------------------------------------------- コードに関する質問なのですが・・ uが50000000*200の配列で、それぞれの要素に値が入っているとします。 これをそのまま1行目~50000000行目まで、順にグラフにプロットすると、かなりの時間がかかるので、 1行目から、一定数(例えば100)毎の行の配列を グラフにプロットさせたいのですが、やり方がわかりません・・ x = -10: 10: 200 ; t = 0: 100: 50000000 ; waterfall(x,t,u) ; とするとエラーが出ます。 どなたか訂正出来る方、お願いします。。 waterfall以外でも全然構いません。 -------------------------------------------------------------- 以上長々と質問すみませんでした。。 どなたかご指導頂けると助かります・・ あと、分類というのがよくわからなかったので、その他となっています・・ ごめんなさい。。

  • 動画ファイルのPC保存は何が一番良いのでしょうか?

    動画ファイルをPCにいったん保存する場合に、画質優先で考えた場合は、どの種類のファイルが一番なのでしょうか? AVI、WMV、mpeg2、mp4のうち、AVIはWindowsの古い動画ファイルと聞いていますが「無圧縮」とのこと、 mpeg2とmp4では、mp4の方が新しいファイルだそうですが、mp4はファイルサイズが小さく、インターネットやタブレット端末向きとか、 しかし、Winムービーメーカー2012では、WMVとmp4を比較したら、mp4の方が良い画質で保存できるとのこと、 さきで、DVDやブルーレイに書き込むためにいったんPCに保存する場合です。

  • vbaで、連立方程式を解く方法について

    掃き出し法を使って解くようですが、 -1 0 0 2 0 0 0 0 0 -1 -2 0 0 0 0 -2 0 0 -1 1 0 0 2 1 0 0 0 0 0 0 0 -2 0 -1 0 0 0 0 2 0 0 1 このように、行の入れ替えが必要な場合、繰り返しを用いて行を入れ替える必要がありますよね? 下のように作ってみましたが、上手くいきません。↑の行列を正しく入れ替えるだけならできるのですが、もう一度プログラムを作動させるとエラーが出ます。 For j = l To 6 If Abs(a(j, l)) >= Abs(max) Then'0と負の値しかない場合、0が最大になってしまう u = j 'このときの行を保存 End If Next j For m = 1 To 7 brank = a(l, m) '入れ替える前の値を保存 a(l, m) = a(u, m) a(u, m) = brank Cells(l, m) = Cells(u, m) Cells(u, m) = brank Next m Next l do loopを使った方が良いと聞いたのですが、どのようにすればよいのでしょうか?

  • Winムービーメーカーのムービー保存に関する質問です

    Winムービーメーカに関する質問です。 DVカメラで撮影した映像をムービーメーカで編集しておりますが、編集した映像をコンピュータに保存する際にDV-AVIの設定にて保存しようとしたところ「ムービーの保存ウィザードを完了できません」というエラーが出てしまい保存することができません。エラー内容としては(ムービーを指定した場所に保存できません。ムービーに使用されている元の素材ファイルがしようできること、保存場所が使用できること、空きディスク領域が十分であることを確認して・・・・)といった感じです。 また、他の保存設定(コンピュータの最高の画質など)では正常に保存されますので素材ファイルや保存場所などは問題ないと思われますが、空きディスク領域に関しても十分あると思います。(保存しようとしている映像は400Mほどです) ご存知の方いらっしゃいましたらよろしくお願い致します。

  • ムービーメーカーでの無圧縮AVIふぁいるへの保存方法

    Windowsムービーメーカー5.1を使っています。 無圧縮AVIファイルにタイトルを付けるところまではできたのですが そのままムービーを保存しようとすると 無圧縮AVIファイルで出力できないので困っています。 どなたか方法をお教えください。 よろしくお願いします。

  • 携帯で動画を撮影し、PCに保存しました。

    携帯で動画を撮影し、PCに保存しました。 この動画のファイルの種類が3GPP Movieとなっています。 この3GPPをWMV,AVI,MOV,MPGのいずれかに変換したいのですが可能でしょうか? 全くの素人なので、できるだけ詳しく手順を教えていただけると助かります。 よろしくお願いします<(_ _)>

専門家に質問してみよう