如何从C#中的网络摄像头抓取位图图像的恒定流
我们有一个ac#应用程序,用于处理视频流。 这是一个以Bitmap格式接收每帧的低级应用程序,因此基本上我们每秒需要25个图像。 这个应用程序已经在为我们的一些媒体资源工作,但我们现在需要添加一个网络摄像头作为输入设备。
所以我们基本上需要不断地从网络摄像头捕获位图图像,以便我们可以将所有这些帧作为“流”传递给我们的应用程序。
访问摄像头并直接从网络摄像头读取实际帧作为单独图像的最佳和最简单的方法是什么? 我仍然在起跑线上。
有许多库允许用户访问网络摄像头,在Windows面板上预览网络摄像头的内容,然后使用屏幕截图再次捕捉该图像。 不幸的是,这在每秒捕捉25帧时不会提供必要的性能。 IVMRWindowlessControl9 :: GetCurrentImage已经被提及作为另一种选择,但是这又似乎针对不经常的快照而不是恒定的图像流。 Directshow.Net被许多人称为很好的候选人,但是如何简单地从网络摄像头抓取图像还不清楚。 此外,许多消息来源都表示担心微软不再支持Directshow。 另外,我见过的这个实现需要ImageGrabber,它显然也不再被支持。 来自MS的更新的选择似乎是媒体基金会,但我的研究还没有提出任何有关如何实现这个目标的工作示例(我不确定这是否会在XP的老版本的Windows上运行)。 DirectX.Capture是一个很棒的库(看到一个很好的实现),但似乎缺乏直接获取视频图像的过滤器和方法。 我也开始查看过滤器和过滤器图形,但这看起来非常复杂,并且感觉有点像“重新发明轮子”。
总的来说,上面简要提到的所有解决方案似乎都比较老旧。 有人可以请我指出一步一步的指导,让摄像头在C#中工作,并从中每秒抓取几个图像? (我们还必须在某个时候进行音频处理,因此不排除视频的解决方案将是最有帮助的)。
我使用AForge.Video(在这里找到它:code.google.com/p/aforge/),因为它是一个非常快速的C#实现。 我对这款游戏的性能非常满意,它可以毫不费力地从两台高清网络摄像机以每分钟30帧的速度在8年的PC上捕捉。 数据以本机IntPtr的形式提供,因此非常适合使用本机代码或opencv进行进一步处理。
opencv wrappers emgu和opencvsharp都实现了一个基本的视频捕捉功能,这可能足以满足您的需求。 显然,如果你要执行图像处理/计算机视觉,你可能想要使用这些。
正如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_folderSnapshot_{0:yyyyMMdd_hhmmss.fff}.bmp", DateTime.Now);
myImage.Save(strGrabFileName, System.Drawing.Imaging.ImageFormat.Bmp);
它就像一个魅力!
链接地址: http://www.djcxy.com/p/80979.html上一篇: How to grab constant stream of bitmap images from webcam in c#