とりあえずOpenCvSharpで遊んでる。で、タイトルの件。
特に難しいことはない
Thread t; readonly int CameraIndex; public Form1() { InitializeComponent(); CameraIndex = 0; t = new Thread(new ThreadStart(ImageLoad)); t.IsBackground = true; t.Start(); } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { t.Abort(); } private void ImageLoad() { using (CvCapture cap = Cv.CreateCameraCapture(CameraIndex)) { while (true) { using (IplImage img = cap.QueryFrame()) { Bitmap bmp = BitmapConverter.ToBitmap(img); if (pictureBox1.Image != null) { pictureBox1.Image.Dispose(); } pictureBox1.Image = bmp; } } } }
ロード時にバックグラウンドスレッドを作ってFormClosedの時に止める。バックグラウンドスレッドの中ではキャプチャを作って無限ループで読み込みと表示を行う。
OpenCvのWindowを使うときにはCv.WaitKeyが必要だが、Formに表示するなら不要。QueryFrameで適切にウエイトが入る。というかカメラが1コマ撮影しないとスレッドに処理が返らない。カメラの性能に左右されるが、数fps-数十fpsくらいで安定する。これはカメラや帯域以外にも、光量にも依存する。つまり周りが暗いとカメラはシャッタースピードを遅くする必要があるから、FPSが稼げなくなる。
ただしCaptureがカメラではなく動画ファイルとかで、リアルタイムに表示する必要があるならcap.Fpsを使って適切なディレイを設定すること。ただThreadのSleepとかはあまり正確ではないので、例えば1時間の動画ファイルをちょうど1時間で表示しなければいけない場合などは工夫が必要。
OpenCvSharpの動作確認とかで途中の画像を出力したい場合もBitmapConverter.ToBitmapでC#が扱える画像に変換してPictureBoxに渡してやればOK。
0 件のコメント:
コメントを投稿