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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张謹礧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值