首页 / 资讯中心 / 文章详情

C#与HALCON实现亚像素级工业视觉测量技术

C#与HALCON实现亚像素级工业视觉测量技术 ★ FEATURED ARTICLE
1. 工业视觉测量中的亚像素精度革命在精密制造领域0.1毫米的误差可能意味着整个批次的报废。传统像素级测量就像用格子纸测量曲线——每个数据点都被限制在整数像素坐标上。而亚像素技术则相当于在格子纸上叠加了游标卡尺通过数学方法将定位精度提升到像素的1/10甚至1/100。我最近用C#HALCON完成的PCB板孔径测量项目将重复测量精度稳定控制在±0.3μm。这得益于三个关键技术突破基于灰度梯度的边缘亚像素定位算法HALCON的亚像素边缘提取算子edges_sub_pixC#多线程采集与HALCON并行计算的架构设计2. 开发环境搭建与核心工具链2.1 HALCON配置要点最新HALCON 21.05版本对.NET 6的支持更完善但实际开发中我推荐以下组合PackageReference IncludeHalconDotNet Version20.11.0 / TargetFrameworknet48/TargetFramework注意HALCON 21.xx的Runtime需要单独安装直接NuGet包会缺失halcon.dll2.2 C#交互层设计封装HDevEngine比直接调用更稳定public class HalconEngineWrapper : IDisposable { private HDevEngine _engine; private HDevProcedure _procMeasureCircle; public void Init(string hdevPath) { _engine new HDevEngine(); _engine.SetProcedurePath(Path.GetDirectoryName(hdevPath)); _procMeasureCircle new HDevProcedure(measure_circle); } public CircleResult MeasureCircle(HImage image) { using (HDevProcedureCall call _procMeasureCircle.CreateCall()) { call.SetInputIconicParamObject(Image, image); call.Execute(); return new CircleResult( call.GetOutputCtrlParamTuple(Row), call.GetOutputCtrlParamTuple(Column), call.GetOutputCtrlParamTuple(Radius)); } } }3. 亚像素测量算法深度解析3.1 边缘检测的数学本质HALCON的edges_sub_pix算子实际是求解图像梯度场的极值点G(x,y) √(I_x² I_y²) θ(x,y) arctan(I_y/I_x)其中I_x和I_y是通过Sobel算子计算的水平和垂直梯度。3.2 测量流程优化典型圆测量代码的隐藏陷阱* 错误示例直接使用边缘点拟合圆 edges_sub_pix(Image, Edges, canny, 1.5, 20, 40) fit_circle_contour_xld(Edges, algebraic, -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder) * 正确做法边缘筛选加权拟合 select_contours_xld(Edges, SelectedContours, contour_length, 10, 1000, -0.5, 0.5) create_circle_measure(Image, Row, Column, Radius*0.9, Radius*1.1, 5, 1, nearest_neighbor) measure_pos(Image, MeasureHandle, 1, 30, all, all, RowEdge, ColumnEdge, Amplitude, Distance) fit_circle_contour_xld(gen_circle_contour_xld(RowEdge, ColumnEdge), geotukey, 3, 0, 0, 3, 2, FinalRow, FinalCol, FinalRadius)4. 工业级测量系统架构设计4.1 多相机同步方案graph TD A[触发信号] -- B(Camera1) A -- C(Camera2) B -- D[图像缓存队列] C -- D D -- E{测量线程池} E -- F[HALCON引擎] F -- G[结果数据库]4.2 测量数据建模public class MeasurementResult { public DateTime Timestamp { get; } public double NominalValue { get; set; } public double ActualValue { get; } public double Deviation ActualValue - NominalValue; public MeasurementStatus Status Math.Abs(Deviation) Tolerance ? MeasurementStatus.NG : MeasurementStatus.OK; public void SaveToDatabase(DbContext db) { db.Measurements.Add(new DbMeasurement { Time Timestamp, Value ActualValue, IsQualified Status MeasurementStatus.OK }); } }5. 实战问题排查手册5.1 典型错误代码对照表现象错误原因解决方案边缘断裂高斯滤波sigma值过大调整edges_sub_pix的sigma从1.0开始圆拟合发散初始ROI包含多个边缘使用create_circle_measure限定搜索范围测量波动大环境振动影响增加measure_pos的采样点数到505.2 精度验证方法使用NIST标准校准板验证时拍摄10次同一位置图像计算标准差σ重复性误差 3σ系统误差 |测量均值 - 标称值|经验值工业级应用要求重复性误差1/3公差带6. 性能优化技巧6.1 计算加速方案* 启用HALCON并行计算 set_system(parallelize_operators, true) set_system(tspawn_num_threads, 8) * 针对GPU优化 query_available_compute_devices(Devices) set_compute_device(Devices[0])6.2 C#内存管理// 必须显式释放HALCON对象 using (HImage img new HImage(file.hobj)) using (HRegion region img.Threshold(128, 255)) { double area region.Area; } // 自动调用Dispose() // 错误示例未释放导致内存泄漏 var contours image.EdgesSubPix(canny, 1.0, 20, 40); // 正确做法 using (var contours image.EdgesSubPix(canny, 1.0, 20, 40)) {...}7. 完整项目源码解析7.1 圆测量核心类public class CircleMeasurer { private readonly HDevProcedure _proc; private HTuple _lastResult; public CircleMeasurer() { _proc new HDevProcedure(measure_circle); } public CircleMeasureResult Run(HImage image, CircleROI roi) { using (var call _proc.CreateCall()) { call.SetInputIconicParamObject(image, image); call.SetInputCtrlParamTuple(expected_radius, roi.ExpectedRadius); call.SetInputCtrlParamTuple(tolerance, roi.Tolerance); call.Execute(); return new CircleMeasureResult( call.GetOutputCtrlParamTuple(row), call.GetOutputCtrlParamTuple(column), call.GetOutputCtrlParamTuple(radius), call.GetOutputCtrlParamTuple(confidence)); } } }7.2 HALCON测量脚本* measure_circle.hdev procedure measure_circle(image: object, expected_radius: real, tolerance: real, row: real, column: real, radius: real, confidence: real) * 创建测量对象 create_measure_circle( row, column, expected_radius * 0.8, expected_radius * 1.2, 5, 1.0, nearest_neighbor, MeasureHandle) * 执行亚像素测量 measure_pos( image, MeasureHandle, 1, tolerance * 2, all, all, EdgeRow, EdgeCol, Amplitude, Distance) * 拟合圆并计算置信度 fit_circle_contour_xld( gen_circle_contour_xld(EdgeRow, EdgeCol), geotukey, -1, 0, 0, 3, 2, row, column, radius, startPhi, endPhi, pointOrder) * 置信度计算有效边缘点占比 count_obj(EdgeRow, validPoints) confidence : validPoints / 36.0 * 清理资源 close_measure(MeasureHandle) endprocedure8. 行业应用案例8.1 PCB板检测参数[MeasurementParams] MinHoleDiameter 0.5mm MaxHoleDiameter 6.0mm PositionTolerance ±0.05mm Repeatability 0.001mm LightingType coaxial ExposureTime 500μs8.2 汽车零部件检测针对齿轮齿距测量使用polar_trans_image_ext将齿轮展开为矩形图像在展开图像上测量齿距关键算子polar_trans_image_ext(Image, PolarImage, CenterRow, CenterCol, 0, 6.28319, InnerR, OuterR, Width, Height, bilinear) edges_sub_pix(PolarImage, Edges, canny, 1.0, 20, 40) measure_pairs(Edges, 10, 90, 30, all, RowEdgeFirst, ColEdgeFirst, RowEdgeSecond, ColEdgeSecond, Width, Distance)9. 测量系统验证方法论9.1 GRR分析步骤选择10个样本件由3个操作者各测量3次计算EV设备变异 5.15σ_repeatabilityAV人员变异 √(5.15σ_reproducibility² - EV²/nr)GRR √(EV² AV²)%GRR GRR / (USL-LSL) × 100%9.2 验收标准等级%GRR判定A级≤10%优秀B级10-30%可接受C级30%需改进10. 前沿技术拓展10.1 深度学习融合方案* 传统深度学习混合测量 read_dl_model(circle_detector.hdl, DLModel) apply_dl_model(Image, DLModel, circle, DLResult) get_dict_tuple(DLResult, circle_region, CircleRegion) create_metrology_model(MetrologyHandle) add_metrology_object_circle_measure(MetrologyHandle, CircleRegion.Row, CircleRegion.Column, CircleRegion.Radius*0.9, 20) apply_metrology_model(Image, MetrologyHandle) get_metrology_object_result(MetrologyHandle, all, all, result_type, all_param, Result)10.2 3D点云测量* 结构光三维测量 read_object_model_3d(part.ply, 1, 1, 1, mm, ObjectModel3D, Status) fit_primitives_object_model_3d(ObjectModel3D, cylinder, ParamNames, ParamValues) get_object_model_3d_params(ObjectModel3D, diameter, Diameter)
阅读完成 · 觉得有帮助?
咨询建站