Esempio n. 1
0
        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);
        }
Esempio n. 3
0
        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;
            }
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
 public VideoCapture(GraphicsDevice GraphicsDevice, ICamera camera)
 {
     this.GraphicsDevice = GraphicsDevice;
     Camera = (DirectShowCamera)camera;
     Initialize();
 }
Esempio n. 6
0
        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);
            }
        }