探索之旅:基于.net 6 的多功能自用工具开发

这是一个使用.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()
    {
        Message = "初始消息";
    }
}

在上面代码中,MainWindowViewModel 继承自 ReactiveObject,通过 RaiseAndSetIfChanged 方法,当 Message 属性值改变时,UI 会自动更新,实现了数据和视图的双向绑定。这比传统的方式简洁很多,减少了很多繁琐的代码来通知 UI 更新。

(二)OpenCvSharp

OpenCvSharp 作为 OpenCV 的.NET 包装器,让我们能在.NET 环境下轻松调用强大的 OpenCV 库。比如简单的图像读取和显示:

csharp 复制代码
using OpenCvSharp;

class Program
{
    static void Main()
    {
        Mat image = Cv2.ImRead("test.jpg");
        if (image.Empty())
        {
            Console.WriteLine("无法读取图像");
            return;
        }

        Cv2.ImShow("显示图像", image);
        Cv2.WaitKey(0);
        Cv2.DestroyAllWindows();
    }
}

这里使用 Cv2.ImRead 方法读取图像,若图像读取失败进行相应提示。Cv2.ImShow 用于显示图像,Cv2.WaitKey 等待按键输入,Cv2.DestroyAllWindows 关闭所有显示窗口。通过这些简单的 API,就能完成基本的图像处理操作,OpenCV 的强大可见一斑。

三、特色功能

(一)3D 点云数据显示

目前程序中的点云数据一部分是由格雷码条纹拍摄的照片反算生成,同时还支持导入标准的 3D 格式文件,像 stl、obj、objz、ply、3ds、lwo、off 等。虽然具体实现点云数据处理和显示的代码比较复杂,这里简单示意下加载点云数据文件的思路:

csharp 复制代码
// 假设这里有个方法加载特定格式点云数据
public void LoadPointCloudData(string filePath)
{
    // 根据文件扩展名判断文件类型
    string extension = Path.GetExtension(filePath).ToLower();
    switch (extension)
    {
        case ".stl":
            // 处理 STL 文件逻辑
            break;
        case ".obj":
            // 处理 OBJ 文件逻辑
            break;
        // 其他格式类似处理
    }
}

加载不同格式文件后,再通过相应的算法和图形库进行点云数据的渲染和显示。

(二)目标识别

利用 OpenCV 调用 YOLOv4 深度学习模型实现目标识别,为工具增添了智能化的功能。以下是大概的实现步骤:

csharp 复制代码
using OpenCvSharp;
using OpenCvSharp.Dnn;

class ObjectDetection
{
    public void DetectObjects(string modelConfiguration, string modelWeights, Mat image)
    {
        Net net = DnnNetwork.ReadNetFromDarknet(modelConfiguration, modelWeights);
        Mat blob = DnnBlob. FromImage(image, 1 / 255.0, new Size(416, 416), Scalar.All(0), true, false);
        net.SetInput(blob);
        Mat[] outs = net.Forward();

        // 处理识别结果,绘制边界框等操作
        //...
    }
}

首先通过 ReadNetFromDarknet 方法加载 YOLOv4 的模型配置和权重文件,接着将输入图像转换为适合模型处理的 blob 格式,然后通过 Forward 方法进行前向传播得到识别结果,最后对结果进行处理,比如绘制边界框标记出识别到的物体。

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

这个自用工具从想法到落地,过程中遇到不少挑战,但也收获满满。分享出来,希望能给同样在技术探索路上的小伙伴一些启发和思路。

以上代码仅是示例片段,实际项目中有更多细节和优化处理,完整的源码内也包含了部分详细解释,感兴趣的可以进一步研究。

相关推荐
djk88886 天前
layui zTree 控件 AJAX绑定 点击tree事件 获取tree值
ajax·okhttp·layui
猫猫不是喵喵.11 天前
layui表单项次大数据量导入并提交
前端·javascript·layui
医疗信息化王工17 天前
基于ASP.NET Core的住院日志统计系统设计与实现
后端·layui·asp.net core·npoi·dapper
Purgatory00125 天前
layui select重新渲染
前端·layui
滴滴答答哒1 个月前
layui表格头部按钮 加入下拉选项
前端·javascript·layui
滴滴答答哒1 个月前
layui响应式表单上下结构
前端·javascript·layui
djk88881 个月前
支持手机屏幕的layui后台html模板
前端·html·layui
EQ-雪梨蛋花汤2 个月前
【踩坑记录】使用 Layui 框架时解决 Unity WebGL 渲染在 Tab 切换时黑屏问题
unity·layui·webgl
Southern Wind3 个月前
从零封装一套企业级表格组件库 - 基于 Layui 的实战教程
前端·javascript·layui·jquery