読者です 読者をやめる 読者になる 読者になる

可変ブログ

色々メモとか。とりあえず自分が分かるように。その後、なるべく人が見て分かるように。可変。

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