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异常的属性为空。我尝试将图像分配包装在 try...catch 块中,但这没有帮助。我还检查以确保图像在分配之前不为空。我还检查了非空但 0x0 大小的图像。

我做错了什么?任何人都可以提出解决方法吗?

4

1 回答 1

5

我认为问题在于您没有在事件处理程序中复制传递的位图(帧)。

AForge 文档说:

由于视频源可能有多个客户端,每个客户端负责对传递的视频帧进行复制(克隆),因为视频源在通知客户端后会处理自己的原始副本。

因此,如果您直接将帧分配给图片框,则 AForge 框架可以在PictureBox 尝试绘制位图时处理位图。

于 2012-04-04T17:40:09.400 回答