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

图像测量技术详解(含 Halcon 示例)

一、图像测量概述

图像测量是通过机器视觉技术对图像中的目标尺寸(长度、角度、面积、距离等)进行非接触式量化分析的技术,广泛应用于工业检测(零件尺寸公差、装配间隙)、医疗影像(器官大小)、精密制造等领域。其核心优势是:高精度、非接触、高效率,可替代传统卡尺、千分尺等接触式测量工具,适应自动化生产线需求。

图像测量的一般流程:

  1. 图像采集(工业相机 + 镜头,需校准消除畸变);

  2. 预处理(去噪、增强、边缘提取);

  3. 特征提取(目标边缘、轮廓、关键点);

  4. 几何参数计算(长度、角度、面积等);

  5. 结果输出与分析(与标准值对比,判断合格性)。

二、图像测量的关键参数与方法

1. 长度测量

  • 直线长度:两点间距离(如零件边缘的直线段长度)。

  • 曲线长度:轮廓线的总长度(如管道的弯曲部分)。

2. 角度测量

  • 两直线(或边缘)的夹角(如零件的倒角角度、多边形内角)。

3. 面积测量

  • 区域的像素数量(转换为实际面积,如薄膜的孔洞面积)。

4. 距离测量

  • 两平行直线的间距(如板材厚度、两平行线间隙)。

  • 点到直线的距离(如圆心到边缘的距离)。

5. 圆 / 椭圆参数测量

  • 直径、半径、圆心坐标(如轴承内圈直径)。

三、Halcon 测量核心算子

测量类型关键算子功能描述
边缘提取edges_sub_pix提取亚像素级边缘(高精度测量基础)
直线拟合fit_line_contour_xld从边缘轮廓拟合直线(获取直线参数)
圆 / 椭圆拟合fit_circle_contour_xldfit_ellipse_contour_xld从轮廓拟合圆 / 椭圆(获取直径、圆心等)
距离计算distance_ppdistance_pl两点距离、点到直线距离
角度计算angle_ll两直线夹角
长度计算length_xld轮廓线长度
面积计算area_center区域面积与中心坐标
相机校准calibrate_cameras消除镜头畸变,建立像素与实际尺寸的映射

四、Halcon 测量实例

实例 1:零件直线边缘长度测量(亚像素级)

场景:测量金属零件某条直线边缘的实际长度(需先完成相机校准,获取像素 - 毫米转换系数)。

dev_update_off () * 1. 读取图像并预处理 read_image (PartImage, 'metal_part.png') dev_close_window () get_image_size (PartImage, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowHandle) dev_display (PartImage) disp_continue_message (WindowHandle, 'black', 'true') stop () ​ * 2. 提取亚像素边缘(高精度测量核心) edges_sub_pix (PartImage, Edges, 'canny', 1, 20, 40) // Canny算法提取边缘 ​ * 3. 筛选目标边缘(假设为水平边缘,通过方向筛选) select_contours_xld (Edges, SelectedEdges, 'direction', -0.1, 0.1, 0, 0) // 保留接近水平的边缘 ​ * 4. 拟合直线(获取直线端点) fit_line_contour_xld (SelectedEdges, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist) ​ * 5. 计算长度(像素单位) distance_pp (RowBegin, ColBegin, RowEnd, ColEnd, LengthPix) // 两点距离(像素) ​ * 6. 转换为实际长度(假设校准后1像素=0.01毫米) PixelToMM := 0.01 LengthMM := LengthPix * PixelToMM ​ * 7. 显示结果 dev_display (PartImage) dev_set_color ('red') gen_contour_polygon_xld (Contour, [RowBegin, RowEnd], [ColBegin, ColEnd]) dev_display (Contour) disp_message (WindowHandle, '长度: ' + LengthMM$'6.3f' + ' mm', 'window', 10, 10, 'red', 'true') ​ stop ()

实例 2:圆孔直径测量(圆拟合)

场景:测量机械零件上圆孔的直径,通过拟合圆轮廓计算直径。

dev_update_off () * 1. 读取图像并提取圆孔区域 read_image (HoleImage, 'part_with_hole.png') dev_close_window () get_image_size (HoleImage, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowHandle) ​ * 2. 预处理:二值化+形态学去噪 threshold (HoleImage, Region, 50, 200) // 分割圆孔区域(假设孔为暗区域) opening_circle (Region, HoleRegion, 5) // 去除噪声 connection (HoleRegion, SingleHole) // 提取单个圆孔 ​ * 3. 提取圆孔边缘(亚像素级) gen_contour_region_xld (SingleHole, HoleContour, 'border') // 生成区域轮廓 edges_sub_pix (HoleImage, EdgeContour, 'canny', 1, 30, 60) // 提取边缘 reduce_domain (EdgeContour, SingleHole, HoleEdge) // 筛选圆孔内的边缘 ​ * 4. 拟合圆(获取圆心和半径) fit_circle_contour_xld (HoleEdge, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder) ​ * 5. 计算直径(转换为实际单位) PixelToMM := 0.02 // 校准后1像素=0.02毫米 DiameterMM := 2 * Radius * PixelToMM ​ * 6. 显示结果 dev_display (HoleImage) dev_set_color ('green') dev_display (HoleContour) gen_circle_contour_xld (CircleContour, Row, Column, Radius, 0, 6.28318, 'positive', 1) dev_set_color ('red') dev_display (CircleContour) disp_message (WindowHandle, '直径: ' + DiameterMM$'6.3f' + ' mm', 'window', 10, 10, 'red', 'true') ​ stop ()

实例 3:两平行线间距测量(厚度测量)

场景:测量薄片材料的厚度(两平行边缘的距离)。

dev_update_off () * 1. 读取图像并提取上下边缘 read_image (SheetImage, 'thin_sheet.png') dev_close_window () get_image_size (SheetImage, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowHandle) ​ * 2. 提取亚像素边缘 edges_sub_pix (SheetImage, Edges, 'sobel', 'vertical', 3, 20, 40) // 提取垂直边缘(薄片边缘为垂直方向) ​ * 3. 分割上下两条边缘 split_contours_xld (Edges, SplitEdges, 10, 1) // 分割长轮廓为短段 select_contours_xld (SplitEdges, TopEdge, 'position', 'row', 0, Height/2, 0, 0) // 上边缘(行坐标较小) select_contours_xld (SplitEdges, BottomEdge, 'position', 'row', Height/2, Height, 0, 0) // 下边缘(行坐标较大) ​ * 4. 拟合两条平行线 fit_line_contour_xld (TopEdge, 'orthogonal', -1, 0, 5, 2, RowT1, ColT1, RowT2, ColT2, NrT, NcT, DistT) fit_line_contour_xld (BottomEdge, 'orthogonal', -1, 0, 5, 2, RowB1, ColB1, RowB2, ColB2, NrB, NcB, DistB) ​ * 5. 计算两平行线间距(厚度) distance_lr (RowT1, ColT1, RowT2, ColT2, RowB1, ColB1, RowB2, ColB2, DistancePix) // 线到线距离(像素) PixelToMM := 0.015 ThicknessMM := DistancePix * PixelToMM ​ * 6. 显示结果 dev_display (SheetImage) dev_set_color ('blue') gen_contour_polygon_xld (TopLine, [RowT1, RowT2], [ColT1, ColT2]) gen_contour_polygon_xld (BottomLine, [RowB1, RowB2], [ColB1, ColB2]) dev_display (TopLine) dev_display (BottomLine) disp_message (WindowHandle, '厚度: ' + ThicknessMM$'6.3f' + ' mm', 'window', 10, 10, 'blue', 'true') ​ stop ()

实例 4:角度测量(两直线夹角)

场景:测量机械零件倒角的角度。

dev_update_off () * 1. 读取图像并提取倒角边缘 read_image (ChamferImage, 'part_chamfer.png') dev_close_window () get_image_size (ChamferImage, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowHandle) ​ * 2. 提取亚像素边缘 edges_sub_pix (ChamferImage, Edges, 'canny', 1, 20, 50) ​ * 3. 筛选倒角的两条边缘 select_contours_xld (Edges, ChamferEdges, 'length', 50, 1000, 0, 0) // 筛选长边缘 split_contours_xld (ChamferEdges, TwoEdges, 1, 1) // 分割为两条边缘 ​ * 4. 拟合两条直线 fit_line_contour_xld (TwoEdges[0], 'tukey', -1, 0, 5, 2, Row1_1, Col1_1, Row1_2, Col1_2, Nr1, Nc1, Dist1) fit_line_contour_xld (TwoEdges[1], 'tukey', -1, 0, 5, 2, Row2_1, Col2_1, Row2_2, Col2_2, Nr2, Nc2, Dist2) ​ * 5. 计算夹角(弧度转角度) angle_ll (Row1_1, Col1_1, Row1_2, Col1_2, Row2_1, Col2_1, Row2_2, Col2_2, AngleRad) AngleDeg := rad(AngleRad) // 转换为角度 ​ * 6. 显示结果 dev_display (ChamferImage) dev_set_color ('red') gen_contour_polygon_xld (Line1, [Row1_1, Row1_2], [Col1_1, Col1_2]) gen_contour_polygon_xld (Line2, [Row2_1, Row2_2], [Col2_1, Col2_2]) dev_display (Line1) dev_display (Line2) disp_message (WindowHandle, '夹角: ' + AngleDeg$'6.1f' + ' °', 'window', 10, 10, 'red', 'true') ​ stop ()

五、图像测量的精度优化技巧

  1. 相机校准:必须进行相机内参校准calibrate_cameras)和畸变矫正gen_image_map+map_image),消除镜头畸变对测量的影响;

  2. 亚像素边缘提取:使用edges_sub_pix替代像素级边缘,将测量精度提升至 0.1 像素级别;

  3. 光照控制:确保光照均匀,避免反光或阴影导致边缘模糊(可使用同轴光源、环形光源);

  4. 拟合算法选择:

    • 直线拟合优先用'tukey'(抗离群点);

    • 圆拟合优先用'geometric'(几何误差最小);

  5. 多次测量取平均:对同一目标进行多次测量(不同位置或角度),减少随机误差;

  6. ROI 限制:通过reduce_domain限制测量区域,排除无关背景干扰。

六、总结

图像测量的核心是从图像中提取高精度几何特征,并通过相机校准将像素单位转换为实际物理单位。Halcon 提供了从边缘提取到参数计算的完整算子链,结合亚像素技术和抗干扰拟合算法,可实现微米级测量精度。实际应用中需重点关注光照、校准和边缘质量,以确保测量结果的可靠性。

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

相关文章:

  • LobeChat用量统计面板:跟踪Token消耗与GPU使用率
  • Vosk Android语音识别:5个常见模型部署问题及解决方案
  • EmotiVoice语音合成在心理咨询机器人中的应用潜力
  • EmotiVoice语音合成在电子宠物产品中的情感互动设计
  • Vosk Android中文语音识别终极部署指南:5个关键避坑点深度解析
  • [鸿蒙2025领航者闯关]人情往来应用开源项目实战
  • 5个关键步骤快速掌握Unitree GO2 ROS2 SDK:从环境搭建到实战应用
  • CSS 伪类 after 清除浮动:前端老手都在用的布局妙招
  • 矢量计算的交响乐:Ascend C向量编程范式与指令级并行优化
  • 基于VUE的企业员工管理系统 [VUE]-计算机毕业设计源码+LW文档
  • 基于VUE的MBTI人格测试系统 [VUE]-计算机毕业设计源码+LW文档
  • 基于VUE的汽车维修保养智能预约系统 [VUE]-计算机毕业设计源码+LW文档
  • 基于VUE的汽车出租管理系统 [VUE]-计算机毕业设计源码+LW文档
  • 基于VUE的企业咨询管理系统 [VUE]-计算机毕业设计源码+LW文档
  • 图像处理函数与形态学操作笔记(含 Halcon 示例)
  • Archipack建筑建模插件新手入门指南:从问题解决到实战应用
  • Koodo Reader如何实现智能封面管理?电子书封面优化全攻略
  • 在Docker环境中安装RabbitMQ延迟消息插件实战记录
  • 具身智能:零基础入门睿尔曼机械臂(五)—— 手眼标定核心原理与数学求解
  • d2s-editor:暗黑破坏神2存档编辑的终极解决方案
  • 光储充一体化方案如何进行精准设计
  • 如何快速实现大屏自适应:前端开发的终极解决方案
  • LSM 原理、实现及与 B+ 树的核心区别
  • 神经网络(1)基本原理 正向传播反向传播 - MKT
  • sherpa-onnx终极指南:嵌入式语音识别快速部署教程
  • Unitree GO2 ROS2 SDK终极指南:从零开始构建智能机器人系统
  • 5大核心技术突破:OpenIM Server如何重构元宇宙社交通信体验
  • C++元编程完全指南
  • 3分钟搞定Windows Syslog服务器:从零搭建日志监控系统
  • CAN协议完全指南