C# · 12月 28, 2021

c# – 如何显示使用Emgu捕获的网络摄像头图像?

我目前正在使用一个使用面部识别的项目.
因此,我需要一种方式来向用户显示网络摄像头图像,以便他可以调整自己的脸部.

我一直在尝试使用尽可能少的cpu从网络摄像头获取图像的很多东西:

> VideoRendererElement
> WPFMediaKit
> DirectShow-Lib

但没有一个是好的…任何一种方式太慢或太cpu资源消耗.

然后我尝试了Emgu library,我感觉很好.
起初,我在一个Windows窗体项目中尝试过,并在图片框中更新图像.
但是,当我尝试将其整合到我的WPF项目中时,我陷入了如何将我的图像传递给我的图像控件.

现在我有以下源代码:

<Window x:Class=”HA.FacialRecognition.Enroll.Window1″ xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml” Title=”Window1″ Width=”800″ Height=”600″ Loaded=”Window_Loaded” Closing=”Window_Closing”> <Grid> <Image x:Name=”webcam” Width=”640″ Height=”480″ > <Image.Clip> <EllipseGeometry RadiusX=”240″ RadiusY=”240″> <EllipseGeometry.Center> <Point X=”320″ Y=”240″ /> </EllipseGeometry.Center> </EllipseGeometry> </Image.Clip> </Image> </Grid></Window>

和代码背后:

private Capture capture;private System.Timers.Timer timer;public Window1(){ InitializeComponent();}private void Window_Loaded(object sender,RoutedEventArgs e){ capture = new Capture(); capture.FlipHorizontal = true; timer = new System.Timers.Timer(); timer.Interval = 15; timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); timer.Start();}void timer_Elapsed(object sender,ElapsedEventArgs e){ using (Image<Bgr,byte> frame = capture.QueryFrame()) { if (frame != null) { var bmp = frame.Bitmap; // How do I pass this bitmap to my Image control called “webcam”? } }}private void Window_Closing(object sender,CancelEventArgs e){ if (capture != null) { capture.Dispose(); }}

我的猜测是使用BitmapSource / WriteableBitmap,但我没有让他们工作…

谢谢!

解决方法 Image Class有一个您可能正在寻找的UriSource属性