public static List <ICamera> GetDirectShowCameras() { var cameras = new List <ICamera>(); object VideoInputObject = null; IBaseFilter VideoInput = null; IEnumMoniker classEnum; var devEnum = (ICreateDevEnum) new CreateDevEnum(); devEnum.CreateClassEnumerator(FilterCategory.VideoInputDevice, out classEnum, 0); Marshal.ReleaseComObject(devEnum); if (classEnum != null) { var grabbingDevices = true; var allMonikers = new List <IMoniker>(); while (true) { var temp = new IMoniker[1]; classEnum.Next(1, temp, IntPtr.Zero); if (temp[0] == null) { break; } allMonikers.Add(temp[0]); } var iid = typeof(IBaseFilter).GUID; var piid = typeof(IPropertyBag).GUID; var idx = 0; foreach (var validMoniker in allMonikers) { object propertyBagObject = null; validMoniker.BindToObject(null, null, ref iid, out VideoInputObject); validMoniker.BindToStorage(null, null, ref piid, out propertyBagObject); var propertyBag = (IPropertyBag)propertyBagObject; object descResult = null; if (propertyBag.Read("Description", out descResult, null) != 0) { if (propertyBag.Read("FriendlyName", out descResult, null) != 0) { descResult = "(unknown device)"; } } var camera = new DirectShowCamera { Name = descResult as string, Index = idx, Width = 640, // TODO Fix Height = 480, }; cameras.Add(camera); Marshal.ReleaseComObject(VideoInputObject); Marshal.ReleaseComObject(validMoniker); Marshal.ReleaseComObject(classEnum); idx++; } } return(cameras); }
/// <summary> /// Initializes a new instance of the <see cref="DirectShowWebcamPropertiesForm"/> class. /// </summary> /// <param name="camera">The webcam.</param> public DirectShowWebcamPropertiesForm(DirectShowCamera camera) : this() { directShowImageQualityPropertiesControl1.Camera = camera; directShowCameraControlPropertiesControl1.Camera = camera; this.Text = string.Format("{0} Properties (CustomUI)", camera.FriendlyName); }
public void SetCamera(int deviceNumber, int deviceMode) { GTHardware.Camera.Instance.SetDirectShowCamera(deviceNumber, deviceMode); GTHardware.Camera.Instance.Device.OnImage += new EventHandler <GTHardware.Cameras.ImageEventArgs>(Device_OnImage); GTHardware.Camera.Instance.Device.Start(); // Bing camera settings to device (brightness etc.). // Sliders are bound to CameraSettings, here we bind them to the camera interface if (GTHardware.Camera.Instance.Device != null && GTHardware.Camera.Instance.DeviceType == GTHardware.Camera.DeviceTypeEnum.DirectShow) { DirectShowCamera dShowCam = (DirectShowCamera)GTHardware.Camera.Instance.Device; Settings.Instance.Camera.OnVideoProcAmpPropertyChanged += dShowCam.OnVideoProcAmpPropertyChanged; Settings.Instance.Camera.OnCameraControlPropertyChanged += dShowCam.OnCameraControlPropertyChanged; } }
private IBaseFilter GetVideoInputObjectForCamera(DirectShowCamera camera) { object VideoInputObject = null; IBaseFilter VideoInput = null; IEnumMoniker classEnum; var devEnum = (ICreateDevEnum) new CreateDevEnum(); devEnum.CreateClassEnumerator(FilterCategory.VideoInputDevice, out classEnum, 0); Marshal.ReleaseComObject(devEnum); if (classEnum != null) { var grabbingDevices = true; var allMonikers = new List <IMoniker>(); while (true) { var temp = new IMoniker[1]; classEnum.Next(1, temp, IntPtr.Zero); if (temp[0] == null) { break; } allMonikers.Add(temp[0]); } var iid = typeof(IBaseFilter).GUID; var idx = 0; foreach (var validMoniker in allMonikers) { if (idx == camera.Index) { validMoniker.BindToObject(null, null, ref iid, out VideoInputObject); var result = ((IBaseFilter)VideoInputObject); Marshal.ReleaseComObject(validMoniker); Marshal.ReleaseComObject(classEnum); return(result); } Marshal.ReleaseComObject(validMoniker); idx++; } Marshal.ReleaseComObject(classEnum); } return(null); }
public VideoCapture(GraphicsDevice GraphicsDevice, ICamera camera) { this.GraphicsDevice = GraphicsDevice; Camera = (DirectShowCamera)camera; Initialize(); }
public void SetDirectShowCamera(int newDeviceNumber, int newDeviceMode) { try { bool initializeNew = true; DirectShowCamera localCam; // we store new camera here and then transfer it to this.camera on success // If no device mode was select use default if (newDeviceMode == -1) { newDeviceMode = 0; } // Get Instance camera and mode if (camera != null && camera is DirectShowCamera) { var dCam = camera as DirectShowCamera; // Store Instance mode to reset if new mode fails var instanceDeviceNumber = dCam.DeviceNumber; var instanceDeviceMode = dCam.DeviceMode; // Dont init the same device & mode twice.. if (instanceDeviceNumber == newDeviceNumber && instanceDeviceMode == newDeviceMode && dCam.HasValidGraph) { initializeNew = false; } } // Specific deviceMode (e.g. 800x600 @ 30fps) if (camera == null || newDeviceMode > -1) { if (initializeNew) { if (camera != null) { camera.Stop(); camera.Cleanup(); } } else { // No changes, just return return; } } // Specific configuration localCam = new DirectShowCamera( DirectShowDevices.Instance.Cameras[newDeviceNumber].DirectshowDevice, newDeviceNumber, newDeviceMode, DirectShowDevices.Instance.Cameras[newDeviceNumber].SupportedSizesAndFPS[newDeviceMode].FPS, DirectShowDevices.Instance.Cameras[newDeviceNumber].SupportedSizesAndFPS[newDeviceMode].Width, DirectShowDevices.Instance.Cameras[newDeviceNumber].SupportedSizesAndFPS[newDeviceMode].Height); // If last set camera failed, try default mode if (localCam.HasValidGraph == false) // No specific deviceMode { localCam.Cleanup(); localCam = new DirectShowCamera( DirectShowDevices.Instance.Cameras[newDeviceNumber].DirectshowDevice, newDeviceNumber, 0, 0, 0, 0); } // If this is already occupied by another application and there // are more than one camera connected, try the next one. if (localCam.HasValidGraph == false && DirectShowDevices.Instance.Cameras.Count() > 1) { localCam.Cleanup(); localCam = new DirectShowCamera( DirectShowDevices.Instance.Cameras[1].DirectshowDevice, 1, 0, 0, 0, 0); } // Finally, if running set this.camera to localCam if (localCam.HasValidGraph) { localCam.IsSupportingROI = false; // Switch camera = localCam; camera.Initialize(); camera.Start(); // Trigger global command, signal that a new camera has been started // Listners for OnImage event has to re-subscribe GTCommons.GTCommands.Instance.Camera.CameraChange(); } else { // Failed, start previous camera/mode again camera.Start(); } } catch (Exception) { //ErrorLogger.ProcessException(ex, false); } }