MATLAB によるビデオからフレームを抽出する
このチュートリアルでは、Matlab の read()
関数を使用してビデオのフレームを抽出する方法について説明します。
MATLAB の read()
関数を使用してビデオからフレームを抽出する
ビデオは多くのフレームで構成されています。つまり、画像で構成されているため、画像やフレームが次々と繰り返されると、ビデオが再生されます。たとえば、ビデオが 1 秒あたり 60 フレームで構成されているとします。これは、1 秒あたり 60 フレームになることを意味します。フレームは非常に速く変化するため、ビデオの再生のみが表示されます。まず、関数 VideoReader()
を使用して Matlab でビデオを読み取る必要があります。その後、NumberOfFrames
プロパティを使用して、ビデオに存在するフレームの総数を求める必要があります。for
ループを使用します。これは、1 から始まり、ビデオの最大フレーム数で終わります。次に、ビデオに存在する各フレームを見つけ、関数 subplot()
および imshow()
を使用してプロットに表示します。たとえば、ビデオを読んで、Matlab ですべてのフレームを抽出してみましょう。以下のコードを参照してください。
v = VideoReader('bon_fire_dog_2.mp4');
totalFrames = v.NumberOfFrames;
NFP = ceil(sqrt(totalFrames));
for i=1:totalFrames
frame = read(v,i);
subplot(NFP,NFP,i)
imshow(frame)
end
出力:
上記のコードでは、変数 NPF
が上の図の行と列の数を設定します。imwrite()
関数を使用して、各フレームを画像としてフォルダ内に保存することもできます。以下のコードを参照してください。
v = VideoReader('bon_fire_dog_2.mp4');
totalFrames = v.NumberOfFrames;
NFP = ceil(sqrt(totalFrames));
for i=1:totalFrames
frame = read(v,i);
ImgName = strcat(int2str(i),'.png');
imwrite(frame, ImgName);
end
上記のコードは、ビデオに存在するすべてのフレームを、スクリプトファイルと同じディレクトリ内に .png
ファイル形式の画像として保存します。画像のファイル名とファイル拡張子を変更することもできます。ビデオからすべてのフレームを抽出するのではなく、ビデオの最初のフレームのみを抽出する場合。これを行うには、read()
関数の 2 番目の引数を read(v,1)
のように 1 に変更する必要があります。ビデオの最後のフレームを抽出する場合は、2 番目の引数を read(v,inf)
のように inf
に変更する必要があります。ビデオから特定の範囲のフレームを抽出する場合は、2 番目の引数を vector に変更する必要があります。たとえば、read(v,[5 10])
関数を使用して、ビデオ v
から 5 から 10 までのフレームを読み取ることができます。