らくの遊び場

プログラムでやったことを自由に描いていきます。C++/C#/Python/OpenCV/Tensorflow/Unity

【OpenCVSharp】VideoWriterを使用して動画をカットして書き出す

概要

OpenCVSharpを使用して読み込んだ動画の一部をカットして書き出す必要があったので メモとして

環境

  • Windows 10
  • OpenCVSharp3 4.0.0
  • VisualStudio2017

実装

    string path = "パス";
    int startFrame = 0;
    int endFrame = 500;

    public void Start(MovieInfo info)
    {
        Thread.CurrentThread.IsBackground = false;
        ThreadPool.QueueUserWorkItem(this.WriteMovie);
    }

    private void WriteMovie(object state)
    {
        // 動画を開く
        var capture = new VideoCapture(path);
        // whileで回して切り分ける
        using (VideoWriter vw = new VideoWriter("test.avi", FourCC.XVID, 30, new Size(capture.FrameWidth, capture.FrameHeight)))
        using (var img = new Mat())
        {
            capture.PosFrames = startFrame;
            for (int i = 0; i < endFrame - startFrame; i++)
            {
                // 動画を読み込む
                capture.Read(img);
                if (img.Empty())
                    break;
                 vw.Write(img);
            }
        }
    }

解説

動画を書き出す関数 WriteMovieをThredPoolで読み出しています。

using (VideoWriter vw = new VideoWriter("test.avi", FourCC.XVID, 30, new Size(capture.FrameWidth, capture.FrameHeight)))

でVideoWriterを定義しています。 第一引数が書き出す動画のファイルネーム 第二引数が圧縮方法 第三引数がFPS 第四引数が書き出しの動画サイズ になっています。

vw.Write(img);

が呼ばれるたびに、動画の最後尾にフレームが追加されていきます。