这是一个使用.net 6 基于wpf 、OpencvSharp(opencv的.net wrapper)、ReactiveUI等开发的自用工具,主要用来做ReactiveUI与OpencvSharp学习过程中的尝试以及opencv算子参数的调试等,该程序还可以显示3D点云数据(目前程序中的点云数据是由格雷码条纹拍摄的照片反算生成了,还可以导入标准的3d格式的文件stl、obj、objz、ply、3ds、lwo、off),还包含有opencv调用yolov4深度学习模型实现目标识别, 本源码内包含部分解释

在技术的广袤天地里,总有人热衷于探索不同技术的融合,打造出既实用又充满趣味的工具。今天就来和大家分享一下我基于.NET 6,结合 WPF、OpenCVSharp 以及 ReactiveUI 开发的自用工具,这个工具就像是我的技术试验田,承载着我在学习与实践中的种种尝试。
开发背景与初衷
这个工具最初的构想,源于对 ReactiveUI 和 OpenCVSharp 的浓厚兴趣。在学习过程中,单纯的理论学习总是略显枯燥,不如通过实际项目来探索它们的各种可能性。同时,在进行计算机视觉相关开发时,经常需要调试 OpenCV 算子参数,而一个专门为此打造的工具就显得十分必要。
核心技术与代码实现
ReactiveUI 的运用
ReactiveUI 为我们带来了响应式编程的强大能力,让数据的流动与交互更加清晰自然。在项目中,我们可以通过以下代码来感受它的魅力。
csharp
// 创建一个可观察的属性
public class MainWindowViewModel : ReactiveObject
{
private string _message;
public string Message
{
get => _message;
set => this.RaiseAndSetIfChanged(ref _message, value);
}
public MainWindowViewModel()
{
// 示例:当某个条件满足时,更新消息
this.WhenAnyValue(x => x.SomeProperty)
.Where(x => x > 10)
.Subscribe(_ => Message = "SomeProperty 大于 10 啦!");
}
}
在这段代码中,ReactiveObject 是 ReactiveUI 提供的基础类,用于创建具有可观察属性的视图模型。RaiseAndSetIfChanged 方法会自动通知视图属性值发生了改变,而 WhenAnyValue 结合 Where 和 Subscribe 则实现了响应式逻辑,当 SomeProperty 大于 10 时,更新 Message 属性,视图会自动响应这个变化并更新显示。
OpenCVSharp 的魔法
OpenCVSharp 作为 OpenCV 的.NET 包装器,让我们可以在.NET 环境中方便地调用 OpenCV 的强大功能。例如,使用 OpenCV 进行图像的简单读取与显示:
csharp
using OpenCvSharp;
class Program
{
static void Main()
{
// 读取图像
Mat image = Cv2.ImRead("test.jpg");
if (image.Empty())
{
Console.WriteLine("无法读取图像");
return;
}
// 显示图像
Cv2.ImShow("Image", image);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();
}
}
这里通过 Cv2.ImRead 方法读取图像文件,如果读取成功,就使用 Cv2.ImShow 方法显示图像,Cv2.WaitKey 用于等待用户按键,最后 Cv2.DestroyAllWindows 销毁所有显示窗口。在实际的工具开发中,这只是冰山一角,更多的是利用 OpenCV 的各种算子来处理图像数据,比如边缘检测、特征提取等,而这也是工具用于调试算子参数的核心功能。
深度学习目标识别(Yolov4)
在工具中,利用 OpenCV 调用 Yolov4 深度学习模型实现目标识别是一大亮点。虽然这部分代码相对复杂,但核心步骤大致如下:
csharp
// 加载模型
Net net = Cv2.Dnn.ReadNetFromDarknet("yolov4.cfg", "yolov4.weights");
// 设置输入图像尺寸等参数
Mat blob = Cv2.Dnn.BlobFromImage(image, 1 / 255.0, new Size(416, 416), new Scalar(0, 0, 0), true, false);
net.SetInput(blob);
// 前向传播获取检测结果
Mat[] outs = net.Forward(net.GetUnconnectedOutLayersNames());
首先,通过 ReadNetFromDarknet 方法加载 Yolov4 的配置文件和权重文件,创建 Net 对象。然后,使用 BlobFromImage 方法将输入图像转换为适合模型输入的格式,设置好相关参数后,通过 SetInput 方法将数据输入模型,最后通过 Forward 方法进行前向传播,获取检测结果。当然,后续还需要对检测结果进行解析和绘制,以在图像上标注出检测到的目标。
3D 点云数据的显示
这个工具不仅局限于 2D 图像的处理,还具备显示 3D 点云数据的能力。目前程序中的点云数据来源多样,既可以由格雷码条纹拍摄的照片反算生成,也支持导入标准的 3D 格式文件,如 stl、obj、objz、ply、3ds、lwo、off 等。

这是一个使用.net 6 基于wpf 、OpencvSharp(opencv的.net wrapper)、ReactiveUI等开发的自用工具,主要用来做ReactiveUI与OpencvSharp学习过程中的尝试以及opencv算子参数的调试等,该程序还可以显示3D点云数据(目前程序中的点云数据是由格雷码条纹拍摄的照片反算生成了,还可以导入标准的3d格式的文件stl、obj、objz、ply、3ds、lwo、off),还包含有opencv调用yolov4深度学习模型实现目标识别, 本源码内包含部分解释

在处理 3D 数据显示时,会用到一些 3D 图形库相关知识。例如,在 WPF 中可以借助 Helix Toolkit 来实现 3D 场景的渲染和点云数据的显示。虽然代码较多,但大致思路如下:
xml
<helix:HelixViewport3D x:Name="viewport">
<helix:ModelVisual3D>
<helix:PointGeometryModel3D Points="{Binding PointCloudPoints}" />
</helix:ModelVisual3D>
</helix:HelixViewport3D>
在 XAML 中定义一个 HelixViewport3D 作为 3D 场景的容器,然后通过 PointGeometryModel3D 来显示点云数据,这里的 PointCloudPoints 是视图模型中绑定的点云数据集合。在后台代码中,根据不同的点云数据来源,解析数据并填充到这个集合中,从而实现 3D 点云数据的可视化。
总结
这个基于.NET 6 的自用工具,融合了 WPF 的界面开发优势、OpenCVSharp 的计算机视觉能力以及 ReactiveUI 的响应式编程理念,同时还加入了 3D 点云数据显示和深度学习目标识别的功能,在学习与实践过程中收获颇丰。源码中也包含了部分解释,希望这个工具能给同样对这些技术感兴趣的朋友一些启发和帮助,一起在技术的海洋中畅游。

以上就是这个工具的大致情况啦,如果你有任何问题或者建议,欢迎在评论区留言交流!




