質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

3回答

6785閲覧

OpenCvSharpでAVIファイルを出力したが早送り映像になってしまう

mika33532

総合スコア27

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2021/08/21 07:56

OpenCV初心者です。
c# フォームアプリで、カメラ映像をAVIファイルに出力するコードを書いたのですが、AVIファイルは出力されるのですが、早送り画像になってしまいます。
これを修正したいのですが、どのようにすればよいか教えていただけませんでしょうか。
よろしくお願いいたします。

コードは以下の通りです。
こちらのページにあるサンプルコードをベースにOpenCVSharp4用に書き換えております。
http://sssignal.web.fc2.com/column/column21.html

.Net Core 3.1です。
NuGetで、OpenCvSharp4とOpenCvSharp4.Windowsをインストールしております。

C#

1using OpenCvSharp; 2using System; 3using System.Collections.Generic; 4using System.ComponentModel; 5using System.Data; 6using System.Drawing; 7using System.Linq; 8using System.Text; 9using System.Threading.Tasks; 10using System.Windows.Forms; 11 12namespace OpenCvSharpTest2 { 13 public partial class Form1 : Form { 14 15 BackgroundWorker worker; 16 VideoWriter video; 17 18 public Form1() { 19 InitializeComponent(); 20 21 worker = new BackgroundWorker(); 22 23 // 非同期をキャンセルさせる 24 worker.WorkerSupportsCancellation = true; 25 26 // ProgressChangedイベントを発生させるようにする 27 worker.WorkerReportsProgress = true; 28 29 // ReportProgressメソッドで呼ばれるProgressChangedのイベントハンドラを追加 30 worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); 31 32 // RunWorkerAsyncメソッドで呼ばれるDoWorkに、 33 // 別スレッドでUSBカメラの画像を取得し続けるイベントハンドラを追加 34 worker.DoWork += new DoWorkEventHandler(worker_DoWork); 35 } 36 37 private const int WIDTH = 640; 38 private const int HEIGHT = 480; 39 40 private void worker_DoWork(object sender, DoWorkEventArgs e) { 41 // カメラからの映像を受け取る 42 using (var capture = new VideoCapture(0)) { 43 44 //カメラ画像取得用のVideoCapture作成 45 capture.FrameWidth = WIDTH; 46 capture.FrameHeight = HEIGHT; 47 48 Mat frame = new Mat(HEIGHT, WIDTH, MatType.CV_8UC3); 49 while (true) { 50 capture.Read(frame); 51 52 // 新しい画像を取得したので、 53 // ReportProgressメソッドを使って、ProgressChangedイベントを発生させる 54 worker.ReportProgress(0, frame); 55 } 56 } 57 } 58 59 private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { 60 // frameがe.UserStateプロパティにセットされて渡されてくる 61 Mat frame = (Mat)e.UserState; 62 63 OpenCvSharp.Size size = new OpenCvSharp.Size(WIDTH, HEIGHT); 64 65 if (label1.Text == "Rec") { 66 // 動画ファイルに書き込み 67 video.Write(frame); 68 } 69 var bmp = new Bitmap(frame.Cols, frame.Rows, (int)frame.Step(), System.Drawing.Imaging.PixelFormat.Format24bppRgb, frame.Data); 70 71 pictureBox1.Image = bmp; 72 } 73 74 75 private void Form1_Load(object sender, EventArgs e) { 76 77 // .aviファイルを開く 78 video = new VideoWriter("video.avi", FourCC.MJPG, 60, new OpenCvSharp.Size(WIDTH, HEIGHT)); 79 80 // DoWorkイベントハンドラの実行を開始 81 worker.RunWorkerAsync(); 82 } 83 84 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { 85 // 動画ファイルを閉じる 86 video.Dispose(); 87 } 88 89 private void buttonRec_Click(object sender, EventArgs e) { 90 label1.Text = "Rec"; 91 } 92 93 private void buttonStop_Click(object sender, EventArgs e) { 94 label1.Text = "Stop"; 95 } 96 } 97} 98

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

早送り画像になってしまいます

C#

1video = new VideoWriter("video.avi", FourCC.MJPG, 60, new OpenCvSharp.Size(WIDTH, HEIGHT));

で出力側は60fps指定していますが、キャプチャ側はfps指定していないのでおそらく60fps未満なのでしょう。
キャプチャした画像をそのまま一対一で出力すると、作成される動画ファイルは(出力側fps/キャプチャ側fps)倍速となります。

使用されているカメラは640x480での60fps出力に対応していますか?
対応しているなら60fps指定を追加してみてください。

diff

1//カメラ画像取得用のVideoCapture作成 2capture.FrameWidth = WIDTH; 3capture.FrameHeight = HEIGHT; 4+capture.Fps = 60;

投稿2021/08/21 08:16

編集2021/08/21 08:44
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

投稿2021/08/21 08:15

Soogle44

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

早速ありがとうございます。
試してみます。

あと自分でも調べてみたのですが、VideoWriter()で60fpsと指定してるので、
1秒あたり60回video_.Write()でフレームを書き込まないといけないんですよね。
これで秒数を表示してみたらきちんと表示されました。

投稿2021/08/21 08:28

mika33532

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問