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

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

相关推荐
终端行者20 小时前
Nginx四层负载均衡配置 Stream模块使用
运维·nginx·负载均衡
凸头1 天前
Nginx配置学习
运维·学习·nginx
南梦浅1 天前
Flask+Gunicorn+Nginx 校园众筹项目部署全流程(生产环境)
nginx·flask·gunicorn
卿着飞翔1 天前
win11安装配置nginx并部署ruoyi前端
运维·前端·nginx
xiaobangsky1 天前
使用Nginx配置本地静态资源iscweb访问后端服务fs-isc
运维·nginx
L1624761 天前
LVS+Keepalived+Nginx+Tomcat 高可用集群超详细配置手册
nginx·tomcat·lvs
阿杰 AJie2 天前
Nginx配置静态资源服务器
运维·服务器·nginx
sunnyday04262 天前
Nginx与Spring Cloud Gateway QPS统计全攻略
java·spring boot·后端·nginx
何以不说话2 天前
zabbix部署及nginx的监控
运维·nginx·zabbix