Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从筛选器访问图像数据-DirectShowNet_C#_Video_Directshow_Directshow.net - Fatal编程技术网

C# 如何从筛选器访问图像数据-DirectShowNet

C# 如何从筛选器访问图像数据-DirectShowNet,c#,video,directshow,directshow.net,C#,Video,Directshow,Directshow.net,我试图弄清楚,我如何从过滤器中获取位图数据。 我正在使用DirectShowNet包装器从我的网络摄像机中获取图像 我目前的代码是: public partial class Form1 : Form { public IGraphBuilder gb; public ICaptureGraphBuilder2 cgb; public IBaseFilter filter; public Form1() { InitializeCompo

我试图弄清楚,我如何从过滤器中获取位图数据。 我正在使用DirectShowNet包装器从我的网络摄像机中获取图像

我目前的代码是:

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();
    }
}
这段简单的代码只是将网络摄像机输出渲染到面板控件。我尝试使用定时器和SaveToBitmap函数将图像从面板复制到位图,但之后位图是空白的

我读了一些关于Grabber过滤器的内容,但我的解决方案不起作用,它将null ptr返回到缓冲区/样本

我想问,为了能够读取图像数据,我应该添加什么?
非常感谢。

DirectShow管道的标准行为是,过滤器在不向控制应用程序和代码显示数据的情况下彼此传递数据,因此无法直接访问数据

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

  • 您将样本抓取过滤器添加到管道的特定位置,并对其进行设置,以便SG在每次有数据通过时都会回叫您
  • 从视频渲染器中获取当前显示的视频的副本
  • 这两种方法都有文档记录、流行并多次讨论,包括StackOverflow:


      • 下面是一个详细的例子: