news 2026/6/10 18:46:08

图像测量技术详解(含 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/6/10 17:17:30

图像处理函数与形态学操作笔记(含 Halcon 示例)

一、区域筛选与特征提取函数1. 区域筛选函数select_shape()功能:根据区域的形状特征(如面积、圆形度、凸度、长宽比等)筛选符合条件的区域。Halcon 示例:read_image (Image, pcb.jpg) // 读取电路板图像 threshold (Image, Regio…

作者头像 李华
网站建设 2026/6/10 9:26:13

Compressor.js革命性图像压缩:让你的Web应用飞起来

Compressor.js革命性图像压缩:让你的Web应用飞起来 【免费下载链接】compressorjs compressorjs: 是一个JavaScript图像压缩库,使用浏览器原生的canvas.toBlob API进行图像压缩。 项目地址: https://gitcode.com/gh_mirrors/co/compressorjs 还在…

作者头像 李华
网站建设 2026/6/10 9:26:45

5大核心技术突破:OpenIM Server如何重构元宇宙社交通信体验

你是否经历过虚拟演唱会中语音卡顿、消息延迟的尴尬场景?作为元宇宙平台的技术负责人,是否因用户投诉"虚拟互动像隔空喊话"而倍感压力?本文将深度解析OpenIM Server如何通过架构革新,将元宇宙通信延迟降至毫秒级&#x…

作者头像 李华
网站建设 2026/6/10 9:28:41

15分钟精通!Keep构建智能监控告警自动化平台

15分钟精通!Keep构建智能监控告警自动化平台 【免费下载链接】keep The open-source alerts management and automation platform 项目地址: https://gitcode.com/GitHub_Trending/kee/keep 还在为海量监控告警疲于奔命?本文将带你快速搭建基于Ke…

作者头像 李华
网站建设 2026/6/10 9:26:44

LobeChat ABAC属性访问控制

LobeChat ABAC属性访问控制 在企业级AI应用日益普及的今天,一个看似简单的“查看聊天记录”操作背后,可能隐藏着复杂的权限逻辑:谁可以看?在什么时间?基于什么身份?是否涉及敏感信息?这些问题在…

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

Day 41 卷积神经网络(CNN)基础与实战

在上一节中,我们尝试使用全连接网络(MLP)处理 CIFAR-10 图像分类任务,但发现准确率难以突破瓶颈。这是因为 MLP 将图像的所有像素展平为一维向量,破坏了图像原本的空间结构信息(如局部纹理、形状边缘等&…

作者头像 李华