当前位置: 首页 > news >正文

C#与Halcon联合编程实现视觉几何定位与测量框架:从入门到精通,支持圆ROI拟合、标定及模板管理

C#与Halcon联合编程写的视觉几何定位与测量框架程序,内容包括几何定位方面的模板创建和查找,支持圆测量方面的圆ROI,拟合,标定和测量,还支持整个模板的保存,删除和加载,同时支持相机单帧彩图和连续彩图,这个属于Halcon在C#基础的入门课程,适合Halcon与C#联合编程的初学者

刚接触Halcon和C#联调那会儿,被那个灰底黄字的HDevelop界面整得够呛。后来发现其实用C#做视觉框架,核心就是把Halcon的算子当积木块用。今天咱们就聊聊这个能自动找零件、测圆直径还能存模板的实用框架。

先看模板匹配这档子事。在产线上,摄像头拍到的工件可能歪七扭八的,这时候得靠CreateShapeModel生成模板:

HTuple modelID = new HTuple(); HOperatorSet.CreateShapeModel( reducedImage, // 预处理后的灰度图 "auto", // 金字塔层级 new HTuple(0).TupleRad(), //起始角度 new HTuple(360).TupleRad(), //角度范围 "auto", //角度步长 "auto", //对比度 "use_polarity", out modelID);

重点是这个reducedImage得用ROI抠出特征区域,别傻乎乎把整张图扔进去。调试时可以用HWindowControl的Attach方法把图像显示控件绑定到Halcon对象,肉眼确认模板区域对不对。

找到模板后,FindShapeModel算子的AngleOut参数能返回旋转角度:

HTuple row, column, angle, score; HOperatorSet.FindShapeModel( currentImage, modelID, new HTuple(0).TupleRad(), new HTuple(360).TupleRad(), 0.7, //匹配阈值 1, //最多匹配数 0.5, //金字塔层级 "least_squares", 0, 0.9, out row, out column, out angle, out score);

这里有个坑——角度单位要用弧度,新手经常忘记TupleRad转换。匹配成功后,记得用AffineTransContourXld做仿射变换,把模板坐标系转到当前图像位置。

C#与Halcon联合编程写的视觉几何定位与测量框架程序,内容包括几何定位方面的模板创建和查找,支持圆测量方面的圆ROI,拟合,标定和测量,还支持整个模板的保存,删除和加载,同时支持相机单帧彩图和连续彩图,这个属于Halcon在C#基础的入门课程,适合Halcon与C#联合编程的初学者

测圆功能更讲究,得先标定。我们在载物台上放标准圆板,运行校准程序:

HOperatorSet.FindCircle( calibImage, out calibRow, out calibCol, out calibRadius); double pixelPerMM = calibRadius / standardRadius; //标准圆已知物理半径

实际测量时用动态ROI,根据模板位置生成环形检测区域:

HObject ringROI; HOperatorSet.GenCircle( out ringROI, centerRow, centerCol, innerRadius, outerRadius); HOperatorSet.ReduceDomain(measureImage, ringROI, out regionImage);

拟合圆边缘建议用FitCircleContourXld,比直接用边缘点拟合更抗噪。实测中发现,当工件表面有划痕时,设置EdgeSelect=positive能有效过滤干扰边缘。

框架里最实用的要数模板管理功能。保存模板时别光存shape_model,连带ROI参数一起打包:

string savePath = @"D:\Templates\" + DateTime.Now.ToString("yyyyMMdd_HHmm") + ".tmp"; HOperatorSet.WriteShapeModel(modelID, savePath); File.WriteAllText(savePath + ".cfg", $"{roiCenterX},{roiCenterY},{roiWidth},{roiHeight}");

加载时反过来操作,用ReadShapeModel读取模型,再用配置恢复ROI区域。删除模板时注意同时清理内存中的modelID,Halcon不会自动释放模型内存。

图像采集部分,连续抓图建议用异步模式:

HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb", -1, "false", "default", "[0] ", 0, -1, out hv_AcqHandle); HOperatorSet.GrabImageAsync(out currentImage, hv_AcqHandle, -1);

在C#里用Timer控件定时调用GrabImageAsync,回调函数里更新HWindowControl。遇到图像卡顿时,检查是不是没释放HObject导致内存泄漏——这个坑我踩过三次!

整套框架跑起来后,在1200mm的金属件上实测定位精度±0.05mm,测量节拍能到300ms/件。当然这得配合合适的打光和镜头,算法层面还可以加亚像素校正。下次有机会咱们再唠唠怎么用形态学处理搞定反光表面的测量难题。

http://www.jsqmd.com/news/468637/

相关文章:

  • 程序员空窗期如何解决?
  • 《C++实战项目-高并发内存池》2.ObjectPool构造
  • 【OpenGL ES】在Android上手撕一个mini版的渲染框架
  • NOR Flash和NAND flash有什么区别
  • 拆解美团UV量提高的底层逻辑:从流量获取到留存的全链路优化
  • 三年独立开发,我从中学到什么?
  • KEIL5中文件中的字都是黑色的
  • python包发布流程
  • Android系统卡顿排查实战:当system_server卡在io_schedule(二)
  • 【OpenClaw】彻底卸载教程:告别残留,3步搞定(附一键脚本+检测工具)
  • 安静不下来?如何应对课堂注意力不集中与冲动行为调整策略
  • 保安管理公司切入物业赛道的数字化路径与策略
  • 数字化运维实践:如何构建全场景、智能化的设备管理系统?
  • PyTorch 实现这个张量逐元素乘积的计算
  • 2026青岛子宫腺肌症医院 青岛新阳光妇产医院本地优选
  • 教你卸载 OpenClaw,附详细教程
  • 鸿蒙 HarmonyOS 6 | 多媒体(05)全局播控 AVSession 接入与后台控制
  • 2026年最值得学习的10个 Python AI库(程序员必备)
  • 风味优化/异味溯源 | 一站式GC-MS挥发性成分检测解决方案
  • Tiger_Rory
  • 红外测温发射率修正完全技术指南
  • 基于Simulink 2021A以上版本的混合储能系统下垂控制策略下的光储微网直流母线电压稳定性研究
  • 安全使用OpenClaw:从官方威胁模型出发,全面规避AI智能体风险
  • ADHD儿童运动疗法是什么?对注意力障碍的改善有何帮助?
  • 有没有小红书多账号管理工具?小红书私信聚合管理
  • MATLAB仿真平台实现储能参与调峰调频联合优化模型:超线性增益下的充放电策略优化与联合运行探索
  • 蓝桥杯备赛3.11
  • 通达信【超准主力专用抄底】副图与选股指标CJM99分享
  • linux学习笔记(yum命令)
  • 2026爆款外呼系统盘点|中小企业首选,高性价比闭眼入