如何在c#中从网络摄像头抓取恒定的位图图像流

我们有ac#应用程序,可以对video流进行处理。 这是一个以Bitmap格式接收每个帧的低级应用程序,所以基本上我们每秒需要25个图像。 此应用程序已经适用于我们的一些媒体源,但我们现在需要添加网络摄像头作为输入设备。

因此,我们基本上需要连续捕获网络摄像头中的位图图像,以便我们可以将所有这些帧作为“流”传递给我们的应用程序。

访问网络摄像头的最佳和最简单的方法是什么?直接从网络摄像头读取实际帧作为单独的图像? 我还在起跑线上。

有许多库允许人们访问网络摄像头,在Windows面板上预览网络摄像头的内容,然后使用屏幕捕获再次捕获此图像。 不幸的是,当每秒捕获25帧时,这不会给我们提供必要的性能。 IVMRWindowlessControl9 :: GetCurrentImage已被提及作为另一种选择,但这似乎再次针对的是一个不常见的快照,而不是一个恒定的图像流。 Directshow.Net被许多人称为一个很好的候选人,但目前还不清楚如何简单地从网络摄像头抓取图像。 此外,许多消息来源表示担心微软不再支持Directshow。 此外,我已经看到的实现需要ImageGrabber,显然也不再支持 。 MS的新替代品似乎是媒体基金会,但我的研究还没有找到任何可以实现的实例(我不确定这是否会在旧版本的Windows上运行,如XP)。 DirectX.Capture是一个很棒的库( 参见一个很好的实现 ),但似乎缺乏直接获取video图像的filter和方法。 我也开始研究滤镜和滤镜图,但这看起来非常复杂,感觉有点像“重新发明轮子”。

总的来说,上面简要提到的所有解决方案似乎都相当陈旧。 有人可以指点我一步一步的指导,让网络摄像头在C#中工作,并从中每秒抓取几张图像? (我们还必须在某些时候做音频,因此不排除video的解决方案将是最有帮助的)。

我使用AForge.Video(在这里找到它:code.google.com/p/aforge/)因为它是一个非常快速的c#实现。 我对它的性能非常满意,它可以在一台8岁的PC上以30fps的速度轻松捕获两个高清网络摄像头。 数据作为本机IntPtr提供,因此它非常适合使用本机代码或opencv进行进一步处理。

opencv包装器emgu和opencvsharp都实现了基本的video捕获function,这可能足以满足您的需要。 很明显,如果你要进行图像处理/计算机视觉,你可能还是想要使用它们。

正如dr.mo建议的那样,Aforge就是答案。

我从这里使用了教程: http : //en.code-bude.net/2013/01/02/how-to-easily-record-from-a-webcam-in-c/

在本教程中,每次从网络摄像头收到帧时,它们都会触发事件处理程序。 在原始教程中,此位图用于将图像写入PictureBox。 我只是修改它以将位图图像保存到文件而不是图片框。 所以我已经替换了以下代码:

 pictureBoxVideo.BackgroundImage = (Bitmap)eventArgs.Frame.Clone(); 

使用以下代码:

 Bitmap myImage = (Bitmap)eventArgs.Frame.Clone(); string strGrabFileName = String.Format("C:\\My_folder\\Snapshot_{0:yyyyMMdd_hhmmss.fff}.bmp", DateTime.Now); myImage.Save(strGrabFileName, System.Drawing.Imaging.ImageFormat.Bmp); 

它就像一个魅力!