找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1113

积分

0

好友

163

主题
发表于 前天 23:33 | 查看: 5| 回复: 0

在工业视觉检测领域,一套界面美观、架构清晰且易于扩展的软件平台,对于提升开发效率和现场部署的灵活性至关重要。市面上许多通用工具往往在定制化或快速适配方面存在不足,因此,构建一个符合实际项目需求的平台成为许多开发者的目标。本文将介绍一款基于 MVVM 模式构建的 WPF 工业视觉平台,它通过集成 HandyControl 美化界面,并借助 Halcon 强大的图像处理库,实现了功能性与可维护性的平衡。

平台架构概述

该项目采用插件化的模块设计理念。主程序核心负责流程调度、界面呈现与用户交互,而具体的图像处理算法则被封装在独立的插件中,通过统一的 PluginBase 接口进行调用。这种设计使得算法工程师可以专注于算子开发,无需关心 UI 或流程控制逻辑;同时,系统支持插件的动态加载,极大地便利了后期功能的扩展与现场维护。平台已集成日志管理、参数绑定、可视化流程图编辑、Halcon 对象实时显示等关键模块,构成了一个完整的视觉开发环境原型。

核心功能特性

  1. Halcon 对象可视化:支持 HImage(图像)与 HRegion(区域)的实时显示与交互操作。
  2. 可视化流程图编辑:通过拖拽节点(ProcessNode)并连接端口,直观地构建图像处理流水线。
  3. 参数自动绑定机制:上游节点的输出参数可自动映射为下游节点的输入,减少了繁琐的手动配置。
  4. 动态插件管理:内置插件菜单系统,能够动态扫描、加载并管理各类视觉算子插件。
  5. 集成化日志系统:通过 LogMgr 模块统一记录运行状态、错误信息与调试输出,支持分级查看。

技术栈详解

  • UI 框架:基于 WPF 构建桌面应用程序界面,并采用 HandyControl 组件库实现现代化视觉效果(如圆角窗口、动画按钮等)。
  • 图像处理库:集成 Halcon 12,调用其高性能算子完成图像采集、处理与分析任务。
  • 架构模式:采用 MVVM 设计模式,借助 mvvmlight 框架实现视图与业务逻辑的解耦,支持命令绑定与消息通信。
  • 数据序列化:使用 Newtonsoft.Json 进行配置文件与插件参数的读写,便于整个处理流程的保存与加载。
  • 功能模块
    • 插件机制:所有图像处理功能均以插件形式封装,遵循 PluginBase 接口规范,支持热插拔。
    • 可视化流程:通过节点连线构建算法执行流水线,清晰展示处理顺序与数据流向。
    • 参数绑定:自动关联上下游节点的输入输出,提升流程搭建效率。
    • Halcon 显示:实现 HImage 和 HRegion 在 WPF 界面上的实时渲染与结果叠加,方便调试验证。

关键代码解析:Halcon 图像转换

在 WPF 中显示 Halcon 图像对象需要格式转换,因为两者使用不同的图像内存表示方式。以下代码展示了将 Halcon 的 HImage 转换为 WPF BitmapImage 的核心过程,其思路是:先将 HImage 临时保存为位图文件,再读取并修正 DPI 后加载到内存流中。

private static BitmapImage ConvertHImageToBitmapImage(object img)
{
    if (img == null)
        return null;
    string tempFolderPath = Path.GetTempPath();
    string fileName = Guid.NewGuid().ToString() + ".bmp";
    string filePath = Path.Combine(tempFolderPath, fileName);

    HObject obj = img as HObject;
    HImage image = new HImage(obj);
    image.WriteImage("bmp", 255, filePath);

    BitmapImage originalBitmap = new BitmapImage();
    originalBitmap.BeginInit();
    originalBitmap.UriSource = new Uri(filePath, UriKind.Absolute);
    originalBitmap.CacheOption = BitmapCacheOption.OnLoad;
    originalBitmap.EndInit();

    int stride = originalBitmap.PixelWidth * ((originalBitmap.Format.BitsPerPixel + 7) / 8);
    byte[] pixelData = new byte[originalBitmap.PixelHeight * stride];
    originalBitmap.CopyPixels(pixelData, stride, 0);

    BitmapSource correctedBitmap = BitmapSource.Create(
        originalBitmap.PixelWidth,
        originalBitmap.PixelHeight,
        96,
        96,
        originalBitmap.Format,
        originalBitmap.Palette,
        pixelData,
        stride
    );
    correctedBitmap.Freeze();
    File.Delete(filePath);

    BitmapImage bitmapImage = new BitmapImage();
    using (MemoryStream memoryStream = new MemoryStream())
    {
        BitmapEncoder encoder = new BmpBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(correctedBitmap));
        encoder.Save(memoryStream);
        memoryStream.Position = 0;

        bitmapImage.BeginInit();
        bitmapImage.StreamSource = memoryStream;
        bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
        bitmapImage.EndInit();
        bitmapImage.Freeze();
    }
    return bitmapImage;
}

平台运行效果

启动软件后,主界面分为三个主要区域:左侧为动态生成的插件菜单,中间是流程图编辑画布,右侧是参数配置与日志输出面板。用户只需从菜单拖拽所需插件节点至画布,并通过连线定义数据流向,即可快速搭建一个完整的视觉检测流程。

在流程运行时,Halcon 的处理结果(如边缘轮廓、缺陷区域等)能够实时叠加显示在原始图像上。日志窗口会同步输出各个节点的执行状态与关键数据,为现场调试提供了极大的便利。

项目源码与运行准备

使用前注意事项:

  1. 需要在项目中重新引用本地 Halcon 安装目录下的 HalconDotnet.dll
  2. 确保运行环境中已安装 Halcon 运行时库(包含 halcon.dll)。

总结

本项目提供了一个面向工业视觉检测的平台架构参考实现。它没有集成复杂的 AI 算法或数据库系统,但其核心价值在于展示了一套清晰、实用且高度可扩展的 WPF 与 Halcon 集成方案。对于希望从零开始构建视觉系统,或深入研究桌面端工业软件架构的开发者而言,该项目在插件化设计、数据处理和界面交互方面提供了有价值的实践思路。良好的架构设计是软件长期演进的基石,期待这个项目能成为开发者们进行二次开发与创新的起点。




上一篇:STM32逻辑运算实战解析:米思齐与C语言中的“与”(&&)和“或”(||)用法详解
下一篇:Vite+React快速部署:将Gemini生成的手部追踪3D应用本地运行
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-17 13:35 , Processed in 0.130158 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表