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
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。