MATLABでカメラ入力映像をGIFファイルに保存

MATLABでただいま画像処理をお勉強中なのですが、ブログ掲載用に実行結果をGIFアニメ保存したかったので、保存用の関数を作成しました。

参考ページ

Matlabでplotした波形をGIFアニメーションで保存する - ふみきりのぼうけん
今回はMatlabでプロットした波形をGIFアニメーションで保存する方法を紹介したいと思います。こんなんネットの海にいくらでも転がっとるやろとか思ったんですが、説明の少ない公式のQ&Aとか英語の説明が多く、自分が使いたかったオプションの指定とかちょっと調べるのに手間取ったのでこちらにメモとしてまとめておきます。

上記事で紹介されているスクリプトを参考にしました。

私の場合は映像を保存することが目的でしたが、ポイントは大きくは変わりません。

利用サンプル+GIF保存関数

%GIF保存関数利用サンプル

webcamlist
cam = webcam(1);
preview(cam) %カメラ入力確認ウィンドウ

frame_index=1;
GifFrames={} %1フレームのイメージ配列格納用。cell配列で格納する
FrameTimeStamps=datetime.empty %フレームレート間隔計算用のタイムスタンプログ。

pause('on')
while frame_index <= 50 %約10fpsで5秒間撮影

    %最新のスクショ取得
    videoFrame = snapshot(cam);

    %フレームをプッシュ
    GifFrames{frame_index}=videoFrame;
    %タイムスタンプをプッシュ
    FrameTimeStamps(frame_index)=datetime('now');
    frame_index=frame_index+1;

     % 約10fpsに調整するための遅延。
    pause(0.1);
end
pause('off');

%第1引数:保存ファイル名
%第2引数:各フレーム画像
%第3引数:フレーム間隔
SaveFramesAsGif('TestGif.gif', GifFrames, calcFrameInterval(FrameTimeStamps));
function interval = calcFrameInterval(FrameTimeStamps)
%GIFアニメの各フレームの記録時刻(タイムスタンプ)から、フレーム間隔を計算する

    %タイムスタンプから各フレームの間隔を計算
    Durations=FrameTimeStamps(2:end)-FrameTimeStamps(1:end-1);

    %GIFアニメのフレーム間隔は、元映像各フレーム間隔の中央値を採用
    interval=seconds(median(Durations));
end

function SaveFramesAsGif(filename, Frames, FrameInterval)
%入力されたフレームデータをGIFファイルとして保存する

    n=length(Frames);

    %1フレーム目の出力でGIFに無限ループ再生属性を設定
    [A,map] = rgb2ind(Frames{1},256);
    imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',FrameInterval);

    %2フレーム以降をappendモードで出力
    for i=2:n
        [A,map] = rgb2ind(Frames{i},256);
        imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',FrameInterval);
    end
end

GIFアニメ保存したいフレーム(コマ)をcell配列に格納しておき、SaveFramesAsGif関数に与えることで、GIFアニメファイルとして保存します。また、フレームを記録した時刻のベクトルがあれば、中央値をフレーム間隔として取り出す関数も別途実装しました。

利用サンプルでは、約10fpsでカメラからフレームを取得してcell配列に記憶しておき、ループを抜けたらGIFファイル保存関数に渡してGIFアニメ化してます。
※厳密には、(0.1秒+処理時間)の間隔になるので、10fpsよりもフレームレートは若干落ちます。

自作関数を他のライブスクリプトから利用可能にするためのライブラリ化の方法なども覚えないとですね。

コメント