C# 如何在c语言中从网络摄像头中获取恒定的位图图像流#

C# 如何在c语言中从网络摄像头中获取恒定的位图图像流#,c#,webcam,directshow,ms-media-foundation,C#,Webcam,Directshow,Ms Media Foundation,我们有一个对视频流进行处理的c#应用程序。这是一个低级应用程序,接收位图格式的每一帧,因此基本上每秒需要25幅图像。这个应用程序已经在为我们的一些媒体源工作,但是我们现在需要添加一个网络摄像头作为输入设备 因此,我们基本上需要连续地从网络摄像头捕获位图图像,以便我们可以将所有这些帧作为“流”传递给我们的应用程序 访问网络摄像头并直接从网络摄像头中读取实际帧作为单个图像的最佳和最简单的方法是什么?我仍在起步阶段 有许多库允许用户访问网络摄像头,在windows面板上预览网络摄像头的内容,然后使用屏

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

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

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

有许多库允许用户访问网络摄像头,在windows面板上预览网络摄像头的内容,然后使用屏幕捕获再次捕获此图像。不幸的是,当每秒捕获25帧时,这将无法提供必要的性能。IVMRWindowlessControl9::GetCurrentImage被作为另一个备选方案提到,但这似乎再次针对一个不频繁的快照,而不是一个恒定的图像流。很多人都提到它是一个很好的候选人,但不清楚如何简单地从网络摄像头抓取图像。此外,许多消息来源表示担心微软不再支持Directshow。此外,我看到的实现需要ImageGrabber,显然它也是。MS的最新替代方案似乎是媒体基础,但我的研究还没有找到如何实现这一点的任何工作实例(我不确定这是否会在像XP这样的较旧版本的Windows上运行)。是一个很棒的库(),但似乎缺少直接获取视频图像的过滤器和方法。我也开始研究,但这看起来非常复杂,感觉有点像“重新发明轮子”

总的来说,上面提到的所有解决方案似乎都相当陈旧。有人能给我指点一下让网络摄像头在C#中工作并每秒从中获取几张图像的分步指南吗?(我们还必须在某个时候制作音频,因此不排除视频的解决方案将非常有用)。

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


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

正如莫博士所建议的那样,一个好的答案就是

我在这里使用了教程:

在本教程中,每次从网络摄像头接收到帧时,都会触发事件处理程序。在原始教程中,此位图用于将图像写入PictureBox。我只是修改了它,将位图图像保存到文件中,而不是保存到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);
使用以下代码:

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);

它就像一个符咒

感谢您提出使用Forge的建议,但您能否提供有关建议解决方案的更多详细信息?这是一个非常高的级别,并没有让我离实现解决方案更近。我在这方面有点新手,你的回答似乎假设了我相当多的背景知识。好吧,那么我假设你至少有c#的基础知识?如果你下载了一个视频抓取器,运行这些例子,看看它是如何工作的,你应该能够弄清楚视频抓取器是如何工作的,或者至少是如何与它交互。如果你当时有问题,你可以张贴在这里,但现在我不知道如何帮助你。你到底在挣扎什么?您尝试了什么?请查看
Aforge\Samples\Vision
中的MotionDetector示例。方法
openJPEGURLToolStripMenuItem\u单击
MainForm.cs
中的
,您就可以开始了。非常感谢!我自己做了一些谷歌搜索,并查看了Aforge上的一些资源。我能够让它工作使用修改后的版本的代码,我会在一个单独的答案中添加细节,以帮助其他人也,但我会接受你的答案,因为它指出我的一个巨大的。