5

ビデオやイメージング用にAForgeを試してみることにしたので、この簡単なデモを実装しようとしました。

private void Main_Load(object sender, EventArgs e)
{
        // enumerate video devices
        FilterInfoCollection videoDevices = new FilterInfoCollection(
                        FilterCategory.VideoInputDevice);
        // create video source
        VideoCaptureDevice videoSource = new VideoCaptureDevice(
                        videoDevices[0].MonikerString);
        // set NewFrame event handler
        videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
        // start the video source
        videoSource.Start();
}

private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
        this.pictureBox1.Image = eventArgs.Frame;
}

問題は、私が常にを取得することArgumentExceptionですが、常にすぐに発生するとは限りません。にポップアップ表示されApplication.Run(new Main());ますが、スタックトレースの上部は次のようになります。

  • at System.Drawing.Image.get_Width() at System.Drawing.Image.get_Size()
  • at System.Windows.Forms.PictureBox.ImageRectangleFromSizeMode(PictureBoxSizeMode mode)
  • at System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe)

これが適切かどうかはわかりませんがParamName、例外の属性はnullです。画像の割り当てをtry...catchブロックでラップしようとしましたが、これは役に立ちませんでした。また、割り当て前に画像がnullでないことを確認しました。null以外の、ただし0x0サイズの画像もチェックしました。

私は何を間違えましたか?誰かが回避策を提案できますか?

4

1 に答える 1

5

問題は、渡されたビットマップ(フレーム)のコピーをイベントハンドラーに作成しないことだと思います。

AForgeのドキュメントには次のように書かれています。

ビデオソースには複数のクライアントが存在する可能性があるため、ビデオソースはクライアントに通知した後に独自の元のコピーを破棄するため、各クライアントは渡されたビデオフレームのコピー(複製)を作成する責任があります。

PictureBox したがって、フレームを画像ボックスに直接割り当てると、ビットマップを描画しようとしているときに、AForgeフレームワークによってビットマップが破棄される可能性があります。

于 2012-04-04T17:40:09.400 に答える