在XAML文件中,添加一个Image控件用于显示摄像头的视频流:
<Window x:Class="CameraApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Camera App" Height="450" Width="800">
<Grid>
<Image x:Name="cameraImage" />
</Grid>
</Window>
在需要的.xaml.cs文件中,添加以下代码:
using System;
using System.Windows;
using OpenCvSharp;
using OpenCvSharp.Extensions;
namespace CameraApp
{
public partial class MainWindow : Window
{
private VideoCapture capture;
private bool isCapturing;
public MainWindow()
{
InitializeComponent();
}
private void StartCapture()
{
capture = new VideoCapture(0); // 0表示默认摄像头,如果有多个摄像头可以尝试不同的索引
isCapturing = true;
// 启动一个线程来循环读取摄像头的视频流
new System.Threading.Thread(() =>
{
while (isCapturing)
{
using (Mat frame = new Mat())
{
if (capture.Read(frame))
{
// 将帧转换成WPF的ImageSource格式
var imageSource = frame.ToBitmapSource();
// 在UI线程上更新Image控件的内容
Dispatcher.Invoke(() => cameraImage.Source = imageSource);
}
}
}
}).Start();
}
private void StopCapture()
{
isCapturing = false;
capture.Release();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
StartCapture();
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
StopCapture();
}
}
}
StartCapture()方法用于启动读取摄像头的视频流。它首先创建一个VideoCapture对象,指定索引为0表示默认摄像头(如果有多个摄像头,可以尝试不同的索引)。
然后,使用一个循环不断读取摄像头的帧。对于每一帧,将其转换为WPF的ImageSource格式,并在UI线程上更新Image控件的内容。
StopCapture()方法用于停止读取视频流,释放摄像头资源。
在Window_Loaded事件中调用StartCapture()方法启动读取视频流,在Window_Closing事件中调用StopCapture()方法停止读取。
这样,当程序启动时,摄像头的视频流将会在Image控件中显示出来。