動画ファイルから指定フレームをキャプチャする方法
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