C# 如何更改DirectShow视频的亮度?

C# 如何更改DirectShow视频的亮度?,c#,wpf,directshow,directshow.net,C#,Wpf,Directshow,Directshow.net,首先,让我先说我对DirectShow几乎一无所知。但我的任务是调整从帧采集卡捕获的视频的亮度 我使用的是DirectShow.NET和WPFMediaKit,所以我就是这样获得视频的: DirectShowLib.DsDevice[] allDevices = WPFMediaKit.DirectShow.Controls.MultimediaUtil.VideoInputDevices; DirectShowLib.DsDevice dev = allDevices.ElementAt(0)

首先,让我先说我对DirectShow几乎一无所知。但我的任务是调整从帧采集卡捕获的视频的亮度

我使用的是DirectShow.NET和WPFMediaKit,所以我就是这样获得视频的:

DirectShowLib.DsDevice[] allDevices = WPFMediaKit.DirectShow.Controls.MultimediaUtil.VideoInputDevices;
DirectShowLib.DsDevice dev = allDevices.ElementAt(0);
这是我调整亮度的方式:

//Get the IAMVideoProcAmp
object o;
Guid IID_IBaseFilter = new Guid("56a86895-0ad4-11ce-b03a-0020af0ba770");
dev.Mon.BindToObject(null, null, ref IID_IBaseFilter, out o);
DirectShowLib.IAMVideoProcAmp vpa = (DirectShowLib.IAMVideoProcAmp)o;

//Get the flags
int pMin, pMax, pSteppingDelta, pDefault, pCurrent;
DirectShowLib.VideoProcAmpFlags pFlags;
vpa.GetRange(DirectShowLib.VideoProcAmpProperty.Brightness, out pMin, out pMax, out pSteppingDelta, out pDefault, out pFlags);
vpa.Get(DirectShowLib.VideoProcAmpProperty.Brightness, out pCurrent, out pFlags);

//Set the slider                
brightnessSlider.Maximum = pMax;
brightnessSlider.Minimum = pMin;
brightnessSlider.Value = pCurrent;
该代码对我的网络摄像头有效。但是,当我尝试在来自帧采集卡的视频上执行此操作时,它会显示以下错误:

无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“DirectShowLib.IAMVideoProcAmp”。此操作失败,因为对IID为“{C6E13360-30AC-11D0-A18C-00A0C9118956}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT的异常:0x80004002(E_NOINTERFACE))。

。。。在这一行:

DirectShowLib.IAMVideoProcAmp vpa = (DirectShowLib.IAMVideoProcAmp)o;

您知道如何修复或调整来自frame grabber卡的此视频的亮度吗?

有两种更改亮度的方法:

//Get the IAMVideoProcAmp
object o;
Guid IID_IBaseFilter = new Guid("56a86895-0ad4-11ce-b03a-0020af0ba770");
dev.Mon.BindToObject(null, null, ref IID_IBaseFilter, out o);
DirectShowLib.IAMVideoProcAmp vpa = (DirectShowLib.IAMVideoProcAmp)o;

//Get the flags
int pMin, pMax, pSteppingDelta, pDefault, pCurrent;
DirectShowLib.VideoProcAmpFlags pFlags;
vpa.GetRange(DirectShowLib.VideoProcAmpProperty.Brightness, out pMin, out pMax, out pSteppingDelta, out pDefault, out pFlags);
vpa.Get(DirectShowLib.VideoProcAmpProperty.Brightness, out pCurrent, out pFlags);

//Set the slider                
brightnessSlider.Maximum = pMax;
brightnessSlider.Minimum = pMin;
brightnessSlider.Value = pCurrent;
  • 像视频捕获卡这样的实时源可能支持
    iamdevideoprocamp
    接口,该接口可能支持亮度调整,如果您同时具备上述两种功能,则可以控制所捕获视频的亮度
  • 流媒体管道可能具有解码器/效果过滤器,其改变通过的视频的亮度;特别是stock能够完成这项任务。在构建图形时,您当然应该将其添加到拓扑中,然后分别更新其属性。该方法不要求输入或输出设备具有特殊的亮度能力

  • 您的想法-是时候学习您的工作和阅读文档了?IUn—特别是用于抓取卡的驱动程序—它应该告诉您它支持哪些接口。显然,它不支持IAMDevideoProCamp,但它应该有一些亮度设置界面。我们真的帮不了你-你甚至不能告诉我们那是什么硬件。