- 博客(23)
- 收藏
- 关注
原创 2D标定没那么神秘:仿射变换帮你搭建像素↔毫米的桥梁
本文介绍了如何利用仿射变换实现2D平面标定,将图像像素坐标转换为实际物理尺寸。文章首先解释了仿射变换适用于相机光轴垂直且无畸变的理想情况,指出其在视场不大、精度要求不高的场景中的实用性。随后列举了像素当量标定、机器人手眼标定和多相机拼接三个典型应用场景,并提供了Halcon软件中实现仿射变换标定的四个步骤。文章还指出了使用中的常见问题和适用场景判断标准,强调仿射变换是连接像素与物理坐标的最简单桥梁,特别适合快速现场标定和精度要求不高的测量任务。
2026-06-13 10:53:22
471
原创 玩转Halcon中的2D仿射变换:从原理到实战
本文介绍了Halcon中2D仿射变换的原理与应用。仿射变换是二维平面中的一种线性变换,保持直线和平行性,包含平移、旋转、缩放和剪切四种基本操作。文章详细讲解了仿射变换的数学表示(2×3矩阵)和Halcon中的核心工作流:生成变换矩阵、应用变换矩阵和分解矩阵参数。重点介绍了通过点对计算变换矩阵的vector_to_hom_mat2d算子和应用变换的常用算子。文章还分享了2D标定的实际案例和五点关键注意事项,包括点对顺序、数量要求、分布范围、参数检查以及畸变校正与仿射变换的顺序问题。最后总结了不同场景下的推荐方
2026-06-13 10:46:16
436
原创 单元测试入门:xUnit + Moq,让代码稳得像积木
本文介绍了xUnit和Moq这对.NET单元测试黄金组合的使用方法。文章用组装电脑的比喻说明单元测试的核心思想:隔离测试每个组件而非整个系统。xUnit作为测试框架提供考题定义([Fact])和结果断言(Assert)功能,Moq则用于模拟依赖项(如数据库、API服务)的行为。通过真实代码示例展示了如何用Moq创建假服务注入被测对象,并验证逻辑正确性、方法调用次数和属性变更通知。这种组合能实现毫秒级运行的稳定测试,避免外部依赖影响。建议对纯逻辑代码使用xUnit,对有外部依赖的组件结合Moq,但第三方SDK
2026-06-12 17:54:52
366
原创 Halcon字符分割失败?用find_text一键搞定
本文记录了一个字符分割问题的解决过程。原Halcon脚本的分割功能在移植到.NET后失效,筛选后区域数量为0。通过逐层排查发现二值化和形态学处理生成了横向噪声而非有效字符区域。对比Halcon脚本后,改用find_text算子重构分割流程:创建文本模型并设置字符参数,简化预处理步骤,直接定位字符区域。最终C#实现通过初始化文本模型并调整识别参数,解决了分割失败问题。这种方法比手动分割更稳健,减少了对特定参数的依赖,提高了OCR系统的适应性。
2026-06-11 15:40:12
286
原创 .NET 8 项目输出路径优化技巧
本文介绍了在.NET 8 Windows桌面应用开发中优化输出路径的两个实用技巧:通过<OutputPath>指定自定义输出目录,并配合<AppendTargetFrameworkToOutputPath>false去除默认的目标框架子文件夹(如net8.0-windows)。这种配置能让编译输出直接进入指定目录(如../Build),使项目结构更简洁。文中还提供了项目文件配置示例,并提示了多框架项目、CI/CD脚本适配等注意事项,特别适合需要简化部署路径的WinForms/WPF项目开发者。
2026-06-08 10:17:31
356
原创 C# 封装工业相机SDK:海康Halcon无缝对接
本文介绍了为Halcon测量软件开发的一套通用工业相机SDK库CameraLib的设计思路,该库旨在解决多品牌相机接口差异、图像格式转换和触发模式管理等痛点。文章详细阐述了采用接口+抽象基类+具体实现的三层架构:通过ICamera定义统一接口,BaseCamera封装通用逻辑,HiKCamera实现海康相机对接。重点展示了同步取图、软触发和双格式输出(Bitmap/HObject)等核心功能的设计实现。该架构具有良好的扩展性,未来可支持Basler、大恒等其他品牌相机,使上层业务代码与底层SDK解耦,提升开
2026-06-06 18:40:18
439
原创 WinForm HSmartWindowControl滚轮缩放失效?一招解决
摘要 在WinForm中使用Halcon的HSmartWindowControl控件时,常遇到滚轮缩放失效问题。这是由于控件默认未接管鼠标滚轮事件,需要手动绑定事件:通过将控件的MouseWheel事件关联到其内置的HSmartWindowControl_MouseWheel方法即可解决。若控件嵌套复杂,建议处理窗体级MouseWheel事件并转换坐标。该方案简单有效,可恢复控件的原生缩放功能。
2026-06-05 11:12:58
274
原创 Prism 事件订阅回调不执行?小心 Lambda 表达式和弱引用的陷阱
摘要 本文记录了在 WPF 项目中使用 Prism 事件聚合器时遇到的订阅回调未执行问题。问题表现为事件发布后订阅者回调未被触发,排查发现是 Prism 默认使用弱引用保存 Lambda 表达式委托,导致 GC 提前回收。通过三种解决方案对比分析,推荐最佳实践是:1) 使用 keepSubscriberReferenceAlive: true 参数强制强引用;2) 将委托存储在字段中防止回收;3) 使用实例方法替代 Lambda。文章强调在 ViewModel 中应显式管理订阅生命周期,避免依赖弱引用机制,
2026-06-03 10:49:35
328
原创 管道模式:像搭积木一样构建你的视觉处理流水线
本文介绍了管道模式(Pipeline Pattern)在视觉处理任务中的应用。通过将复杂流程拆解为独立处理步骤,每个步骤专注于单一功能,使代码更清晰、灵活、可复用。文章对比了管道模式与装饰器模式的区别,指出管道模式更适用于数据流动的场景,并通过C#代码示例展示了如何构建视觉处理管道。此外,还探讨了如何通过条件跳步和计时插桩增强管道的灵活性。最终总结管道模式能有效组织复杂处理流程,建议在数据处理类任务中优先考虑使用。
2026-06-02 13:18:01
230
原创 打造现代化 WPF 应用:Prism + Material Design 实战(ColorZone、Drawer、Snackbar)
本文将介绍如何利用Material Design In XAML(MDIX)工具包和Prism框架,快速为WPF应用构建现代化的Material风格界面和模块化架构。文章重点讲解了三个核心MDIX控件:自动配色的ColorZone容器、侧边导航菜单Drawer,以及轻量提示Snackbar的集成方法。通过一个完整Demo演示了如何结合Prism实现导航式应用,包括主题配置、服务注册、区域导航等关键步骤。读者将掌握利用MDIX快速美化WPF界面,并通过Prism实现松耦合架构的开发技巧,显著提升应用的用户体验
2026-06-01 11:34:25
276
原创 上下对位相机视觉引导贴合算法:从原理到实践(完整教学版)
摘要:本文详细介绍了基于双相机视觉引导的精密对位算法,适用于摄像头组装、FPC贴合等场景。算法核心包括:1)通过九点标定建立上下相机像素坐标与机械手坐标的映射关系;2)三点定圆法标定机械手旋转中心;3)建立基准模板定义完美贴合状态;4)计算上下相机视野中心的固定偏移;5)在线贴合时综合产品与物料的坐标和角度偏差,结合旋转中心补偿生成机械手运动指令。该方案可实现±0.02mm/±0.1°的高精度对位,文中提供了完整的数学推导和工程实现细节。(149字)
2026-05-31 16:06:19
1850
原创 机器视觉标定指南:九点标定与3D手眼标定深度解析
本文对比了机器视觉中两种核心标定技术:九点标定适用于2D平面场景(如传送带分拣),通过9-12个采样点快速建立坐标映射;3D手眼标定则解决空间6自由度定位问题(如无序抓取),需配合多姿态运动完成标定。关键差异在于:九点标定仅需平面移动,不依赖内参,速度快;而3D标定必须预先内参标定,要求丰富的空间姿态变化。选择依据是应用维度——平面作业用九点,空间定位选3D手眼标定。正确选择标定方法能显著提升系统精度和稳定性。
2026-05-29 09:35:07
487
原创 在Prism中使用DialogHost,使用接口扩展方法优雅的实现
本文介绍了如何在.NET Core中实现Prism与MaterialDesignThemes的DialogHost集成。通过自定义MaterialDialogService服务,替代Prism默认的对话框服务,实现在WPF应用中调用Material Design风格的对话框。文章详细说明了项目结构、NuGet包引用、App.xaml配置、对话框视图模型定义以及核心服务实现步骤。关键点包括注册自定义对话框服务、实现ShowDialogHost方法,以及处理对话框打开/关闭事件。最终解决方案支持在.NET 8.
2026-05-26 17:52:10
619
原创 C#中的扩展方法
C#中可通过扩展方法为接口新增功能而无需修改接口本身。扩展方法本质是静态类的静态方法,使用this关键字指定目标类型。例如为ILogger添加LogError方法:定义静态类LoggerExtensions,创建带this ILogger参数的静态方法,即可通过myLogger.LogError()调用。编译器会将其转换为LoggerExtensions.LogError(myLogger)。这种方式保持了接口稳定性,同时扩展了功能。
2026-05-26 15:05:32
35
原创 C#实现串口通讯+Modbus协议进行OMRON E5CC温控器数据读写
这篇文章介绍了Modbus RTU通信协议的实现细节,主要包括: 通信协议定义部分展示了UI设计界面和E5CC通讯手册中的地址定义、状态字定义等关键信息。 核心代码实现了一个Modbus RTU通信客户端(ModbusClient.cs),提供了: 串口连接管理(打开/关闭) 读取输出寄存器功能(功能码03) 写入多个寄存器功能(功能码10) 请求帧构建和CRC校验计算 代码实现了完整的Modbus RTU协议处理,包括帧结构构建、数据发送接收、错误处理等功能,支持工业自动化设备通信。 该实现采用C#语言,
2026-05-25 15:08:47
72
原创 串口通讯&Modbus协议
本文介绍了工业上位机通讯中串口通讯与Modbus-RTU协议的常见组合。通过5张表格对比了TTL、RS-232、RS-485三种串口通讯方式的电平标准、传输特性和应用场景;详细说明了Modbus协议中线圈、离散输入、保持寄存器和输入寄存器四类数据对象的访问属性和地址范围;列举了读取和写入操作对应的功能码及其作用;最后展示了Modbus-RTU协议的帧结构格式。这些内容为理解工业通讯中的串口传输层和Modbus应用层协议提供了清晰的参考框架。
2026-05-25 14:48:19
264
原创 在Prism框架中使用MDIX的DialogHost
本文介绍了如何在Prism框架中集成MaterialDesign的DialogHost组件。主要内容包括:安装必要的NuGet包、配置App.xaml资源、创建对话框服务接口及实现、定义对话框感知接口,以及实现具体的对话框视图和ViewModel。通过这种方式,开发者可以利用Prism的IDialogService来管理MaterialDesign的DialogHost,实现松耦合、可测试的对话框功能。关键点在于DialogHostService的实现,它负责解析视图、处理参数传递和对话框结果返回,同时要求
2026-05-22 14:06:16
384
原创 MaterialDesign DialogHost使用
本文介绍了如何在WPF中使用MaterialDesignThemes库的DialogHost组件创建美观的弹窗对话框。主要内容包括:安装MaterialDesignThemes NuGet包(5.3.2版本),在App.xaml中配置主题资源,使用DialogHost包裹主界面,创建自定义弹窗内容控件(DialogContent.xaml),以及实现打开对话框和处理返回结果的逻辑。文章提供了完整的XAML和C#代码示例,展示了如何创建包含输入框和确定/取消按钮的对话框,并演示了如何获取用户输入结果。最终实现
2026-05-22 10:57:50
189
原创 常见的几种Ai编程工具安装
安装Node.js,下载地址:https://nodejs.org/zh-cn/download修改npm路径:安装了Node后,npm工具通常指向的是国外的下载路径,将npm路径配置为国内镜像,在命令行或者powershell执行:npm config set registry https://registry.npmmirror.com/`,参考:npm使用国内淘宝镜像的方法 - 技术栈;查看是否安装成功可以显示版本号就是安装成功了;更新:再次执行安装命令即可;ssl证书问题处理:执行。
2026-04-07 10:42:05
84
原创 C#中的异步、同步方法
C#中的异步方法通过async/await实现非阻塞操作,允许在等待耗时任务时执行其他工作。同步方法按顺序执行,而异步方法可以并行处理任务。异步状态机类似游戏存档机制,在await时保存状态并释放线程,完成后恢复执行。Task.FromResult用于避免创建不必要的异步状态机,直接返回已完成任务以提高性能。示例展示了煮豆浆和煎鸡蛋的同步与异步实现差异,以及如何利用Task.FromResult优化已有结果的场景。
2026-01-08 09:59:30
317
原创 C#中的依赖注入
摘要:C#中的依赖注入(DI)是一种解耦设计模式,通过构造函数将依赖对象注入到类中。典型实现步骤:1)定义接口抽象依赖;2)实现具体依赖类;3)在构造函数声明依赖;4)使用DI容器注册依赖关系。示例展示了如何使用.NET内置的ServiceCollection容器管理UserService对IDataBaseAccess的依赖,实现松耦合和可测试性,支持灵活切换SQL数据库和Mock测试数据的不同实现。
2026-01-07 11:00:38
266
原创 计算两组数据的斜率、截距和R^2
Console.WriteLine("截距: " + intercept);Console.WriteLine("斜率: " + slope);// 计算R-squared。
2023-03-23 14:15:18
1097
通用相机库:CameraLib
2026-06-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅