1. 工业视觉框架设计背景与核心思路
去年在口罩机外观检测项目中,我们遇到了一个典型痛点:甲方总在验收前临时提出"加个旋转检测"这类需求。传统Halcon+C#开发模式需要重新编译部署,响应速度完全跟不上客户节奏。这促使我开发了一套VisionPro风格的拖拉拽式框架,核心目标是实现算法工程师能独立调整检测流程,无需程序员介入。
这套框架的技术栈选择经过深思熟虑:
- WPF作为UI框架:其数据绑定和模板系统能完美支持动态界面生成
- MVVM模式:将算子逻辑与界面解耦,便于后期扩展
- HalconDotNet:直接调用Halcon算法库,保持原生性能
- Roslyn:实现运行时脚本编译,支持自定义算法扩展
框架最关键的创新点在于将Halcon算子封装成可拖拽的视觉工具。每个工具实质是一个预置的HDevelop脚本模板,附带参数配置界面。当用户在画布上连接多个工具时,框架会自动生成执行管道。这种设计在深圳某口罩生产线实测中,成功应对了12小时连续运转的稳定性考验。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 框架架构解析与核心模块实现
2.1 仿VisionPro的三栏界面设计
界面布局借鉴VisionPro经典结构,但实现完全基于WPF自定义控件:
- 左侧算子库:TreeView绑定分层结构的ViewModel
xml复制<TreeView ItemsSource="{Binding ToolCategories}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Tools}">
<TextBlock Text="{Binding CategoryName}"/>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Tag="{Binding Script}">
<Image Source="{Binding Icon}" Width="16"/>
<TextBlock Text="{Binding ToolName}" Margin="5,0"/>
</StackPanel>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
关键细节:每个算子项的Tag属性存储了对应的HDevelop脚本内容,为后续拖拽操作提供数据源
- 中间画布区:自定义Canvas控件支持连线、缩放和网格吸附
- 右侧属性面板:动态生成控件绑定算子参数
2.2 拖拽交互的底层实现
拖拽操作的核心在于处理Windows的OLE拖放协议。我们在算子项的PreviewMouseMove事件中触发拖拽:
csharp复制private void OnToolItemPreviewMouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButto
