探索.NET 6 下 WPF、OpenCVSharp 与 ReactiveUI 的奇妙之旅

这是一个使用.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 结合 WhereSubscribe 则实现了响应式逻辑,当 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 点云数据显示和深度学习目标识别的功能,在学习与实践过程中收获颇丰。源码中也包含了部分解释,希望这个工具能给同样对这些技术感兴趣的朋友一些启发和帮助,一起在技术的海洋中畅游。

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

相关推荐
洛菡夕1 天前
nginx安全防护与HTTPS部署实战
nginx·安全·https
刘晨鑫12 天前
Nginx性能调优
运维·nginx
**蓝桉**2 天前
prometheus监控nginx
nginx·elasticsearch·prometheus
sszdzq2 天前
docker 安装 Nginx
nginx·docker·容器
我爱学习好爱好爱2 天前
ELK 7.17.10 + Redis 5.0.7 构建高可用 Nginx 日志收集系统(Rocky Linux 9.6 实战)
redis·nginx·elk
kc胡聪聪2 天前
nginx的性能优化与监控
运维·nginx·性能优化
zzh0812 天前
nginx安全笔记
笔记·nginx·安全
A10169330712 天前
Nginx 之Rewrite 使用详解
运维·nginx
vanvivo2 天前
Nginx中如何配置WebSocket代理?
运维·websocket·nginx
Java小白笔记2 天前
Nginx中配置IP白名单动态刷新
运维·tcp/ip·nginx