【OpenCvSharp】動画をループし任意タイミング画像をキャプチャ!【C#】

  • 2022.11.30
  • C#
【OpenCvSharp】動画をループし任意タイミング画像をキャプチャ!【C#】
【OpenCvSharp】動画をループし任意タイミング画像をキャプチャ!【C#】

 

 
読了目安:354

Are you want to translate this page to English? Please click this link to translate via ‘©Google Translate'!

ganohr.net favicon

みなさんこんにちは! ガノー(Ganohr)です! (≧▽≦)

前回公開した『MovieToImage』(解説・無料ダウンロード)、導入したでしょうか?

今回は、開発したアプリケーションの中核となる処理である、

C#で動画をループしながら複数画像をキャプチャする方法

を、解説します!

 

サムネイル【無料ツール】動画キャプチャ画像保存ツールMovieToImage公開動画編集のお供に。動画の内容を一定時間間隔でキャプチャし、ファイル名に動画の位置を設定して出力。エクスプローラのプレビューを活用すれば「あのシーンどこだっけ?」を簡単に探せるようになる。 ... 続きを読むganohr.net2019-07-01 サムネイル【OpenCvSharp】C#で動画の任意フレームをキャプチャする方法‘OpenCvSharp’(解説)を用いて動画の任意フレームを取得しファイルとして保存する方法を解説します.※本記事は『OpenCvSharpV4』を対象にしています.基礎知識OpenCV(解説)は画像処理用のフレームワークですのでカメラからの入力や動画からの入力も対象になっています.この機能を用いて動画の任意フレームの画像をキャプチャしてMat型のインスタンスとして取得できます.その上でBitmapConverterによってBitmap型へコンバートしファイルへ出力します. ... 続きを読むganohr.net2019-06-27 サムネイル【OpenCvSharp】2019年環境でC#からOpenCVを利用する【Hello World】『OpenCV』を『.Net Framework』から使用するラッパーフレームワークの『OpenCvSharp』。2019年最新環境で使用するための情報を網羅的に解説。サンプルコードはCライクな実装からC#ライクな実装まで目的別に3つ解説。ダウンロード可能 ... 続きを読むganohr.net2019-06-23
 
更新履歴
2022/11/29 サンプルコードの改行が崩れていたので修正
2019/07/04 公開
 

OpenCVやOpenCvSharpとはなにか?

デジタル一眼レフカメラ
デジタル一眼レフカメラ

OpenCVとはなにか?


OpenCV’は、画像処理用のマルチプラットフォームなフレームワークです。

※ より詳細な解説は以下からお読みください。

サムネイル【OpenCvSharp】2019年環境でC#からOpenCVを利用する【Hello World】『OpenCV』を『.Net Framework』から使用するラッパーフレームワークの『OpenCvSharp』。2019年最新環境で使用するための情報を網羅的に解説。サンプルコードはCライクな実装からC#ライクな実装まで目的別に3つ解説。ダウンロード可能 ... 続きを読むganohr.net2019-06-23

 

OpenCvSharpとはなにか?

OpenCvSharp’は、日本人開発者であるSchima氏(ブログ)による、OpenCVのC#用ラッパーフレームワークです。

OpenCVに習ったコーディングとともに、C#らしいコーディングが可能になったフレームワークです。

※ より詳細な解説は以下からお読みください。

サムネイル【OpenCvSharp】2019年環境でC#からOpenCVを利用する【Hello World】『OpenCV』を『.Net Framework』から使用するラッパーフレームワークの『OpenCvSharp』。2019年最新環境で使用するための情報を網羅的に解説。サンプルコードはCライクな実装からC#ライクな実装まで目的別に3つ解説。ダウンロード可能 ... 続きを読むganohr.net2019-06-23

OpenCvSharpで動画から画像をキャプチャーする方法

映画のフィルム(動画・映画は複数の写真を連続再生したものである・概念的な写真)
OpenCvSharpを用いれば、動画から任意の画像をキャプチャーするのは簡単

OpenCVが画像認識技術のためのフレームワークであることは前述の通りです。

OpenCVはカメラからの画像取り込みや、動画ファイルからの画像取り込みなども可能になっています。

今回はその特徴である「動画ファイルからの画像取り込みを行う機能」を利用して、動画ファイルからのキャプチャを行います。

 

OpenCVで動画ファイルから画像を取り込むための手順は、非常に簡単です。

そのラッパーフレームワークであるOpenCvSharpも、同様に簡単です。

具体的には以下のステップで行います。

  1. Mat型で、画像を取り込むための変数を定義する
  2. VideoCaptureクラスのインスタンスを生成する
  3. VideoCaptureのインスタンスを用いて、動画を読み込む
  4. VideoCaptureのインスタンスに画像を取り込む位置やオプションを指定する
  5. VideoCaptureのインスタンスで実際に画像をキャプチャする
  6. 定義したMat型のインスタンスと、VideoCaptureインスタンスを開放する

※ より詳細な解説は以下からお読みください。

サムネイル【OpenCvSharp】C#で動画の任意フレームをキャプチャする方法‘OpenCvSharp’(解説)を用いて動画の任意フレームを取得しファイルとして保存する方法を解説します.※本記事は『OpenCvSharpV4』を対象にしています.基礎知識OpenCV(解説)は画像処理用のフレームワークですのでカメラからの入力や動画からの入力も対象になっています.この機能を用いて動画の任意フレームの画像をキャプチャしてMat型のインスタンスとして取得できます.その上でBitmapConverterによってBitmap型へコンバートしファイルへ出力します. ... 続きを読むganohr.net2019-06-27

OpenCvSharpで動画をループして任意の位置の画像をキャプチャする

高層域からの航空写真
動画を繰り返し処理して、複数の画像を一括でキャプチャーしよう

では、実際に動画をループしながらキャプチャーしてみましょう。

ここでは簡単にするため「動画の先頭1000フレーム目から、最後の1000フレーム手前までを、動画の10秒分のフレーム毎にキャプチャーする」ことにします。

サンプルコード

実際の実行例

OpenCvSharpのサンプル実行例1
OpenCvSharpを用いて、サンプルで生成した画像の一覧。

using定義

using System;
using OpenCvSharp;

メイン処理

static void Main(string[] args)
{
    using (var img = new Mat())
    using (var capture = new VideoCapture(@"d:\test.mp4"))
    {
        for (int pos = 1000; pos < capture.FrameCount - 1000; pos += (int)capture.Fps * 10)
        {
            capture.PosFrames = pos;
            capture.Read(img);
            img.SaveImage(string.Format(@"d:\temp\img\img_{0}.png", pos));
        }
    }
}

解説

  • Mat型を定義し、画像をキャプチャし保存する際に使用します
  • VideoCaptureを生成し、動画のキャプチャを行う際に使用します
  • Mat型もVideoCapture型も、usingブロックusing () {~})を用いることで、自動解放されます
  • ファイルパスの文字列指定には「半角アットマーク記号」(@)を用いることで、エスケープシーケンスを無効化しています
  • ループ処理は、フレーム番号を直接指定するため、開始フレームを1000フレーム、終了フレームを全体フレーム数を表すcapture.FrameCountの値から1000を減算した範囲を指定しています。
  • ループ間隔はcapture.Fpsにより取得しています。
  • capture.Fpsdouble型の値を返すため、int型へキャストしています。
  • ファイルへの保存はimg.SaveImage(~);を用いています。
  • ファイル名の生成には、string.Format(書式文字列, 変数)を用いています。
  • 拡張子」として「.png」を指定することで、‘PNG画像’として保存しています。
  • これを「.bmp」等に変えれば、任意の画像形式で保存できます。

留意点

OpenCvSharpでの動画再生位置の指定は、大まかに分けて以下の2つから選択できます。

  • フレーム番号による指定
  • ミリ秒による指定

 

動画の全体時間を示すcapture.FrameCountですが、実はバグがあります。

このバグに関しては以下の記事をお読みください。

サムネイル【OpenCvSharp】C#で動画の任意フレームをキャプチャする方法‘OpenCvSharp’(解説)を用いて動画の任意フレームを取得しファイルとして保存する方法を解説します.※本記事は『OpenCvSharpV4』を対象にしています.基礎知識OpenCV(解説)は画像処理用のフレームワークですのでカメラからの入力や動画からの入力も対象になっています.この機能を用いて動画の任意フレームの画像をキャプチャしてMat型のインスタンスとして取得できます.その上でBitmapConverterによってBitmap型へコンバートしファイルへ出力します. ... 続きを読むganohr.net2019-06-27

 

ミリ秒による指定を行う場合、このバグについて理解していないとなりません。

ミリ秒による指定の仕方は、次節にサンプルを提示します。

ミリ秒を指定して動画をループしながらキャプチャーする方法

フレーム番号を用いず、時間を指定して動画をループしながらキャプチャーしてみましょう。

方法は先の例と同じですので、usingによる参照の定義は省略します。

また、簡単にするため「動画の先頭10秒目のフレームから、最後から10秒手前のフレームまでを、30秒おきにキャプチャーする」こととします。

サンプルコード

実際の実行例

OpenCvSharpのサンプル実行例2
OpenCvSharpを用いて、サンプルで生成した画像の一覧。ファイル名に時間を設定している。

コード

const int MSEC_FOR_TENSEC = 10000;
static void Main(string[] args)
{
    using (var img = new Mat())
    using (var capture = new VideoCapture(@"d:\test.mp4"))
    {
        capture.PosFrames = capture.FrameCount - 2;
        var lastms = capture.PosMsec - MSEC_FOR_TENSEC;

        for (int pos_ms = 0; pos_ms < lastms; pos_ms += MSEC_FOR_TENSEC * 3)         {             capture.PosMsec = pos_ms;             capture.Read(img);             img.SaveImage(                 string.Format(                     @"d:\temp\img\img_{0}.png"                     , new TimeSpan(0, 0, 0, 0, pos_ms).ToString(@"hh\hmm\mss\sfff\m\s")));         }     } }

解説

  • capture.FrameCount - 2が、キャプチャ可能な動画の最終フレームを示します。
  • capture.PosFramesに最終フレーム番号を指定し、その後にcapture.PosMsecの値を取得することで、最終フレームの時間を取得しています。
  • pos_msに、ミリ秒単位によるキャプチャ位置が記憶されます
  • TimeSpanは、時間差を扱うための標準的なクラスです。5つの引数を受け取るコンストラクタの5番目の引数に、ミリ秒を指定できます。
  • TimeSpan.ToString(~)は、ミリ秒指定を独自の書式で文字列へ変換するための定義です。ここでは、「時間」・「」・「」・「ミリ秒」をそれぞれ「h・m・s・ms」という単位を付けて文字列化しています。

 

サムネイル【OpenCvSharp】C#で動画の任意フレームをキャプチャする方法‘OpenCvSharp’(解説)を用いて動画の任意フレームを取得しファイルとして保存する方法を解説します.※本記事は『OpenCvSharpV4』を対象にしています.基礎知識OpenCV(解説)は画像処理用のフレームワークですのでカメラからの入力や動画からの入力も対象になっています.この機能を用いて動画の任意フレームの画像をキャプチャしてMat型のインスタンスとして取得できます.その上でBitmapConverterによってBitmap型へコンバートしファイルへ出力します. ... 続きを読むganohr.net2019-06-27 サムネイルC#でミリ秒を扱う全ての方法。ミリ秒定義、コンバート、マイナス時間までC#でミリ秒による時刻表現を時間へコンバートする方法を解説します.ミリ秒とは‘ミリ秒’とは1秒を1000分割した単位で表現する時間体系です.日本語表記では「ミリ秒」英語表記では「millisecond」単位としては「ms」と表記します.POINTミリ秒を秒へ変換するには1000で割り秒をミリ秒へ変換するには1000倍します.C#での実装ミリ秒を扱う場合大まかに分けて2つの実装が可能です.一つはTimeSpanを用いる方法です.基本的にはこちらでの実装をお勧めします.もう一つは ... 続きを読むganohr.net2019-07-03

最後に

今回の内容は、以下のツールを開発する上で基幹となる技術を解説しています。

本記事が、私と同様に使いやすいツールを開発してくれる方のもとへ届けば幸いです。

サムネイル【無料ツール】動画キャプチャ画像保存ツールMovieToImage公開動画編集のお供に。動画の内容を一定時間間隔でキャプチャし、ファイル名に動画の位置を設定して出力。エクスプローラのプレビューを活用すれば「あのシーンどこだっけ?」を簡単に探せるようになる。 ... 続きを読むganohr.net2019-07-01

WordPressの不具合対応/カスタマイズ¥15,000~

PC歴25年超、SE歴10年超、WordPress運営歴7年超、WordPressエンジニア歴5年超のスキルとノウハウを提供します

当サイト管理人の「ガノー」(Ganohr)は、日本最大手且つ東証一部上場企業が運営するクラウドソーシングサイト『Lancers』にて、認定ランサーとして活動しています。


※ 認定ランサーとはLancersにより様々な能力 ( 高い仕事遂行率・高い顧客満足度・多くの実績、など ) を評価したプロフェッショナルを認定する制度です。

 

C#カテゴリの最新記事