15

过去两天我一直在寻找一种使用 C# 从网络摄像头捕获图像的方法。我是 C# 的新手,我不想使用外部第三方库,所以我找到了两种不错的方法,但似乎都返回几乎相同的错误。我无法让它们中的任何一个工作,所以如果你帮助我让其中一个运行或帮助我找到替代方案,那就太好了。

所以我发现的第一种方法是使用 Windows WIA。我找到了以下代码:

CommonDialogClass dialog = new CommonDialogClass();
Device camera = dialog.ShowSelectDevice(WiaDeviceType.CameraDeviceType, true, false);
        // take the photo 
Item item = camera.ExecuteCommand(CommandID.wiaCommandTakePicture);
ImageFile image = (ImageFile)item.Transfer(FormatID.wiaFormatJPEG);
        // filename and saving 
image.SaveFile("Test.jpg");

这段代码似乎正是我正在寻找的,但我无法让它运行,因为我在第二行收到以下错误:

Exception from HRESULT: 0x80210015

我发现的第二种方法是使用带有以下示例的 Avicap32.dll:

http://www.timvw.be/wp-content/code/csharp/testavicap32.zip

但我正在使用这段代码:

Image image = ((CaptureDevice)cboDevices.SelectedItem).Capture();
image.Save(@"c:\capture.png", ImageFormat.Png);

以下异常: NullReferenceException:对象引用未设置为对象的实例。

我认为这两种解决方案都引起了问题,因为他们找不到我的相机,但我可以在 Skype 中使用我的相机而没有任何问题。

4

3 回答 3

19

我尝试了多种方法,对我来说最简单的方法是 Emgu.cv(nuget package)。

        VideoCapture capture = new VideoCapture(); //create a camera capture
        Bitmap image = capture.QueryFrame().Bitmap; //take a picture

就是这样(从 API 版本 3.3.0 开始)

旧 API 方法

        Capture capture = new Capture(); //create a camera captue
        Bitmap image = capture.QueryFrame().Bitmap; //take a picture
于 2016-08-24T19:13:20.917 回答
11
  • WIA 用于静止图像,它是一种“与扫描仪配合使用的 API”;0x80210015WIA_S_NO_DEVICE_AVAILABLE
  • AVICAP32 API 名称是“Video for Windows”,它确实已被弃用和过时,它可能会奏效(兼容性仍然存在)但很有可能它会让你无处可去

与网络摄像头配合使用的 API 包括:

  • 直接秀
  • 媒体基金会

两者都是本机 API,您可能很难直接从 C# 代码接口它们,但是使用DirectShow.NET(尤其是)和 Media Foundation.NET,您有托管代码的包装器。您可以在此处找到有关使用 DirectShow.NET 的更多信息:

于 2013-02-03T22:19:22.490 回答
1

我推荐Aforge.net 框架

它能够实现示例项目中使用的videoCaptureDevice 类: Snapshot Maker 示例以快速创建图像捕获对话框。它比 DirectShow 库慢一点 - 如何使用 directshow 库捕获图像而不在 PictureBox 或面板上显示网络摄像头实时图像,但它很稳定,并且是从支持的设备设置视频和图像分辨率的简单方法。

我遇到的唯一问题是 VideoCaptureDevice.SimulateTrigger() 使用 bacjground 线程从视频源创建图像并在事件中返回图像。如果将返回的图像放在 UI 线程上的 winform 控件上,则需要委托方法以防止跨线程问题。

从 Aforge.net 源SVN 链接获取 Snapshot Maker 项目的源代码。

于 2014-12-31T21:23:36.853 回答