news 2026/2/12 19:41:14

Halcon联合C#开发最新版实用框架 实际项目应用验证过的版本,源码,修改了大量Bug以适合...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Halcon联合C#开发最新版实用框架 实际项目应用验证过的版本,源码,修改了大量Bug以适合...

Halcon联合C#开发最新版实用框架 实际项目应用验证过的版本,源码,修改了大量Bug以适合实际项目应用 采用仿Visionpro拖拉流程形式,很适合学习使用,可修改参考用于项目。 注:软件能够正常编译运行,使用中遇到Bug自行摸索解决,主要是源码学习参考为主。

工业视觉项目的甲方总喜欢在验收前一天提出"能不能加个旋转检测"这种需求。去年用Halcon+C#折腾出的那套框架,最近被我改造成了VisionPro风格的拖拉拽工具,实测在口罩机外观检测项目里扛住了每天12小时连续运转。今天就带大家扒开这个框架的代码骨架,看看怎么用WPF把Halcon算子玩出花。

流程设计器的界面布局直接照抄了VisionPro的经典三栏结构(别问,问就是致敬)。左侧的算子库用TreeView实现层级分类,这部分XAML代码值得细品:

<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}"/> <TextBlock Text="{Binding ToolName}" Margin="5"/> </StackPanel> </DataTemplate> </HierarchicalDataTemplate.ItemTemplate> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView>

绑定ViewModel里的ToolCategories集合时,注意每个算子都带有脚本属性和图标路径,这为后续的拖拽操作埋下伏笔。当用户把Blob分析工具拖到画布时,实际是复制了预置的HDevelop脚本模板。

核心的拖拽逻辑藏在PreviewMouseMove事件里。判断鼠标移动距离超过系统阈值后,启动拖拽操作:

private void OnToolItemPreviewMouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed && _startPoint.HasValue && (e.GetPosition(null) - _startPoint.Value).Length > 2.0) { var frameworkElement = sender as FrameworkElement; var data = new DataObject("ToolTemplate", frameworkElement.Tag.ToString()); DragDrop.DoDragDrop(frameworkElement, data, DragDropEffects.Copy); } }

这里有个坑:直接从Halcon导出的hdev脚本在C#环境里跑不起来,得手动替换掉那些反人类的变量命名。比如把AreaCenter转成area_center,还要处理坐标系转换问题——工业相机拍出来的图Y轴是反的!

参数配置窗体用了动态生成控件的大招。读取算子脚本的输入输出参数后,自动渲染对应控件:

foreach (var param in script.Parameters) { switch (param.Type) { case "int": var numBox = new NumericUpDown { Value = param.Value }; _paramControls.Add(param.Name, numBox); break; case "string": var txtBox = new TextBox { Text = param.Value.ToString() }; _paramControls.Add(param.Name, txtBox); break; // 其他类型处理... } }

调试时发现Halcon的阈值参数用double类型传参会精度丢失,后来改成字符串传递再在脚本里转换才解决。这种坑文档里可不会写,都是项目现场踩出来的经验。

流程引擎最核心的部分是算子执行队列。用BackgroundWorker跑异步任务时,切记要加try-catch把Halcon异常转成C#异常:

private void RunProcess(object sender, DoWorkEventArgs e) { var process = e.Argument as Process; try { foreach (var tool in process.Tools) { _halconEngine.ExecuteScript(tool.Script); // 更新进度条需要回UI线程 (sender as BackgroundWorker).ReportProgress(0, tool.ToolName); } e.Result = true; } catch (HOperatorException ex) { // 这里要解析Halcon错误代码 e.Result = new ProcessError(ex.Message, ex.ErrorCode); } }

重点注意HOperatorException的ErrorCode需要查Halcon文档,特别是2000系列错误基本都是图像没载入或区域为空这种低级错误。

图像显示控件继承自HalconDotNet.HWindowControl,但原始版本在多线程下会花屏。改进方案是加双缓冲:

public class HSmartWindow : HWindowControl { protected override void OnPaint(PaintEventArgs e) { if (_backBuffer != null) { lock (_backBuffer) { e.Graphics.DrawImageUnscaled(_backBuffer, 0, 0); } } } public void UpdateImage(HImage image) { using (var g = Graphics.FromImage(_backBuffer)) { // 这里调用Halcon的dump_window方法生成Bitmap var bitmap = image.DumpWindow(this.HalconWindow); g.DrawImage(bitmap, 0, 0); } Invoke(new Action(Refresh)); } }

实测这个改写版本在i7处理器上能稳定跑60fps的1280x1024图像,比原生控件节省30%的CPU占用率。注意一定要加lock,否则多线程渲染时会内存溢出。

项目里还藏了些黑科技:比如用Roslyn动态编译用户自定义脚本,支持在界面里写C#代码直接操作Halcon对象;再比如用EF Core记录每次检测的算法参数和结果,方便后续追溯质量问题。

源码里最值得参考的是异常处理机制——毕竟工业现场的环境千奇百怪。我们给每个算子都加了try-catch包装,发生错误时自动保存现场图像和参数到错误目录,这对后期调试帮助巨大。

最后友情提示:别在UI线程里调用任何Halcon的耗时操作,否则拖动滚动条时画面会卡成PPT。正确做法是用Task.Run把图像处理丢到线程池,然后用Dispatcher.BeginInvoke更新界面。不过要注意Halcon对象不是线程安全的,跨线程使用记得加锁或者克隆对象。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/5 9:09:50

DLSS Swapper终极指南:轻松管理游戏DLSS版本

DLSS Swapper终极指南&#xff1a;轻松管理游戏DLSS版本 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 想要提升游戏画质和性能&#xff1f;DLSS Swapper是你必备的终极工具&#xff01;这款免费软件专门为游戏玩家设…

作者头像 李华
网站建设 2026/2/11 20:19:02

微信双设备登录终极指南:突破限制实现手机平板同时在线

微信双设备登录终极指南&#xff1a;突破限制实现手机平板同时在线 【免费下载链接】WeChatPad 强制使用微信平板模式 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPad 还在为无法同时在手机和平板上使用微信而烦恼吗&#xff1f;微信官方限制只能在一个移动设备…

作者头像 李华
网站建设 2026/2/11 10:50:16

3步极速配置JDspyder:新手也能轻松掌握的抢购自动化方案

3步极速配置JDspyder&#xff1a;新手也能轻松掌握的抢购自动化方案 【免费下载链接】JDspyder 京东预约&抢购脚本&#xff0c;可以自定义商品链接 项目地址: https://gitcode.com/gh_mirrors/jd/JDspyder "每次抢购都手慢无&#xff1f;看着心仪的商品瞬间售罄…

作者头像 李华
网站建设 2026/2/5 10:32:53

解锁星露谷物语模组制作:XNB文件处理工具实战指南

解锁星露谷物语模组制作&#xff1a;XNB文件处理工具实战指南 【免费下载链接】xnbcli A CLI tool for XNB packing/unpacking purpose built for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/xn/xnbcli 你是否曾经想要修改《星露谷物语》中的游戏资源&a…

作者头像 李华
网站建设 2026/2/6 1:09:40

LAV Filters 终极指南:解锁专业级多媒体播放体验

LAV Filters 终极指南&#xff1a;解锁专业级多媒体播放体验 【免费下载链接】LAVFilters LAV Filters - Open-Source DirectShow Media Splitter and Decoders 项目地址: https://gitcode.com/gh_mirrors/la/LAVFilters LAV Filters 是一款基于 FFmpeg 的强大 DirectSh…

作者头像 李华