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

最近两天我一直在寻找一种方法来使用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");

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

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:未将对象引用设置为对象的实例。

我认为这两种解决方案都会导致问题,因为他们找不到我的相机,但我可以在没有任何问题的情况下使用我的相机。


  • WIA适用于剧照,这是一种“与扫描仪配合使用的API”; 0x80210015WIA_S_NO_DEVICE_AVAILABLE
  • AVICAP32的API名称是“视频for Windows”,这是真的弃用和过时,它可能会工作(兼容性仍在这里),但机会很高,它会带你无处
  • 使用网络相机的API有:

  • DirectShow的
  • 媒体基金会
  • 两者都是本机API,你可能很难直接从C#代码接口,但是在DirectShow.NET(特别是)和Media Foundation.NET中,你可以使用托管代码的包装。 你可以在这里找到有关使用DirectShow.NET的更多信息:

  • 使用DirectShow.NET从网络摄像头捕捉帧
  • DirectShow库 - 如何使用directshow库捕获图像,而无需在PictureBox或Panel上显示摄像头的实时图像
  • 从网络摄像头获取图像

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

            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
    

    我推荐Aforge.net框架。

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

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

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

    链接地址: http://www.djcxy.com/p/80995.html

    上一篇: C# capturing image from webcam

    下一篇: Capture Webcam While Viewing It?