web-dev-qa-db-ja.com

OpenCVでH.264圧縮を使用してビデオファイルを書き込む

OpenCVのVideoWriterクラスでH.264圧縮を使用してビデオを書き込むにはどうすればよいですか?私は基本的にウェブカメラからビデオを取得し、キャラクターが押された後に保存したいです。 MPEG4パート2圧縮を使用する場合、出力ビデオファイルは非常に大きくなります。

12

もちろん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'が機能しない場合は、HXに置き換えます。

別の小さなメモ。 Mac OSを使用している場合、使用する必要があるのは'A','V','C','1'または'M','P','4','V'です。経験から、'H','2','6','4'または'X','2','6','4'FourCCコードを指定しようとしても機能しないようです。

19
rayryeng