C# capturing image from webcam

Viktor Kirilov picture Viktor Kirilov · Feb 3, 2013 · Viewed 96.8k times · Source

Last two days I've been looking for a way to capture an image from the webcam using C#. I'm pretty new in c# and I DO NOT want to use external third party libs, so I found two nice ways, but both seems to return almost the same error. I couldn't get any of them to work, so it would be really nice if you help me to get one of them running or help me to find alternative.

So the first way I found is using Windows WIA. I found the following code:

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");

this code seems to be exacly what I'm looking for, but I can't get it running, because I'm getting the following error on the second line:

Exception from HRESULT: 0x80210015

The second way I found is using the Avicap32.dll with the following sample:

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

but I'm getting on this code:

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

the following exception: NullReferenceException: Object reference not set to an instance of an object.

I think that both solution are causing problems because they can't find my camera, but I can use my camera in skype without any problems.

Answer

Ashitakalax picture Ashitakalax · Aug 24, 2016

I tried multiple approaches, and the easiest approach for me was Emgu.cv(nuget package).

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

That's it (as of API version 3.3.0)

Old API Approach

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