如何使用 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,否则将不会显示。
我想在用户定位 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,否则将不会显示。