【问题标题】:How to grab constant stream of bitmap images from webcam in c#如何在 C# 中从网络摄像头获取恒定的位图图像流
【发布时间】:2013-04-27 18:43:24
【问题描述】:

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

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

访问网络摄像头并直接从网络摄像头读取实际帧作为单个图像的最佳和最简单的方法是什么?我还在起步阶段。

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

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

【问题讨论】:

    标签: c# webcam directshow ms-media-foundation


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您对使用 AForge 的建议,但您能否提供有关您建议的解决方案的更多详细信息?这是非常高的水平,并没有让我更接近实施解决方案。我在这方面有点初学者,你的回答似乎假设我有相当多的背景知识。
    • 好的,所以我假设您至少对 c# 有基本的了解?如果您下载 AForge,运行示例并查看它是如何工作的,您应该能够弄清楚视频采集器是如何工作的——或者至少是如何与它交互的。如果你有问题,你可以在这里发布,但现在我不知道如何帮助你。你具体在挣扎什么?你试过什么?
    • 查看Aforge\Samples\Vision 中的 MotionDetector 示例。 MainForm.cs 中的方法 openJPEGURLToolStripMenuItem_Click 将帮助您入门。
    • 非常感谢!我自己做了一些谷歌搜索,并查看了 Aforge 上的一些资源。我能够使用来自 en.code-bude.net/2013/01/02/… 的代码的修改版本使其工作,我将在单独的答案中添加详细信息以帮助其他人,但我会接受你的答案,因为它指向我 Aforge。跨度>
    【解决方案2】:

    正如莫博士所说,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);
    

    它就像一个魅力!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      相关资源
      最近更新 更多