C#从网络摄像头捕获图像

Vik*_*lov 10 c# webcam image file capture

最近两天我一直在寻找一种使用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");
Run Code Online (Sandbox Code Playgroud)

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

Exception from HRESULT: 0x80210015
Run Code Online (Sandbox Code Playgroud)

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

http://www.timvw.be/wp-content/code/csharp/testavicap32.zip
Run Code Online (Sandbox Code Playgroud)

但是我正在使用这段代码:

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

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

我认为这两种解决方案都会导致问题,因为他们无法找到我的相机,但我可以在skype中使用我的相机而没有任何问题.

Ash*_*lax 13

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

        VideoCapture capture = new VideoCapture(); //create a camera capture
        Bitmap image = capture.QueryFrame().Bitmap; //take a picture
Run Code Online (Sandbox Code Playgroud)

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

旧的API方法

        Capture capture = new Capture(); //create a camera captue
        Bitmap image = capture.QueryFrame().Bitmap; //take a picture
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记配置捕获和图像。 (2认同)
  • 还获取包 Emgu.CV.Bitmap 并使用 capture.QueryFrame().ToBitmap; (2认同)

Rom*_* R. 11

  • WIA适用于静止图像,它是一种"与扫描仪配合使用的API"; 0x80210015WIA_S_NO_DEVICE_AVAILABLE
  • AVICAP32 API的名称是"Video for Windows",它真的已被弃用和过时,它可能会解决(兼容性仍然在这里),但很有可能它会带你到处

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

  • DirectShow的
  • 媒体基金会

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