Avalonia实战:5分钟搞定AForge视频采集与图像处理(附完整代码)
最近在捣鼓一个跨平台的桌面应用,需要实时采集摄像头画面并做一些简单的图像处理,比如灰度化、边缘检测什么的。一开始想着用OpenCV,但项目本身是基于Avalonia构建的,想找一个能无缝集成、上手又快的方案。试了几个库,要么依赖复杂,要么对Avalonia的支持不够友好,直到重新捡起了AForge.NET这个老朋友。你可能听说过它,一个老牌的.NET计算机视觉与人工智能库。虽然它的主力版本停留在.NET Framework时代,但社区和后续的兼容版本让它依然能在.NET Core/.NET 5+的环境下焕发新生,特别是与Avalonia这种现代UI框架搭配,竟然出奇地合适。
这篇文章就是我这段时间折腾的成果总结。我的目标很明确:让一个对Avalonia和图像处理了解不多的开发者,能在5分钟内跑通一个带实时图像处理功能的摄像头应用。我会从最基础的NuGet包引入开始,带你一步步搭建界面、连接设备、处理帧数据,最后封装成一个可复用的组件。整个过程我会避开那些晦涩的理论,聚焦在“怎么做”和“为什么这么做”上,并提供每一段可运行的代码。无论你是想为你的应用添加一个视频监控模块,还是想做一个简单的图像滤镜工具,相信这篇实战指南都能给你一个清晰的起点。
1. 环境准备与项目搭建
在开始写代码之前,我们需要把舞台搭好。这里假设你已经有一个可运行的Avalonia项目。如果你还没有,可以通过Avalonia的模板快速创建一个。我个人的习惯是使用.NET CLI命令,这比在IDE里点来点去更高效。
dotnet new avalonia.mvvm -n AvaloniaWithAForge
cd AvaloniaWithAForge
项目创建好后,用你喜欢的IDE(比如Rider或VS Code)打开。接下来是关键的一步:引入必要的NuGet包。AForge的核心库主要面向.NET Framework,但幸运的是,有社区维护的兼容版本。我们需要的主要是处理视频采集和基础图像处理的包。
核心NuGet包引用:
- AForge.Video.DirectShow: 这是用于通过DirectShow接口捕获视频的设备,是我们连接摄像头的桥梁。
- AForge.Video: 提供了视频源和处理的基础框架。
- AForge.Imaging: 包含了丰富的图像处理滤镜,如灰度化、二值化、边缘检测等。
- System.Drawing.Common: 由于AForge大量使用
System.Drawing.Bitmap,在.NET Core/5+环境中需要这个包来提供支持。
你可以通过包管理器控制台或直接编辑项目文件来添加。我更喜欢直接修改.csproj文件,一目了然:
<ItemGroup>
<PackageReference Include="AForge.Video" Version="2.2.5" />
<PackageReference Include="AForge.Video.DirectShow" Version="2.2.5" />
<PackageReference Include="AForge.Imaging" Version="2.2.5" />
<PackageReference Include="System.Drawing.Common" Version="8.0.0" />
</ItemGroup>
注意:包版本请以NuGet上的最新稳定版为准。有时你可能需要添加
AForge.Core作为基础依赖。如果编译时遇到与System.Drawing相关的错误,请确保System.Drawing.Common版本与你的.NET目标框架兼容。
安装完包之后,建议先构建一次项目,确保没有缺失的依赖。环境搭建这一步看似简单,但却是后续所有工作的基础,避免在编码中途被莫名其妙的引用错误打断思路。
2. 构建基础视频采集界面
有了基础设施,我们就可以开始构建用户界面了。一个最基础的视频采集应用需要几个核心组件:一个用于显示视频画面的区域、一个选择摄像头的下拉列表、一个选择分辨率的下拉列表,以及控制开始/停止的按钮。在Avalonia中,我们用XAML来定义这些界面元素。
我设计了一个简单的布局:顶部是控制栏,放置摄像头选择框、分辨率选择框和操作按钮;下方大部分区域留给视频显示。这里我直接使用Avalonia原生的Image控件来显示每一帧画面,虽然效率上不是最优,但对于入门和演示来说完全足够,且能让我们更清晰地理解数据流转的过程。
<!-- MainWindow.axaml -->
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AvaloniaWithAForge.Views.MainWindow"
Title="AForge视频采集" Width="800" Height="600">
<Grid RowDefinitions="Auto, *" Margin="10">
<!-- 控制面板 -->
<StackPanel Orientation="Horizontal" Spacing="10" Grid.Row="0">
<ComboBox Name="CboVideoDevices" Width="200" />
<ComboBox Name="CboResolutions" Width="150" />
<Button Name="BtnStart" Content="开始" Width="60" Click="BtnStart_Click"/>
<Button Name="BtnStop" Content="停止" Width="60" Click="BtnStop_Click" IsEnabled="False"/>
</StackPanel>
<!-- 视频显示区域 -->
<Image Name="VideoDisplayImage" Grid.Row="1" Stretch="Uniform"/>
</Grid>
</Window>
界面代码很简洁。ComboBox用于动态加载设备列表和分辨率列表,Button控制采集的启停,Image控件VideoDisplayImage则是我们的“画布”。接下来,我们要在后台代码(MainWindow.axaml.cs)中注入灵魂。
首先,我们需要在窗口类中声明几个关键的私有字段,它们将贯穿整个视频采集的生命周期:
using AForge.Video;
using AForge.Video.DirectShow;
using Avalonia.Contr

&spm=1001.2101.3001.5002&articleId=152473630&d=1&t=3&u=00d0614048d74524a28b39a56e5f69ee)
838

被折叠的 条评论
为什么被折叠?



