OpenCVでH.264圧縮を使用してビデオファイルを書き込む
OpenCVのVideoWriterクラスでH.264圧縮を使用してビデオを書き込むにはどうすればよいですか?私は基本的にウェブカメラからビデオを取得し、キャラクターが押された後に保存したいです。 MPEG4パート2圧縮を使用する場合、出力ビデオファイルは非常に大きくなります。
もちろんVideoWriter
クラスを使用できますが、H264標準を表す 正しいFourCCコード を使用する必要があります。 FourCCは、Four Character Codeの略で、メディアファイルで使用されるビデオコーデック、圧縮形式、色またはピクセル形式の識別子です。
具体的には、VideoWriter
オブジェクトを作成するときに、構築時にFourCCコードを指定します。詳細については、OpenCVのドキュメントを参照してください。 http://docs.opencv.org/trunk/modules/highgui/doc/reading_and_writing_images_and_video.html#videowriter-videowriter
私はあなたがC++を使用していると仮定しているので、VideoWriter
コンストラクタの定義は次のとおりです。
VideoWriter::VideoWriter(const String& filename, int fourcc,
double fps, Size frameSize, bool isColor=true)
filename
はビデオファイルの出力、fourcc
は使用するコードのFourCCコード、fps
は目的のフレームレート、frameSize
は、ビデオの目的のサイズであり、isColor
は、ビデオをカラーにするかどうかを指定します。 FourCCは4文字を使用しますが、OpenCVにはFourCCを解析し、単一の整数IDを出力するユーティリティがあります。これは、正しいビデオ形式をファイルに書き込むためのルックアップとして使用されます。 CV_FOURCC
関数を使用し、4つの単一文字を指定します。それぞれが、必要なコーデックのFourCCコードの単一文字に対応します。
具体的には、次のように呼び出します。
int fourcc = CV_FOURCC('X', 'X', 'X', 'X');
X
をFourCCに属する各文字に(順番に)置き換えます。 H264標準が必要なため、次のようにVideoWriter
オブジェクトを作成します。
#include <iostream> // for standard I/O
#include <string> // for strings
#include <opencv2/core/core.hpp> // Basic OpenCV structures (cv::Mat)
#include <opencv2/highgui/highgui.hpp> // Video write
using namespace std;
using namespace cv;
int main()
{
VideoWriter outputVideo; // For writing the video
int width = ...; // Declare width here
int height = ...; // Declare height here
Size S = Size(width, height); // Declare Size structure
// Open up the video for writing
const string filename = ...; // Declare name of file here
// Declare FourCC code
int fourcc = CV_FOURCC('H','2','6','4');
// Declare FPS here
int fps = ...;
outputVideo.open(filename, fourcc, fps, S);
// Put your processing code here
// ...
// Logic to write frames here... see below for more details
// ...
return 0;
}
または、VideoWriter
オブジェクトを宣言するときにこれを行うこともできます。
VideoWriter outputVideo(filename, fourcc, fps, S);
上記を使用する場合、open
を呼び出す必要はありません。これにより、フレームをファイルに書き込むためのライターが自動的に開かれます。
コンピューターでH.264がサポートされているかどうかわからない場合は、-1
をFourCCコードとして指定すると、使用可能なすべてのビデオコーデックを表示するコードを実行するときにウィンドウがポップアップするはずです。コンピューター。これはWindowsでのみ機能することを言及したいと思います。 LinuxまたはMac OSでは、-1
を指定したときにこのウィンドウがポップアップ表示されません。言い換えると:
VideoWriter outputVideo(filename, -1, fps, S);
H.264がコンピューターに存在しない場合、最適なものを選択できます。それが完了すると、OpenCVはVideoWriter
コンストラクターに入力する適切なFourCCコードを作成し、そのタイプのビデオをファイルに書き込むVideoWriter
を表すVideoWriterインスタンスを取得します。
ファイルへの書き込み用にfrm
に保存されたフレームの準備ができたら、次のいずれかを実行できます。
outputVideo << frm;
OR
outputVideo.write(frm);
ボーナスとして、OpenCVでビデオを読み書きする方法のチュートリアルを次に示します。 http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html -ただし、Python用に書かれていますが、リンクの一番下にあるのは知っておくべきことです。各オペレーティングシステムで動作することがわかっているFourCCコードのリストがあります。ところで、彼らがH264標準に指定するFourCCコードは実際には'X','2','6','4'
なので、'H','2','6','4'
が機能しない場合は、H
をX
に置き換えます。
別の小さなメモ。 Mac OSを使用している場合、使用する必要があるのは'A','V','C','1'
または'M','P','4','V'
です。経験から、'H','2','6','4'
または'X','2','6','4'
FourCCコードを指定しようとしても機能しないようです。