我想知道,如何从过滤器获取位图数据。 我正在使用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。
我想问一下,我应该添加什么才能读取图像数据? 非常感谢你。
答案 0 :(得分:2)
DirectShow管道的标准行为是,过滤器将数据传递给另一个,而不将其显示给控制应用程序和代码,因此没有直接的方法来访问数据。
您通常会执行以下操作之一:
这两种方法都有记录,流行和多次讨论,包括StackOverflow:
答案 1 :(得分:1)