C# 从视频中获取图像

C# 从视频中获取图像,c#,.net,video-processing,aforge,C#,.net,Video Processing,Aforge,我正在尝试编写一个应用程序,可以访问连接到PC的摄像头,录制视频,并从视频中获取图像。我使用Forge.NET库访问摄像头: 我不知道名为AForge.Video.NewFrameEventHandler的事件是如何工作的。在此代码中,事件将位图返回null,而不是视频中的新帧,或者不调用事件。我希望每次帧都能从视频中获取帧到图片框,以生成类似视频流的内容,单击停止按钮后,我希望最后一幅图像保持显示在图片框中。有人知道怎么做吗?为什么我的代码不起作用 代码: 类似的代码如下:^] 在Window

我正在尝试编写一个应用程序,可以访问连接到PC的摄像头,录制视频,并从视频中获取图像。我使用Forge.NET库访问摄像头:

我不知道名为AForge.Video.NewFrameEventHandler的事件是如何工作的。在此代码中,事件将位图返回null,而不是视频中的新帧,或者不调用事件。我希望每次帧都能从视频中获取帧到图片框,以生成类似视频流的内容,单击停止按钮后,我希望最后一幅图像保持显示在图片框中。有人知道怎么做吗?为什么我的代码不起作用

代码:

类似的代码如下:^]

在Windows窗体中,我在执行以下方法的线程中运行此视频:

private void VideoRecording()
    {
        camImg.videoSource.Start();

        while (!StopVideo)
        {
            pictureBox1.Image = camImg.bitmap;
            pictureBox1.Invalidate();
        }
        camImg.videoSource.Stop();

    }

一种方法是去,它可以为你做的工作。我曾经参与过两个项目,它们使用这种方法从上传的视频中获取缩略图和/或静态图片。这会让人感觉有点不舒服,但它应该可以工作。

如果我没记错的话,位图需要立即复制,因为它在事件发生后会被覆盖。在这里使用引用是不好的。尝试以下方法:

private void video_NewFrame( object sender, NewFrameEventArgs eventArgs )
{
    // copy the new frame
    bitmap = new Bitmap(eventArgs.Frame);
    // process the frame
}

此外,您不应该为此使用额外的线程,因为Forge已经这样做了

  • 呼叫启动(例如,在加载事件中或按下按钮后)
  • 处理帧事件

    private void VideoStream_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
    {
        Bitmap newFrame = new Bitmap(eventArgs.Frame);
        pictureBox1.Image = newFrame;
    }
    
  • 呼叫停止(关闭事件或按钮)

  • 如果您遇到WinForm控件的问题,例如标签,您需要知道这些控件是在另一个线程上创建的,您需要使用Invoke。例如:

    label_ms.Invoke((MethodInvoker)(() => label_ms.Text = msTimeSpan.TotalMilliseconds.ToString()));
    
    您最好的选择是查看该框架附带的一个大型示例:

    我将Aforge视频库与我的FOSCAM一起使用,它工作得非常好。 下面是我的事件处理程序代码

    private void Video_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            //Create Bitmap from frame
            Bitmap FrameData = new Bitmap(eventArgs.Frame);
            //Add to PictureBox
            PictureBox.Image = FrameData;
        }
    

    NET使用本机DirectShow API访问视频捕获硬件。您可能想看看library,它是.NET应用程序和视频捕获API之间使用最广泛的“桥梁”。
    label_ms.Invoke((MethodInvoker)(() => label_ms.Text = msTimeSpan.TotalMilliseconds.ToString()));
    
    private void Video_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            //Create Bitmap from frame
            Bitmap FrameData = new Bitmap(eventArgs.Frame);
            //Add to PictureBox
            PictureBox.Image = FrameData;
        }