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

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

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

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

OpenCV

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

Windows Forms

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

Q&A

解決済

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

mika33532
mika33532

総合スコア27

C#

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

OpenCV

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

Windows Forms

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

3回答

0グッド

0クリップ

3485閲覧

投稿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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答3

1

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

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

mika33532👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

1

投稿2021/08/21 08:15

Soogle44

総合スコア8

mika33532👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

2021/08/21 08:43

こちらの回答が複数のユーザーから「過去の低評価」という指摘を受けました。

0

自己解決

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

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

投稿2021/08/21 08:28

mika33532

総合スコア27

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

OpenCV

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

Windows Forms

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