OpenCVのVideoWriterを使って画像から動画を作る。
連続した画像(パラパラ漫画のうような画像)から一つの動画を作ったのでメモを残しときます。
流れ
- VideoWriterのクラスがあるライブラリをインクルードする。
- 動画ファイルの箱を作る。
- 動画ファイルが正しく開けているか確認する。
- 動画ファイルに画像を追加していく。
VideoWriterクラスについて
コンストラクタで箱となる動画ファイルを作って設定を行います。
VideoWriter::VideoWriter(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true)
【引数の説明】
引数 | 説明 |
---|---|
filename | 書き出すファイル名。 |
fourcc | コーデックを指定するための関数。(4つの文字を引数に取ります。) |
fps | 動画像のフレームレート。(=1秒あたりのフレーム数) |
frameSize | 動画像の縦横サイズ。 |
isColor | カラーの動画像ファイルとして書き出すかを指定する。 |
fourccは実際にはこう使います。
VideoWriter::fourcc('W', 'M', 'V', '1')
引数となる4つの文字は以下の通り。
コーデック名 | 引数 | 拡張子 |
---|---|---|
MP4S | ('M', 'P', '4', 'S') | .mp4 |
MP4V | ('M', 'P', '4', 'V') | .mp4 |
DIV3 | ('D', 'I', 'V', '3') | .avi |
DIVX | ('D', 'I', 'V', 'X') | .avi |
I420 | ('I', '4', '2', '0') | .avi |
IYUV | ('I', 'Y', 'U', 'V') | .avi |
MJPG | ('M', 'J', 'P', 'G') | .avi |
PIM1 | ('P', 'I', 'M', '1') | .avi |
XVID | ('X', 'V', 'I', 'D') | .avi |
dv25 | ('d', 'v', '2', '5') | .wmv |
dv50 | ('d', 'v', '5', '0') | .wmv |
dvc | ('d', 'v', 'c', ' ') | .wmv |
dvh1 | ('d', 'v', 'h', '1') | .wmv |
dvhd | ('d', 'v', 'h', 'd') | .wmv |
dvsd | ('d', 'v', 's', 'd') | .wmv |
dvsl | ('d', 'v', 's', 'l') | .wmv |
H263 | ('H', '2', '6', '3') | .wmv |
M4S2 | ('M', '4', 'S', '2') | .wmv |
MP43 | ('M', 'P', '4', '3') | .wmv |
MPG1 | ('M', 'P', 'G', '1') | .wmv |
MSS1 | ('M', 'S', 'S', '1') | .wmv |
MSS2 | ('M', 'S', 'S', '2') | .wmv |
WMV1 | ('W', 'M', 'V', '1') | .wmv |
WMV2 | ('W', 'M', 'V', '2') | .wmv |
WMV3 | ('W', 'M', 'V', '3') | .wmv |
WVC1 | ('W', 'V', 'C', '1') | .wmv |
mp4v | ('m', 'p', '4', 'v') | .mov |
サンプルプログラム
下記のサンプルプログラムは『C:\log\』にある『0000000.jpg』『0000001.jpg』『0000002.jpg』...といった画像を一つの動画にして『C:\Users\shibafu\Documents\OutVideo.wmv』というファイルに出力するプログラムです。
#include "opencv2/highgui.hpp" #include "opencv2/Videoio.hpp" #include <opencv2/core.hpp> #include <stdio.h> #include <iostream> using namespace std; using namespace cv; int main(){ //出力する動画ファイルの設定をします。拡張子はWMV1で、毎秒15フレーム、画像縦横サイズは1024*1024。 VideoWriter writer("C:\\Users\\shibafu\\Documents\\OutVideo.wmv", VideoWriter::fourcc('W', 'M', 'V', '1'), 15.0, Size(1024, 1024)); //動画ファイルがちゃんと作れたかの判定。 if (!writer.isOpened()){ return -1; } //動画にする画像の名前を入れる文字配列。 char image_name[100]; //動画にする画像を入れるMat。 Mat image; //『0000000.jpg』から『0001000.jpg』までの画像を動画にしていく。 for (int i = 0; i < 1001; i++){ //画像の名前を更新。 sprintf(image_name, "C:\\log\\%07d.jpg", i); //名前に対応した画像を取り込み。 image = imread(image_name); //画像がなければ処理を飛ばす。 if (image.empty()) { cout << "no image : " << image_name << endl; continue; } //動画ファイルに画像を出力。 writer << image; } return 0; }