news 2026/6/2 11:15:20

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
图像测量技术详解(含 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 提供了从边缘提取到参数计算的完整算子链,结合亚像素技术和抗干扰拟合算法,可实现微米级测量精度。实际应用中需重点关注光照、校准和边缘质量,以确保测量结果的可靠性。

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

Unitree GO2 ROS2 SDK终极指南:从零开始构建智能机器人系统

Unitree GO2 ROS2 SDK终极指南:从零开始构建智能机器人系统 【免费下载链接】go2_ros2_sdk Unofficial ROS2 SDK support for Unitree GO2 AIR/PRO/EDU 项目地址: https://gitcode.com/gh_mirrors/go/go2_ros2_sdk 🎯 开篇思考:你的机…

作者头像 李华
网站建设 2026/6/2 13:21:29

学习笔记——线程

线程学习笔记整理一、线程概论基本概念Linux中线程是轻量级的进程,线程属于某个进程作用:实现并发,处理相对耗时任务线程特征进程是系统中最小的资源分配单位线程是系统中最小的执行单位线程关系:进程中,线程与线程是平…

作者头像 李华
网站建设 2026/6/2 5:02:21

PPT AI生成工具真实体验后,结论和想象完全不同

告别办公低效!轻竹办公让你的报告高效出彩 每到年终总结的时候,职场人就开始发愁。熬夜改报告成了常态,好不容易搭建好的框架,内容却混乱不堪,设计上更是毫无灵感,做出来的报告美观度严重不足。而且&#…

作者头像 李华
网站建设 2026/6/2 13:48:24

HS2-HF_Patch终极指南:如何快速解锁HoneySelect2完整游戏体验

HS2-HF_Patch终极指南:如何快速解锁HoneySelect2完整游戏体验 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为HoneySelect2的日文界面而烦恼&…

作者头像 李华
网站建设 2026/6/1 19:08:34

WebPlotDigitizer:5分钟搞定图表数据提取的实用技巧

还在为论文图表中的数据点手动描点而头疼?面对PDF中的精美图表却无法获取原始数值?科研数据恢复时因缺失关键数据而焦虑?今天我要向你推荐一款改变游戏规则的开源神器——WebPlotDigitizer,它能让图表数据提取变得像喝咖啡一样简单…

作者头像 李华