最近两天我一直在寻找一种使用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中使用我的相机而没有任何问题。
答案 0 :(得分:11)
0x80210015
是WIA_S_NO_DEVICE_AVAILABLE
使用网络摄像头的API包括:
两者都是本机API,您可能很难直接将它们与C#代码连接起来,但是对于DirectShow.NET(特别是)和Media Foundation.NET,您有托管代码的包装器。您可以在此处找到有关使用DirectShow.NET的更多信息:
答案 1 :(得分:11)
我尝试了多种方法,对我来说最简单的方法是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
答案 2 :(得分:1)
它能够实现示例项目中使用的videoCaptureDevice class:Snapshot Maker example来快速创建图像捕获对话框。它比它慢一点 DirectShow Library-How to capture image using directshow library without showing the webcam live images on the PictureBox or Panel但它很稳定,是从受支持的设备设置视频和图像分辨率的简便方法。
我遇到的唯一问题是VideoCaptureDevice.SimulateTrigger()使用bacjground线程从视频源创建图像并返回事件上的图像。如果将返回的图像放在UI线程上的winform控件上,则需要委托方法来防止交叉线程问题。
从Aforge.net来源SVN link获取Snapshot Maker项目的来源。