HSmartWindowControl 之 摄像头实时显示( 使用 WPF )
时间: 2024-06-08 17:06:56 浏览: 140
要实现摄像头实时显示,我们需要使用 WPF 的 MediaElement 控件和 WPF 自带的视频捕获类 VideoCaptureDevice。下面是实现步骤:
1. 首先需要引入 AForge 和 AForge.Video.WPF 两个 Nuget 包,这两个包提供了视频捕获和 WPF 控件的支持。
2. 在 XAML 中添加一个 MediaElement 控件:
```xml
<MediaElement x:Name="videoPlayer" Stretch="Uniform" />
```
3. 在后台代码中初始化 VideoCaptureDevice,并将其绑定到 MediaElement 控件上。
```csharp
using AForge.Video;
using AForge.Video.DirectShow;
using AForge.Video.WPF;
private FilterInfoCollection videoDevices;
private VideoCaptureDevice videoDevice;
private void InitCamera()
{
// 获取所有视频设备
this.videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (this.videoDevices.Count == 0)
{
MessageBox.Show("未找到可用摄像头");
return;
}
// 初始化视频设备并绑定到MediaElement控件
this.videoDevice = new VideoCaptureDevice(this.videoDevices[0].MonikerString);
this.videoDevice.NewFrame += VideoDevice_NewFrame;
this.videoPlayer.SetCurrentValue(MediaElement.StretchDirectionProperty, StretchDirection.DownOnly);
this.videoPlayer.SetCurrentValue(MediaElement.StretchProperty, Stretch.Uniform);
this.videoPlayer.SetCurrentValue(MediaElement.SourceProperty, new VideoCaptureDevicePlayer(this.videoDevice));
}
private void VideoDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
// 将摄像头采集到的帧显示在MediaElement控件上
this.videoPlayer.Dispatcher.Invoke(() =>
{
this.videoPlayer.SetCurrentValue(MediaElement.StretchDirectionProperty, StretchDirection.DownOnly);
this.videoPlayer.SetCurrentValue(MediaElement.StretchProperty, Stretch.Uniform);
this.videoPlayer.SetCurrentValue(MediaElement.SourceProperty, BitmapSourceConvert.ToBitmapSource(eventArgs.Frame));
});
}
```
4. 在窗口加载完成时调用 InitCamera 方法初始化摄像头。
```csharp
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
InitCamera();
}
```
这样就可以实现摄像头实时显示了。需要注意的是,如果要在窗口关闭时释放摄像头资源,需要在窗口的 Closing 事件中调用 videoDevice.SignalToStop() 方法停止视频捕获。
完整代码可参考以下链接:
https://github.com/Huachao/SmartWindowControl/blob/master/SmartWindowControl/MainWindow.xaml.cs
阅读全文