C#中AForge库调节视频亮度、饱和度等属性

参考链接:https://www.dianyuan.com/eestar/article-1479.html

之前工作中需要调节摄像头的亮度、饱和度调节,之前一直通过调用AForge的调节控件才能调节,虽然可以实现功能,但是跟整体界面很不协调,所以显得很鸡肋,调节界面如下:

用Aforge调用了摄像头代码如下:

VideoCaptureDevice Cam1;
FilterInfoCollection VideoCaptureDevices; 
VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);Cam1 = new VideoCaptureDevice(VideoCaptureDevices[0].MonikerString);Cam1.DisplayPropertyPage(IntPtr.Zero); //这将显示带有摄像头控件的窗体

但一直没有找到设置摄像头亮度、对比度、灰度等方法,查阅资料发现,原来就这么简单,

调节相机参数代码如下,这些函数已经在AForge2.2.2.5中已经包含,可以直接调用:

FilterInfoCollection videoDevices = 
    new FilterInfoCollection(FilterCategory.VideoInputDevice);
VideoCaptureDevice videoDevice = 
    new VideoCaptureDevice(videoDevices[camDevice].MonikerString);
videoDevice.SetCameraProperty(
    CameraControlProperty.Zoom,
    zoomValue,
    CameraControlFlags.Manual);
videoDevice.SetCameraProperty(
    CameraControlProperty.Focus,
    focusValue,
    CameraControlFlags.Manual);
videoDevice.SetCameraProperty(
    CameraControlProperty.Exposure,
    exposureValue,
    CameraControlFlags.Manual);

如果要访问其他相机属性,如亮度,对比度等,虽然可以调节,但是AForge2.2.2.5中没有直接包含函数,需要自己编译。

AForge.directshow本来就没有修改视频亮度和对比度的方法,想要实现这个方法,可以在源码中:

加上这段代码:

AForge.directshow本来就没有修改视频亮度和对比度的方法,想要实现这个方法,可以在源码中:

public bool SetCameraProcAmp(VideoProcAmpProperty property, int value, VideoProcAmpFlags controlFlags)
        {
            bool ret = true;

            // check if source was set
            if ((deviceMoniker == null) || (string.IsNullOrEmpty(deviceMoniker)))
            {
                throw new ArgumentException("Video source is not specified.");
            }

            lock (sync)
            {
                object tempSourceObject = null;

                // create source device's object
                try
                {
                    tempSourceObject = FilterInfo.CreateFilter(deviceMoniker);
                }
                catch
                {
                    throw new ApplicationException("Failed creating device object for moniker.");
                }

                if (!(tempSourceObject is IAMCameraControl))
                {
                    throw new NotSupportedException("The video source does not support camera control.");
                }

                IAMVideoProcAmp videoProcAmp = (IAMVideoProcAmp)tempSourceObject;
                int hr = videoProcAmp.Set(property, value, controlFlags);

                ret = (hr >= 0);

                Marshal.ReleaseComObject(tempSourceObject);
            }

            return ret;
        }

其中使用的枚举类型如下:

 /// <summary>
    /// From VideoProcAmpProperty
    /// </summary>
    public enum VideoProcAmpProperty
    {
        /// <summary>
        /// 亮度
        /// </summary>
        Brightness,
        /// <summary>
        /// 对比度
        /// </summary>
        Contrast,
        /// <summary>
        /// 色相
        /// </summary>
        Hue,
        /// <summary>
        /// 饱和度
        /// </summary>
        Saturation,
        /// <summary>
        /// 清晰度
        /// </summary>
        Sharpness,
        /// <summary>
        /// 伽马
        /// </summary>
        Gamma,
        /// <summary>
        /// 启用颜色
        /// </summary>
        ColorEnable,
        /// <summary>
        /// 白平衡
        /// </summary>
        WhiteBalance,
        /// <summary>
        /// 逆光对比
        /// </summary>
        BacklightCompensation,
        /// <summary>
        /// 增益
        /// </summary>
        Gain
    }

    /// <summary>
    /// From VideoProcAmpFlags
    /// </summary>
    [Flags]
    public enum VideoProcAmpFlags
    {
        /// <summary>
        /// 默认
        /// </summary>
        None = 0,
        /// <summary>
        /// 自动
        /// </summary>
        Auto = 0x0001,
        /// <summary>
        /// 手动
        /// </summary>
        Manual = 0x0002
    }

接口属性如下:

[ComImport, System.Security.SuppressUnmanagedCodeSecurity,
    Guid("C6E13360-30AC-11d0-A18C-00A0C9118956"),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    interface IAMVideoProcAmp
    {
        [PreserveSig]
        int GetRange(
            [In] VideoProcAmpProperty Property,
            [Out] out int pMin,
            [Out] out int pMax,
            [Out] out int pSteppingDelta,
            [Out] out int pDefault,
            [Out] out VideoProcAmpFlags pCapsFlags
            );

        [PreserveSig]
        int Set(
            [In] VideoProcAmpProperty Property,
            [In] int lValue,
            [In] VideoProcAmpFlags Flags
            );

        [PreserveSig]
        int Get(
            [In] VideoProcAmpProperty Property,
            [Out] out int lValue,
            [Out] out VideoProcAmpFlags Flags
            );
    }

调用方法如下:

videoDevice.SetVideoProperty(
    VideoProcAmpProperty.Brightness,
    brightnessValue,
    VideoProcAmpFlags.Manual);
 
videoDevice.SetVideoProperty(
    VideoProcAmpProperty.Contrast,
    contrastValue,
    VideoProcAmpFlags.Manual);
 
videoDevice.SetVideoProperty(
    VideoProcAmpProperty.Saturation,
    saturationValue,
    VideoProcAmpFlags.Manual);
 
videoDevice.SetVideoProperty(
    VideoProcAmpProperty.Sharpness,
    sharpnessValue,
    VideoProcAmpFlags.Manual);
 
videoDevice.SetVideoProperty(
    VideoProcAmpProperty.WhiteBalance,
    whiteBalanceValue,
    VideoProcAmpFlags.Manual);
 
videoDevice.SetVideoProperty(
    VideoProcAmpProperty.BacklightCompensation,
    backlightCompensationValue,
    VideoProcAmpFlags.Manual);

 

至此就可以抛开调节界面,自由丝滑的调节视频的亮度、饱和度等参数和相机的参数

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值