Click here to Skip to main content
Click here to Skip to main content
Go to top

Camera_Net Library

, 12 Feb 2014
Rate this:
Please Sign up or sign in to vote.
Camera in .NET application using .NET library (DirectShow).

Complicated sample of Camera_Net library use. Stranger on television.

This article presents a library Camera_Net for working with cameras and video-inputs in .NET easily. Library uses DirectShow and includes samples of use: two simple samples and complicated one. 

Introduction 

What is DirectShow? 

First of all, in this article we'll use DirectShow for rendering video streams from cameras. So what is DirectShow? DirectShow is a multimedia framework made by Microsoft guys. This framework was made very powerful and complicated, so it almost allows to make a home semi-pro video studio. But this huge complexity makes it hard to use. You need to make tons of code to simply render video from your web-camera to your application form.

Advantages and disadvantages of DirectShow  

Advantages

  1. Powerful.
    It can do everything you need. If not, write your filters and use them in filter graph.
  2. Part of the Operating System.
    All Windows versions (XP, Vista, 7, 8) support it out of box. No need to install anything.
  3. Supported by all vendors.
    Almost every camera you can buy has drivers to work nicely with DirectShow.

Disadvantages

  1. It's not cross-platform.
    It's based on COM technology and is not cross-platform. It will work well only on Windows. It's also a proprietary framework as most of stuff Microsoft does.
    However, if you're using managed code (e.g. C#) your application is probably already not cross-platform. 
  2. Native code.
    The framework doesn't support managed API.
    But you can use open source wrappers like DirectShowNet library to overcome this disadvantage.
  3. Too complicated and low-level to be used.
    To render your webcam you should make a lot of coding work.
    But using wrappers like Camera_Net library from this article you can do a lot of stuff with your camera easily.

So, it's up to you to use DirectShow or not as it has advantages and disadvantages. But if you do, maybe this article is for you.

DirectShow rendering graph

The main idea of audio/video rendering in DirectShow is to build a filter graph and run it. Filter Graph — is a graph with blocks (graph filters). Some of these blocks are video/audio sources (e.g. cameras, tuners), some are renders and others are filters that can change or transform multimedia streams. Also these graph filters have pins — points for connecting filters to each other. So, cameras have output pin or pins, renders have input pins and most of other filters have both types. 

To render your camera you can make a very simple filter graph:

The source filter is connected to simple Video Renderer. The source filter is available because operation system found it, sometimes with help of vendor's camera drivers. The render is standard filter, you can consider it as a part of DirectShow framework. No additional filters were used.

Let 's say we want to take pictures of video-stream and draw over video-output (video overlay). The graph will become more complicated:  

 

Here Tee Filter is a standard filter to duplicate multimedia stream. One output stream of it goes to render and another goes to SampleGrabber to take pictures (snapshots). SampleGrabber is a standard filter for getting frames from video stream. In this graph the Video Mixing Renderer is used instead of simple Video Renderer filter. Video Mixing Renderer is a standard filter that support video overlay for rendered output.

If the source filter (camera, tuner) have different output multimedia format (media type) it can be necessary to add additional intermediate filters for conversion on fly.  It makes filter graph bigger and more sophisticated:  

DirectShow can connect pins with distinct media types in “intelligent” way by enumerating available intermediate filters installed in operation system and choosing one by itself, but the result sometimes can be not as good as you expected.

Filter graph images were made in an open source tool GraphStudioNext, which I recommend for everyone who is messing with filter graph. It's a great free software tool for building and debugging of filter graphs. It was made as a replacement of outdated buggy GraphEdit from Microsoft. 

Managed library as a wrapper over DirectShow

To ignore all this mess with DirectShow graph I would recommend to use a managed wrapper, which will hide all this low-level magic. It will allow you to overcome the third disadvantage of DirectShow — complexity and low-level coding.  

In this article I'll describe usage and features of Camera_Net library. This library was created because I've failed to find a library among dozens of open source solutions that would support what I wanted: easy use of camera as a managed component, ability to change the camera resolution, take frame snapshots, show overlay images over the frame. So this library was created!

Some of the features of this library:   
  1. Select camera
  2. Select resolution
  3. Show camera's output   
  4. Overlay image on the frame
  5. Take snapshots of the frame
  6. Change TV mode (PAL, NTSC, etc.) 
  7. Display dialog windows of the camera (from drivers)
  8. Get a list of available cameras and resolutions

Classes CameraControl and Camera are the main classes in the library. Camera is an class for interaction with cameras. CameraControl is a UserControl-wrapper for Camera class, easy to use out of box.

Additionally there are several public classes: Resolution, VideoInput, camera selection class and etc. The library uses DirectShowLib (license LGPL 2.1 or later), which is a very thin wrapper of DirectX COM-interfaces, so that the losses of productivity from the use of managed code instead of the native one are minimal.

All sources of library and examples are available on GitHub. You can post issues, pull requests or forks there.

DirectShow is Windows only, so the library is also available only for Windows.  

Using Camera_Net

The most simple way to use this library is to add it in your application as Control. The class CameraControl (which is inherited from UserControl) is responsible for that. This approach is recommended.

The library includes samples of use in WinForms, in particular examples of a simple implementation of the component in your application, and more complicated example that shows almost all features of the library.

So, add the library project or a compiled assembly to references, add CameraControl to your application and add using directives:

using Camera_NET;
using DirectShowLib; 
Get list of available devices

Firstly, you probably want to get list of available cameras and video inputs in the system:

// Camera choice helper class
CameraChoice _CameraChoice = new CameraChoice(); 
_CameraChoice.UpdateDeviceList();

Now _CameraChoice.Devices includes all available devices (it's List<DsDevice>). The list will will be empty if DirectShow didn't find any devices.

In samples you can see the whole code with camera and resolution selection via ComboBox-es with human-readable names of cameras. To make this article short let's simply use the first one (with zero index).  

Moniker (device identification)   

In terms of DirectShow the camera device as a unique identification — a Moniker (for more information please read about System.Runtime.InteropServices.ComTypes.IMoniker interface).

You can get moniker of device via Mon property of DsDevice:

var moniker = _CameraChoice.Devices[your_index].Mon; 
Get list of available resolutions

You can get a list  of available resolutions (it camera's driver supports this function) using static function Camera.GetResolutionList(moniker):

ResolutionList resolutions = Camera.GetResolutionList(moniker); 
Start camera output 

Finally, when you've chosen camera device and resolution you can set camera to CameraControl:

cameraControl.SetCamera(moniker, resolutions[your_index_of_resolution]);

or you can start with default resolution (usually it's a VGA mode 640x480 but not always):

cameraControl.SetCamera(moniker, null); 
Close camera  

On camera changing of application exit you can (not always necessary) close current camera:

cameraControl.CloseCamera();

 It will free camera for other applications, dispose DirectShow graph and some other resources.

And a lot more! 

Library allows a lot more: 

  • Take snapshots of video output SnapshotOutputImage() or snapshot of source frame SnapshotSourceImage()
  • Show overlay image (bimap) over video, mixer supports transparency (properties MixerEnabled, OverlayBitmap, GDIAlphaValue, GDIColorKey and etc).
  • Use video input devices with crossbar and work with crossbar  (CrossbarAvailable, VideoInput).
  • Display dialog windows of the camera (from drivers): DisplayPropertyPage_Device(), DisplayPropertyPage_Crossbar(), DisplayPropertyPage_CaptureFilter()
  • Work with TV mode (PAL, NTSC, etc.): SetTVMode(), GetTVMode().
  • Change camera and resolution (use SetCamera() again).

For more information you can look samples included with library.

Simple sample of Camera_Net library use.

License

Camera_NET library license

This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3.0 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

Samples license

While the Camera_Net library is covered by LGPL, the samples are released as PUBLIC DOMAIN. So, you can use code from these samples in your free or proprietary project without any limitations.

Credits

The author of this article and the Camera_Net library is free5lot. All sources of library and examples are available on github.

This project uses a library DirectShowLib (DirectShow.Net library) which is covered by LGPL 2.1 or later. 

History   

Version 1.1.2
  • Attributes [Browsable(false)] and [DesignerSerializationVisibility] were added to properties that couldn't be used in a form editor and throw warnings during serialization.

  • PostBuildEvent with release DLL output
Version 1.1.1 
  • Fixed an problem when moving from one monitor to second one
  • .NET2 and .NET3.5 assemblies are available in addition to .NET4.
Version 1.1.0   

Some major fixes (see github log). Some cleaning of code. Added new sample — "VerySimple".

Version 1.0.0    

A first public open source release of Camera_Net library.  

Links to related open source projects:

License

This article, along with any associated source code and files, is licensed under The GNU Lesser General Public License (LGPLv3)

Share

About the Author

free5lot
Software Developer
Russian Federation Russian Federation
No Biography provided

Comments and Discussions

 
QuestionMultiple Cameras PinmemberMember 856901527-Aug-14 14:28 
QuestionRe: Multiple Cameras Pinmemberfree5lot28-Aug-14 1:10 
GeneralRe: Multiple Cameras PinmemberMarnold610228-Aug-14 9:20 
GeneralRe: Multiple Cameras Pinmemberfree5lot28-Aug-14 21:59 
QuestionCan you make a Video Recording feature to this library ? PinprofessionalPavan Kumar16-Jul-14 20:11 
AnswerRe: Can you make a Video Recording feature to this library ? Pinmemberfree5lot26-Jul-14 21:33 
GeneralMy vote of 5 PinmemberAlexandra Christina16-Jul-14 11:32 
GeneralRe: My vote of 5 Pinmemberfree5lot26-Jul-14 21:33 
QuestionVB net 2005 Pinmemberanoxj14-Jul-14 16:19 
GeneralMy vote of 5 Pinmemberkayesharun14-Jul-14 15:25 
GeneralRe: My vote of 5 Pinmemberfree5lot14-Jul-14 22:39 
NewsWe can set the focus distance of the camera Pinmemberxuanguang10-Jul-14 3:15 
GeneralRe: We can set the focus distance of the camera Pinmemberfree5lot14-Jul-14 22:41 
GeneralRe: We can set the focus distance of the camera Pinmemberxuanguang29-Jul-14 3:06 
GeneralRe: We can set the focus distance of the camera Pinmemberfree5lot29-Jul-14 4:49 
AnswerRe: We can set the focus distance of the camera Pinmemberxuanguang29-Jul-14 17:19 
QuestionMirror Live View? PinmemberLamont8523-Jun-14 10:52 
AnswerRe: Mirror Live View? Pinmemberfree5lot23-Jun-14 19:44 
Questionthanks Pinmemberletinh100018-Jun-14 19:00 
AnswerRe: thanks Pinmemberfree5lot23-Jun-14 19:33 
QuestionCompiler warning in VS2012 PinmemberMember 859304817-Jun-14 21:32 
AnswerRe: Compiler warning in VS2012 Pinmemberfree5lot18-Jun-14 0:28 
GeneralRe: Compiler warning in VS2012 PinmemberMember 859304818-Jun-14 2:04 
GeneralRe: Compiler warning in VS2012 Pinmemberfree5lot18-Jun-14 2:20 
QuestionScreen rotation Pinmemberanno196423-May-14 3:24 
AnswerRe: Screen rotation Pinmemberfree5lot23-May-14 20:19 
QuestionVS2013 and Error message PinmemberAGAWOOT7-May-14 17:21 
SuggestionRe: VS2013 and Error message Pinmemberfree5lot7-May-14 19:46 
GeneralRe: VS2013 and Error message PinmemberAGAWOOT7-May-14 20:44 
GeneralRe: VS2013 and Error message Pinmemberfree5lot7-May-14 21:54 
GeneralRe: VS2013 and Error message PinmemberAGAWOOT7-May-14 23:05 
GeneralRe: VS2013 and Error message Pinmemberfree5lot7-May-14 23:12 
GeneralRe: VS2013 and Error message PinmemberAGAWOOT7-May-14 23:28 
GeneralRe: VS2013 and Error message Pinmemberfree5lot7-May-14 23:29 
GeneralRe: VS2013 and Error message [modified] PinmemberAGAWOOT7-May-14 23:49 
GeneralRe: VS2013 and Error message Pinmemberfree5lot8-May-14 3:23 
QuestionSilly Question (Start/Stop?) PinmemberBerney29-Mar-14 21:43 
AnswerRe: Silly Question (Start/Stop?) Pinmemberfree5lot29-Mar-14 22:08 
QuestionRecord Video Output Pinmemberolomoco19-Mar-14 4:00 
AnswerRe: Record Video Output Pinmemberfree5lot19-Mar-14 4:29 
NewsNew version 1.1.2 uploaded [modified] Pinmemberfree5lot12-Feb-14 23:53 
Questionvs 2010 error message PinmemberKkouer12-Feb-14 16:59 
AnswerRe: vs 2010 error message [modified] Pinmemberfree5lot12-Feb-14 20:48 
NewsNew version 1.1.1 uploaded Pinmemberfree5lot11-Feb-14 22:41 
QuestionSmall bug PinmemberMember 810780610-Feb-14 4:37 
AnswerRe: Small bug PinmemberMember 810780610-Feb-14 8:25 
GeneralRe: Small bug Pinmemberfree5lot10-Feb-14 21:43 
GeneralRe: Small bug PinmemberMember 810780610-Feb-14 22:26 
GeneralRe: Small bug Pinmemberfree5lot11-Feb-14 0:19 
GeneralRe: Small bug PinmemberMember 810780611-Feb-14 1:18 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web04 | 2.8.140916.1 | Last Updated 12 Feb 2014
Article Copyright 2013 by free5lot
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid