プロが教える店舗&オフィスのセキュリティ対策術

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ファイルとしてアニメーションを保存したのですが,
保存されたファイルを再生してみると,ファイルが斜めいたりしており,
正常にアウトプットされていませんでした.

上手く保存するやり方をご存知の方,ご教授ください.

A 回答 (3件)

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 画像です.
    • good
    • 0
この回答へのお礼

ありがとうございます.
そのような不具合についてはまったく知りませんでした.
教えて頂き本当にありがとうございます.

ちなみにOSはlinuxなので,windowsとは違うかもしれませんが,
現状ではご指摘のようにエラーが見られるので,
フリーソフトを試してみようと思います.

お礼日時:2011/12/11 13:52

avi形式のファイルで保存することを考えなければ


gif形式でimwriteという手もありますかね。
http://www.mathworks.co.jp/help/ja_JP/techdoc/re …
WriteModeをappendにすることでgifアニメーションファイルが作れます。
コマおくりはDelayTimeで調整する感じで。

movie2aviはいっかい画像全部を変数として持つ形になるので
コマ数が増えると対応できないんですよね…

お望みの答えではないかも知れませんが。
参考になれば幸いです。
    • good
    • 1
この回答へのお礼

ありがとうございます!


>>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);

お礼日時:2011/12/14 10:11

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ファイルを作ることができます。

参考になれば幸いです。
    • good
    • 1
この回答へのお礼

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

お礼日時:2011/12/15 10:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!