はじめに
以前の記事で動画の読み込み及び処理について説明しました。
今回はOpenCVでの動画の書き込みについて説明していきます。
VideoWriter
VideoWriterは動画の書き込み用のクラスです。OpenCVで動画を書き込み際にはこのクラスを使います。
次のようにしてオブジェクトを生成します。
cv::VideoWriter オブジェクト名(ファイル名, FOURCC, フレームレート, 解像度,カラー);
FOURCC
FOURCCは動画のフォーマットを識別するためのもので、画像とは違い動画を書き込む際にはこれの指定が必要です。
動画の種類との対応についてはこちらに一覧が載っているので参照してください。
また「VideoWriter」では次のようにしてFOURCCを指定する必要があります(ここではMP4形式の動画を指定しています)。
cv::VideoWriter::fourcc('M','P','4','V')
また、FOURCCは「int型」で保存されるので、次のようにして変数に格納しておくことができます。
int 変数名 = cv::VideoWriter::fourcc('M','P','4','V');
フレームレート
フレームレートは「double型」で指定します。
また、読み込んだ動画ファイルのフレームレートは次のようにして取得できます。
VideoCaptureオブジェクト.get(cv::CAP_PROP_FPS);
解像度
解像度は次のようにして指定します。
cv::Size(width, height)
widthが幅、heightが高さです。
読み込んだ動画ファイルの幅、及び高さは次のようにして取得できます。
幅
VideoCaptureオブジェクト.get(cv::CAP_PROP_FRAME_WIDTH)
高さ
VideoCaptureオブジェクト.get(cv::CAP_PROP_FRAME_HEIGHT)
カラー
「1」で「カラー」。
「0」で「グレースケール」。
という指定をします。これが間違っているとうまく出力されません。
書き込み
書き込みは次のように、出力演算子で1フレーム毎に画像情報を書き込み用のオブジェクトに出力することで画像1枚1枚を順番に格納できます(当たり前ですが動画は画像の集まりです)。
VideoWriterオブジェクト << Matオブジェクト;
ソースコード
#include <iostream> #include <opencv2/opencv.hpp> int main() { cv::VideoCapture video("input.mp4"); //動画の読み込み if(!video.isOpened()){ //エラー処理 std::cout << "video.error" << std::endl; return -1; } cv::Mat frame,gray,canny; //フレーム格納用 int fourcc = cv::VideoWriter::fourcc('M','P','4','V'); double fps = video.get(cv::CAP_PROP_FPS); //動画からfpsを取得 int width = video.get(cv::CAP_PROP_FRAME_WIDTH); //動画から幅を取得 int height = video.get(cv::CAP_PROP_FRAME_HEIGHT); //動画から高さを取得 cv::VideoWriter output("output.mp4", fourcc, fps, cv::Size(width, height),0); //出力用のオブジェクト while(video.read(frame)){ //ループ cvtColor(frame, gray, cv::COLOR_RGB2GRAY); //グレースケール化 Canny(gray,canny, 50, 200); //エッジ検出 output << canny; //フレームを書き込み int key = cv::waitKey(1); if(key == 'q'){ cv::destroyWindow("canny"); video.release(); break; //whileループから抜ける } } return 0; }
最後に
OpenCVの公式サイトはこちらです。
困ったときはこのサイトを見たら大体解決します。このサイトを見て解決しないときはOpenCVじゃどうにもならないです。
コメント