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

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

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

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

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

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

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

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

转载注明原文:如何在c#中从网络摄像头抓取恒定的位图图像流 - 代码日志