在工业视觉检测领域,一套界面美观、架构清晰且易于扩展的软件平台,对于提升开发效率和现场部署的灵活性至关重要。市面上许多通用工具往往在定制化或快速适配方面存在不足,因此,构建一个符合实际项目需求的平台成为许多开发者的目标。本文将介绍一款基于 MVVM 模式构建的 WPF 工业视觉平台,它通过集成 HandyControl 美化界面,并借助 Halcon 强大的图像处理库,实现了功能性与可维护性的平衡。
平台架构概述
该项目采用插件化的模块设计理念。主程序核心负责流程调度、界面呈现与用户交互,而具体的图像处理算法则被封装在独立的插件中,通过统一的 PluginBase 接口进行调用。这种设计使得算法工程师可以专注于算子开发,无需关心 UI 或流程控制逻辑;同时,系统支持插件的动态加载,极大地便利了后期功能的扩展与现场维护。平台已集成日志管理、参数绑定、可视化流程图编辑、Halcon 对象实时显示等关键模块,构成了一个完整的视觉开发环境原型。
核心功能特性
- Halcon 对象可视化:支持 HImage(图像)与 HRegion(区域)的实时显示与交互操作。
- 可视化流程图编辑:通过拖拽节点(
ProcessNode)并连接端口,直观地构建图像处理流水线。
- 参数自动绑定机制:上游节点的输出参数可自动映射为下游节点的输入,减少了繁琐的手动配置。
- 动态插件管理:内置插件菜单系统,能够动态扫描、加载并管理各类视觉算子插件。
- 集成化日志系统:通过
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 的处理结果(如边缘轮廓、缺陷区域等)能够实时叠加显示在原始图像上。日志窗口会同步输出各个节点的执行状态与关键数据,为现场调试提供了极大的便利。
项目源码与运行准备
使用前注意事项:
- 需要在项目中重新引用本地 Halcon 安装目录下的
HalconDotnet.dll。
- 确保运行环境中已安装 Halcon 运行时库(包含
halcon.dll)。
总结
本项目提供了一个面向工业视觉检测的平台架构参考实现。它没有集成复杂的 AI 算法或数据库系统,但其核心价值在于展示了一套清晰、实用且高度可扩展的 WPF 与 Halcon 集成方案。对于希望从零开始构建视觉系统,或深入研究桌面端工业软件架构的开发者而言,该项目在插件化设计、数据处理和界面交互方面提供了有价值的实践思路。良好的架构设计是软件长期演进的基石,期待这个项目能成为开发者们进行二次开发与创新的起点。
|