返り値の型 | メソッド名 | 説明 |
---|---|---|
コンストラクタ |
cv::VideoWriter(const String& filename , int fourcc , double fps , cv::Size frameSize , bool isColor = true ) |
コンストラクタ。 引数
|
bool | isOpened() | VideoWriterが正しく初期化されているか。 |
void | write(const cv::Mat& image ) | image をビデオフレームとしてストリームに書き込む。 |
VideoWriter& | operator<<(const cv::Mat& image ) | image をビデオフレームとしてストリームに書き込む。 |
void | release() | VideoWriter をcloseする。 |
OpenCVには複数のcv::Matから動画を作成する cv::VideoWriter が存在します。 cv::VideoWriter が対応している動画形式のうち、 いろいろなプラットホームで再生可能なのは ".avi" ファイルです。 ただし、書き込む画像 cv::Mat の形式は BGRA では駄目で、BGR に変換する必要があります。 また、解像度も変換して小さくする必要があります。
NtKinect kinect; cv::Size sz(640,480); cv::VideoWriter vw("videofile.avi", CV_FOURCC_MACRO('X','V','I','D'), 20.0, sz, true); if (! vw.isOpened()) throw runtime_error("cannot create videowriter"); cv:Mat img ; // 新しい cv::Mat を用意して while (1) { kinect.setRGB(); cv::resize(kinect.rgbImage, img, sz, 0, 0); // 解像度を 640x480 に変換する cv::cvtColor(kinect.rgbImage, img , CV_BGRA2BGR); // BGRAからBGRへ変換する vw << img; // vw.write(img) と同じ ... } vw.release(); |
cv::VideoWriter を用意します。
kinect.setRGB()メソッドを呼び出して kinect.rgbImage にRGB画像を設定します。 kinect.rgbImage の各画素は BGRA フォマットであるので、これを BGR フォーマットに変換してから cv::VideoWriter に write します。
日付と時刻をファイル名とする avi ファイルを生成します。
コメントアウトしてある部分を使うと mp4 ファイルを生成します。 が、私の手元ではここで生成した mp4 ファイルは、再生できるシステム Windows10 とできないシステム Windows8 がありました。aviファイルの方がサイズは大きくなりますが、問題は起こりにくいようです。
main.cpp |
#include <iostream> #include <sstream> #include "NtKinect.h" using namespace std; #include <time.h> string now() { char s[1024]; time_t t = time(NULL); struct tm lnow; localtime_s(&lnow, &t); sprintf_s(s, "%04d-%02d-%02d_%02d-%02d-%02d", lnow.tm_year + 1900, lnow.tm_mon + 1, lnow.tm_mday, lnow.tm_hour, lnow.tm_min, lnow.tm_sec); return string(s); } void doJob() { NtKinect kinect; cv::VideoWriter vw; int scale = 1; cv::Size sz(1920/scale,1080/scale); bool onSave = false; cv::Mat img; while (1) { kinect.setRGB(); if (onSave) { cv::resize(kinect.rgbImage, img, sz, 0, 0); cv::cvtColor(img, img, CV_BGRA2BGR); vw << img; } cv::imshow("rgb", kinect.rgbImage); auto key = cv::waitKey(33); if (key == 'q') break; else if (key == 'r' && !onSave) { vw = cv::VideoWriter(now()+".avi",CV_FOURCC_MACRO('X','V','I','D'), 30.0, sz); //vw = cv::VideoWriter(now()+".mp4",CV_FOURCC_MACRO('F','M','P','4'), 30.0, sz); //vw = cv::VideoWriter(now()+".mp4",CV_FOURCC_MACRO('M','P','4','V'), 30.0, sz); if (!vw.isOpened()) throw runtime_error("cannot create video file"); onSave = true; } else if (key == 's' && onSave) { vw.release(); onSave = false; } } cv::destroyAllWindows(); } int main(int argc, char** argv) { try { doJob(); } catch (exception &ex) { cout << ex.what() << endl; string s; cin >> s; } return 0; } |
"日付時刻.avi" が KinectV2_video/KinectV2/ の下にできています。
上記のzipファイルには必ずしも最新の NtKinect.h が含まれていない場合があるので、 こちらから最新版をダウンロードして 差し替えてお使い下さい。