最近两天,我一直在寻找一种使用c从网络摄像头捕捉图像的方法。我在c很新,我不想使用外部第三方libs,所以我找到了两个很好的方法,但似乎都返回了几乎相同的错误。我不能让他们中的任何一个去工作,所以如果你能帮我让他们中的一个去跑步或者帮我找到其他的选择,那就太好了。
所以我发现的第一个方法是使用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);
以下异常:
空引用异常:
对象引用未设置为对象的实例。
我认为这两种解决方案都会引起问题,因为他们找不到我的相机,但是我可以在Skype中使用我的相机而没有任何问题。
最佳答案
wia是静态的,它是一种“使用扫描仪的api”;0x80210015
是WIA_S_NO_DEVICE_AVAILABLE
avicap32 api的名称是“video for windows”,这是一个非常不受欢迎和过时的名称,它可能会成功(兼容性仍然存在),但很有可能它不会给您带来任何好处。
使用网络摄像机的api包括:
DirectShow
媒体基金会
两者都是本机api,您可能很难直接从c代码与它们进行接口,但是使用DirectShow.NET(尤其是)和media foundation.net,您可以使用托管代码的包装器。你可以在这里找到更多关于使用DistaStudi.NET的内容:
Capturing frames from webcam using DirectShow.NET
DirectShow Library-How to capture image using directshow library without showing the webcam live images on the PictureBox or Panel
Get image from webcam
关于c# - C#从摄像头捕获图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14677880/