参考链接: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);
至此就可以抛开调节界面,自由丝滑的调节视频的亮度、饱和度等参数和相机的参数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)