えまログ

機械学習、プログラミング、数学に関する記事を書いていきます。

動画ファイルから指定フレームをキャプチャする方法

C++で画像処理をされる方が多いからか、C#OpenCVを使う記事がなかなか見つからなくて困っています。

自分が苦労したことを共有し、誰かの助けになれば幸いです。

今回は、OpenCVSharpを使って、動画ファイルから指定したフレームの画像を取得する方法を紹介いたします。

サンプルコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace CaptureFrame
{
    class Capture
    {
        static void Main(string[] args)
        {
            // vtest.avi ファイルの500フレーム画像を取得する
            var frame = CaptureFrame("vtest.avi", 500);
            if (0 < frame.Width && 0 < frame.Height)
            {
                Cv2.ImShow("frame", frame);
                Cv2.WaitKey(0);
            }
        }

        static Mat CaptureFrame(string fileName, int frameNo)
        {
            var frame = new Mat();
            using (var videoCapture = new VideoCapture(fileName))
            {
                // 次にキャプチャされるフレームのインデックスを
                // 引数で受け取ったフレーム番号にセットする
                videoCapture.Set(CaptureProperty.PosFrames, frameNo);
                videoCapture.Read(frame);
            }
            return frame;
        }
    }
}

結果

目的の画像が表示されました!

注意

①Dispose漏れ

VideoCaptureを使用したあとは、必ずDisposeしましょう!
Disposeし忘れを防止するために、usingステートメントを使用することを勧めます!

②フレーム開始番号

フレームの番号は0から始まります。 サンプルコードではフレーム番号を500と指定しています。 よって、動画の最初のフレームから501番目のフレームを取得していることになります。

動画

動画は以下からダウンロードしました。 github.com

参考記事

動画を扱う — OpenCV-Python Tutorials 1 documentation www.sejuku.net