我们有一个对视频流执行处理的 C# 应用程序。这是一个低级应用程序,以位图格式接收每一帧,因此基本上我们每秒需要 25 个图像。该应用程序已经适用于我们的一些媒体源,但我们现在需要添加网络摄像头作为输入设备。
因此,我们基本上需要从网络摄像头连续捕获位图图像,以便我们可以将所有这些帧作为“流”传递到我们的应用程序。
访问网络摄像头并直接从网络摄像头读取实际帧作为单个图像的最佳和最简单的方法是什么?我还处于起步阶段。
有许多库允许人们访问网络摄像头,在 Windows 面板上预览网络摄像头的内容,然后使用屏幕捕获再次捕获该图像。不幸的是,这在每秒捕获 25 帧时无法提供必要的性能。 IVMRWindowlessControl9::GetCurrentImage 被提到作为另一种替代方案,但这似乎又是针对不频繁的快照而不是恒定的图像流。直播网 http://sourceforge.net/projects/directshownet许多人都提到它是一个很好的候选者,但目前还不清楚如何简单地从网络摄像头抓取图像。此外,许多消息来源都对 Microsoft 不再支持 Directshow 表示担忧。另外,我见过的实现需要 ImageGrabber,这显然也是不再支持 https://stackoverflow.com/questions/8039809/directshow-getting-video-frames。 MS 的较新替代方案似乎是 Media Foundation,但我的研究尚未找到任何如何实现此功能的工作示例(并且我不确定这是否可以在旧版本的 Windows(例如 XP)上运行)。DirectX.Capture http://www.codeproject.com/Articles/3566/DirectX-Capture-Class-Library是一个很棒的图书馆(看到一个很好的实现 http://dashingquill.wordpress.com/2012/06/27/capturing-webcam-using-directshow-net-library/)但似乎缺乏直接获取视频图像的过滤器和方法。我也开始关注过滤器和过滤图 http://msdn.microsoft.com/en-us/library/ms787763%28VS.85%29.aspx但这看起来非常复杂,而且确实感觉有点像“重新发明轮子”。
总的来说,上面简要提到的所有解决方案似乎都相当陈旧。有人能给我指点一下如何让网络摄像头在 C# 中工作并每秒从中抓取几张图像的分步指南吗? (我们有时还必须处理音频,因此不排除视频的解决方案将是最有帮助的)。
我使用 AForge.Video(在这里找到它:code.google.com/p/aforge/),因为它是一个非常快的 C# 实现。我对其性能非常满意,它可以毫不费力地在一台 8 年旧电脑上以 30 fps 的速度从两个高清网络摄像头进行捕获。数据作为本机 IntPtr 提供,因此非常适合使用本机代码或 opencv 进行进一步处理。
opencv 包装器 emgu 和 opencvsharp 都实现了基本的视频捕获功能,这可能足以满足您的目的。显然,如果您要执行图像处理/计算机视觉,您可能无论如何都想使用它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)