如何从过滤器访问图像数据 - DirectShow Net

时间:2013-12-25 16:36:54

标签: c# video directshow directshow.net

我想知道,如何从过滤器获取位图数据。 我正在使用DirectShowNet包装器从我的webcamera中获取图像。

我目前的代码是:

public partial class Form1 : Form
{
    public IGraphBuilder gb;
    public ICaptureGraphBuilder2 cgb;
    public IBaseFilter filter;

    public Form1()
    {
        InitializeComponent();

        DsDevice[] videoInputDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);            
        object obj = null; Guid iid = typeof(IBaseFilter).GUID;
        videoInputDevices[1].Mon.BindToObject(null, null, ref iid, out obj);
        filter = (IBaseFilter)obj;

        ((IAMCameraControl)filter).Set(CameraControlProperty.Exposure, 0, CameraControlFlags.Auto);

        gb  = (IGraphBuilder) new FilterGraph();
        cgb = (ICaptureGraphBuilder2) new CaptureGraphBuilder2();

        cgb.SetFiltergraph(gb);

        gb.AddFilter(filter, "First Filter");                        

        cgb.RenderStream(PinCategory.Preview, MediaType.Video, filter, null, null);
        ((IVideoWindow)gb).put_Owner(this.panel1.Handle);
        ((IVideoWindow)gb).put_WindowStyle(WindowStyle.Child | WindowStyle.ClipChildren);
        ((IVideoWindow)gb).put_Visible(OABool.True);
        ((IVideoWindow)gb).SetWindowPosition(0, 0, this.panel1.Width, this.panel1.Height);
        ((IMediaControl)gb).Run();
    }
}

这个简单的代码只是将webcamera输出渲染到面板控件。我尝试使用timer和SaveToBitmap函数将图像从面板复制到位图,但之后位图是空白的。

我读了一些关于Grabber过滤器的内容,但是我的解决方案没有用,它将null ptr返回到buffer / sample。

我想问一下,我应该添加什么才能读取图像数据? 非常感谢你。

2 个答案:

答案 0 :(得分:2)

DirectShow管道的标准行为是,过滤器将数据传递给另一个,而不将其显示给控制应用程序和代码,因此没有直接的方法来访问数据。

您通常会执行以下操作之一:

  1. 您可以将Sample Grabber Filter添加到管道的某个位置并进行设置,以便每次数据通过时SG都会回电
  2. 您从视频渲染器中获取当前显示视频的副本
  3. 这两种方法都有记录,流行和多次讨论,包括StackOverflow:

答案 1 :(得分:1)