如何使用 directShow 在 WPF ImageControl 中托管来自网络摄像头的输出

how to host output from a Webcam inside of a WPF ImageControl using directShow

我想在用户定位 his/herself 拿护照时将 WEBCAM 输出显示到 WPF 中的图像控件。我正在使用 DirectShow 库,我可以捕获图像并将其放置在图像控件中,但在我捕获图像之前图像控件保持空白。请问如何确保图像控件在用户捕获 his/her 图像之前显示网络摄像头输出?。谢谢

这是我觉得控制我想要实现的功能

private void ConfigVideoWindow(System.Windows.Controls.Image hControl)
    {
        HwndSource source = (HwndSource)HwndSource.FromVisual(hControl);
        int hr;

        IVideoWindow ivw = m_FilterGraph as IVideoWindow;

        // Set the parent
        hr = ivw.put_Owner(source.Handle);//i need to create an handle for the image control and pass it here. but i cannot do that
        DsError.ThrowExceptionForHR(hr);

        // Turn off captions, etc
        hr = ivw.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipChildren | WindowStyle.ClipSiblings);
        DsError.ThrowExceptionForHR(hr);

        // Yes, make it visible
        hr = ivw.put_Visible(OABool.True);
        DsError.ThrowExceptionForHR(hr);

        // Move to upper left corner
        Rectangle rc = new Rectangle();// changed from hControl.ClientRectangle
        hr = ivw.SetWindowPosition(0, 0, Convert.ToInt32(hControl.Height), Convert.ToInt32(hControl.Width));
        DsError.ThrowExceptionForHR(hr);
    }

我已经评论了我认为我的问题来自的那一行。感谢您的帮助

您可以像这样创建 Directshow 图表:

网络摄像头 ---> SampleGrabber --> 空渲染器

它会给你一个直播,你可以用它来捕捉图像。

说不定对你有帮助。

我终于知道怎么做了。我必须使用 windowsformhost 在我的 xaml 代码的网格中托管 windows 表单图片框,如下所示

        <WindowsFormsHost Name="ima" HorizontalAlignment="Left" Height="300" Margin="98,105,0,0" VerticalAlignment="Top" Width="350" Background="Black" >

        </WindowsFormsHost>

然后我在这个 xaml 页面的构造函数中添加了图片框,就像这样

// Create the interop host control.
        System.Windows.Forms.Integration.WindowsFormsHost host =
            new System.Windows.Forms.Integration.WindowsFormsHost();

        // Create the PictureBox control.
        PictureBox picBox = new PictureBox();
        picBox.Width = 350;
        picBox.Height = 300;
        // Assign the MaskedTextBox control as the host control's child.
        ima.Child = picBox;

        // Add the interop host control to the Grid
        // control's collection of child controls.
        this.grid1.Children.Add(host);

然后我将问题中的函数修改为这个

private void ConfigVideoWindow(System.Windows.Forms.PictureBox picBox)
    {
        int hr;

        IVideoWindow ivw = m_FilterGraph as IVideoWindow;

        // Set the parent
        hr = ivw.put_Owner(picBox.Handle);
        DsError.ThrowExceptionForHR(hr);

        // Turn off captions, etc
        hr = ivw.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipChildren | WindowStyle.ClipSiblings);
        DsError.ThrowExceptionForHR(hr);

        // Yes, make it visible
        hr = ivw.put_Visible(OABool.True);
        DsError.ThrowExceptionForHR(hr);

        // Move to upper left corner
        Rectangle rc = picBox.ClientRectangle;
        hr = ivw.SetWindowPosition(0, 0, rc.Right, rc.Bottom);
        DsError.ThrowExceptionForHR(hr);
    }

我希望这对某人有所帮助。请注意包含您放置 windows 表单主机的 xaml 页面的 window 不应将透明度设置为 true,否则将不会显示。