Halcon学习教程(二) 测量量测相关(点到线距离,线到线距离,轮廓线距离,一维测量,圆形测量,矩形测量等)
原文作者:aircraft
原文地址:https://www.cnblogs.com/DOMLX/p/18740576
本篇讲一些测量用到的算子和实例,想了解更多就得去看看halcon实例里一维测量里面的众多实例程序了。
一.线宽测量相关
1.点到直线距离
随便读取个图,然后在圆边画一个点,在圆外画一条线,代码都是复制就可以用,图片复制就注意一下压缩问题。
* 初始化窗口操作 dev_clear_window() * 清除当前活动窗口的内容 dev_close_window() * 关闭所有打开的窗口(谨慎使用) dev_get_window(WindowHandle) * 获取当前窗口的句柄(关键窗口标识符) read_image(Image, '1.png') * 读取图像文件到Image变量中 * 自动适应图像大小的窗口模式 dev_open_window_fit_image(Image, 0, 0, -1, -1, WindowHandle) * 参数说明: * Image: 输入图像 * 0,0: 窗口左上角坐标(相对位置) * -1,-1: 使用图像实际尺寸填充窗口 * WindowHandle: 目标窗口句柄 dev_display(Image) * 在指定窗口显示图像 * 在窗口绘制基础元素示例 dev_set_color('red') * 设置绘图颜色为红色 draw_point(WindowHandle, Row, Column) * 在指定窗口绘制单个像素点 * 参数: * WindowHandle: 窗口句柄 * Row,Column: 像素坐标(整数) *将画的点标注显示出来 让看的更清楚一些 gen_cross_contour_xld(Cross2, Row, Column, 10, 0) * 生成十字形轮廓线段(重要算子) * 参数说明: * OutputCross2: 输出的XLD线段集合 * CenterRow,CenterCol: 十字中心坐标 * Length: 十字臂长(总长度为Length*2) * Angle: 十字倾斜角度(0度表示水平垂直,此处为0度) * 绘制线段及其显示 draw_line(WindowHandle, RowBegin, ColBegin, RowEnd, ColEnd) * 在窗口绘制线段但不显示 disp_line(WindowHandle, RowBegin, ColBegin, RowEnd, ColEnd) * 在窗口显示线段(可视化) * 计算点到直线的距离的核心算法 distance_pl(Row, Column, RowBegin, ColBegin, RowEnd, ColEnd, Distance) * 距离计算函数 * 参数说明: * Point坐标:(Row,Column) * Line端点:(RowBegin,ColBegin)-(RowEnd,ColEnd) * 输出:Distance为点到直线的最短距离 message1 := 'Distance: ' + Distance * 构建显示消息字符串 * 设置显示字体样式 set_display_font(WindowHandle, 26, 'mono', 'true', 'false') * 参数说明: * WindowHandle: 目标窗口 * 26: 字体大小 * 'mono': 等宽字体 * 'true': 加粗显示 * 'false': 不斜体 disp_message(WindowHandle, message1, 'window', 0, 230, 'forest green', 'false') * 显示文本信息 * 参数说明: * 消息内容:message1 * 显示位置:相对于窗口的位置(0,230) * 文本颜色:forest green * 透明背景:'false'
公式什么的不懂可以网上再搜一下
2.两条线段距离
还是一样随便读取个图,画两条直线,然后计算两条线距离
* 初始化窗口和图像显示系统 dev_clear_window() * 清除当前活动窗口的内容 dev_close_window() * 关闭所有打开的窗口(谨慎使用) dev_get_window(WindowHandle) * 获取当前窗口的句柄(关键窗口标识符) read_image(Image, '1.png') * 读取图像文件到Image变量中 * 自动适应图像大小的窗口模式 dev_open_window_fit_image(Image, 0, 0, -1, -1, WindowHandle) * 参数说明: * Image: 输入图像 * 0,0: 窗口左上角坐标(相对位置) * -1,-1: 使用图像实际尺寸填充窗口 * WindowHandle: 目标窗口句柄 dev_display(Image) * 在指定窗口显示图像 * 绘制第一条线段(可修改线段参数) draw_line(WindowHandle, RowBegin1, ColBegin1, RowEnd1, ColEnd1) * 在窗口绘制线段但不显示 disp_line(WindowHandle, RowBegin1, ColBegin1, RowEnd1, ColEnd1) * 在窗口显示线段(可视化) dev_set_color('red') * 设置绘图颜色为红色 draw_line(WindowHandle, RowBegin, ColBegin, RowEnd, ColEnd) * 在窗口绘制第二条线段(可修改线段参数) disp_line(WindowHandle, RowBegin, ColBegin, RowEnd, ColEnd) * 在窗口显示线段(可视化) * 计算两条线段之间的最小/最大距离 distance_ss(RowBegin1,ColBegin1,RowEnd1,ColEnd1, RowBegin,ColBegin,RowEnd,ColEnd, DistanceMin, DistanceMax) * 距离计算函数 * 参数说明: * Line1参数:(RowBegin1,ColBegin1)-(RowEnd1,ColEnd1) * Line2参数:(RowBegin,ColBegin)-(RowEnd,ColEnd) * 输出: * DistanceMin: 最小距离 * DistanceMax: 最大距离 message1 := 'DistanceMin: ' + DistanceMin * 构建最小距离显示消息字符串 message2 := 'DistanceMax: ' + DistanceMax * 构建最大距离显示消息字符串 * 设置显示字体样式 set_display_font(WindowHandle, 26, 'mono', 'true', 'false') * 参数说明: * WindowHandle: 目标窗口 * 26: 字体大小 * 'mono': 等宽字体 * 'true': 加粗显示 * 'false': 不斜体 * 显示最小距离信息 disp_message(WindowHandle, message1, 'window', 0, 230, 'forest green', 'false') * 参数说明: * 消息内容:message1 * 显示位置:窗口左上角(0,230) * 文本颜色:forest green * 透明背景:'false' * 显示最大距离信息(纵向偏移20像素) disp_message(WindowHandle, message2, 'window', 20, 230, 'forest green', 'false')
3.两条平行线轮廓距离
整两条平行直线的图片出来,然后提取轮廓线,计算距离
* 初始化窗口和图像处理环境 dev_clear_window() * 清除当前活动窗口的内容 dev_close_window() * 关闭所有打开的窗口(谨慎使用) dev_get_window(WindowHandle) * 获取当前窗口的句柄(关键窗口标识符) read_image(Image, '两条平行直线.png') * 读取图像文件到Image变量中 * 自动适应图像大小的窗口模式 dev_open_window_fit_image(Image, 0, 0, -1, -1, WindowHandle) * 参数说明: * Image: 输入图像 * 0,0: 窗口左上角坐标(相对位置) * -1,-1: 使用图像实际尺寸填充窗口 * WindowHandle: 目标窗口句柄 dev_display(Image) * 在指定窗口显示图像 * 边缘检测与轮廓提取 edges_sub_pix(Image, Edges, 'sobel_fast', 82, 30, 80) * Canny边缘检测算子 * 参数说明: * 'sobel_fast': 快速Sobel滤波器 * 82: 下阈值 * 30: 上阈值比例 * 80: 类似度阈值 count_obj(Edges, Number) * 统计检测到的边缘区域数量 sort_contours_xld(Edges, SortedContours, 'upper_left', 'true', 'row') * 轮廓排序规则: * 'upper_left': 按左上角坐标排序 * 'true': 包含内部轮廓 * 'row': 按行优先顺序排列 * 选择特定轮廓作为处理对象 select_obj(SortedContours, ObjectSelected1, 1) * 选择第1个轮廓作为直线1 select_obj(SortedContours, ObjectSelected2, 3) * 选择第3个轮廓作为直线2 * 直线拟合与参数获取 fit_line_contour_xld(ObjectSelected1, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist) * Tukey直线拟合算法 * 参数说明: * 'tukey': 剔除异常值的鲁棒拟合方法 * -1: 自动选择搜索范围 * 0,5: 最小/最大迭代次数 * 2: 最大拟合误差容限 * 输出参数: * RowBegin,ColBegin: 直线起点 * RowEnd,ColEnd: 直线终点 * Nr,Nc: 法向量方向 * Dist: 直线到原点的带符号距离 fit_line_contour_xld(ObjectSelected2, 'tukey', -1, 0, 5, 2, RowBegin1, ColBegin1, RowEnd1, ColEnd1, Nr1, Nc1, Dist1) * 同上处理第二个轮廓 * 计算两直线间的距离 distance_ss(RowBegin1,ColBegin1,RowEnd1,ColEnd1, RowBegin,ColBegin,RowEnd,ColEnd, DistanceMin, DistanceMax) * 距离计算函数 * 参数说明: * Line1参数:(RowBegin1,ColBegin1)-(RowEnd1,ColEnd1) * Line2参数:(RowBegin,ColBegin)-(RowEnd,ColEnd) * 输出: * DistanceMin: 线段间的最小距离 * DistanceMax: 线段间的最大距离 message1 := 'DistanceMin: ' + DistanceMin * 构建最小距离显示消息字符串 message2 := 'DistanceMax: ' + DistanceMax * 构建最大距离显示消息字符串 * 设置显示字体样式 set_display_font(WindowHandle, 26, 'mono', 'true', 'false') * 参数说明: * WindowHandle: 目标窗口 * 26: 字体大小 * 'mono': 等宽字体 * 'true': 加粗显示 * 'false': 不斜体 * 显示距离信息 disp_message(WindowHandle, message1, 'window', 0, 200, 'forest green', 'false') * 参数说明: * 消息内容:message1 * 显示位置:窗口左上角(0,200) * 文本颜色:forest green * 透明背景:'false' disp_message (WindowHandle, message2, 'window', 40, 200, 'forest green', 'false')
4.一维测量线宽(重要,常用)
随便找了个圆环图,量测一下圆环的线宽,正常是不用这个实例方法量测的,这个实例适合线到线,量测圆环的话,量测矩形框得画的正。应该用两个平行线做图片更好,不过我太懒了就这样吧。
使用measure_pos()算子得到测量的边缘两点,然后计算点与点的距离
画个直线直观一点
* 读取图像并预处理 read_image(Image,'圆环.png') * 读取图像文件到Image变量 get_image_size (Image, Width, Height) * 获取图像尺寸信息 dev_get_window (WindowHandle) * 获取当前窗口句柄 set_display_font (WindowHandle, 18, 'mono', 'true', 'false') * 设置窗口显示字体样式 row:=370.205 * 圆环中心行坐标(像素单位) col:=237.337 * 圆环中心列坐标(像素单位) phi:=rad(-90) * 旋转角度(转换为弧度制,-90度表示垂直方向) len1:=49.8985 * 长轴长度(像素单位) len2:=6.985422 * 短轴长度(像素单位) gen_rectangle2 (Rectangle, row, col, phi, len1, len2) * 重要算子:生成旋转矩形区域 * Rectangle:输出矩形区域 * row,col:中心坐标 * phi:旋转角度 * len1/len2:长短轴长度 gen_measure_rectangle2 (row, col, phi, len1, len2, Width, Height, 'nearest_neighbor', MeasureHandle) * 创建测量模型 * row,col,phi,len1,len2:几何参数 * Width/Height:图像尺寸限制 * 'nearest_neighbor':匹配算法 * MeasureHandle:输出测量句柄 measure_pos (Image, MeasureHandle, 1, 30, 'all', 'all', RowEdge, ColumnEdge, Amplitude, Distance) * 执行边缘测量 * 1:搜索半径 * 30:信噪比阈值 * 'all'/'all':全范围测量 * RowEdge/ColumnEdge:存储坐标 * Amplitude:信号强度 * Distance:间距 PinHeight1 := RowEdge[1] - RowEdge[0] * 计算高度(垂直边缘间距) dev_set_color ('red') * 设置红色绘制 dev_display(Image) * 显示处理图像 gen_region_points (Region, RowEdge, ColumnEdge) * 生成边点区域 * Region:输出区域 * RowEdge/ColumnEdge:边缘坐标集合 disp_line (WindowHandle, RowEdge[0], ColumnEdge[0], RowEdge[1], ColumnEdge[1]) * 绘制检测到的边缘线段 disp_message (WindowHandle, 'Pin Height: ' + PinHeight1, 'image', RowEdge[1] + 40, ColumnEdge[1] - 100, 'green', 'false') * 显示高度信息 * image:图像基准 * green:绿色文字 * 不透明背景 close_measure (MeasureHandle) * 关闭测量句柄 dev_set_draw ('fill') * 设置填充绘制模式 dev_set_line_width (1) * 设置线宽为1像素
主要算子:gen_measure_rectangle2()和measure_pos()算子
gen_measure_rectangle2( : Row, // 输入参数:中心行坐标(浮点型) Column, // 输入参数:中心列坐标(浮点型) Phi, // 输入参数:旋转角度(弧度制) Length1, // 输入参数:长半轴长度(浮点型) Length2, // 输入参数:短半轴长度(浮点型) Width, // 输入参数:图像宽度限制(整数型) Height, // 输入参数:图像高度限制(整数型) Interpolation, // 输入参数:插值方法(字符串类型) MeasureHandle // 输出参数:测量句柄 )
功能用途
-
生成旋转矩形测量模型
- 根据中心坐标
(Row, Column)
、旋转角度Phi
、半轴长度Length1/Length2
,定义一个旋转矩形区域。 - 结合插值方法
Interpolation
,建立边缘检测的搜索模板。
- 根据中心坐标
-
边缘检测与测量
- 模型用于在图像中匹配类似旋转矩形的边缘(如圆环的内外边缘)。
- 示例:通过该模型检测圆环上下边缘,计算销钉高度(垂直间距)。
关键注意事项
-
旋转方向
- 角度
Phi
以弧度为单位,正方向为逆时针(Halcon默认坐标系)。 - 示例:
phi := rad(90)
表示逆时针旋转90°,长轴指向左方。
- 角度
-
半轴长度与图像尺寸
Length1
和Length2
需在图像尺寸范围内(受Width/Height
限制)。- 若半轴超出图像边界,可能导致测量失败。
-
插值方法选择
'nearest_neighbor'
适合精确匹配离散边缘(如机械零件的锐利边缘)。'linear'
适合平滑边缘(如自然图像轮廓)。
-
测量结果处理
- 通过
measure_pos
获取边缘坐标后,需验证结果的合理性(如坐标越界检查)。
- 通过
measure_pos( Image, // 输入参数:待处理的图像 MeasureHandle, // 输入参数:测量模型句柄 SearchRadius, // 输入参数:搜索半径(像素) SNRThreshold, // 输入参数:信噪比阈值 EdgeType, // 输入参数:边缘类型('all', 'positive', 'negative') RowEdge, ColumnEdge, // 输出参数:行/列边缘坐标数组 Amplitude, // 输出参数:边缘幅度值 Distance // 输出参数:相邻边缘间距 )
输入参数
-
Image
- 类型:
image
- 说明:需要进行边缘测量的目标图像。
- 示例:需提前通过
read_image()
读取图像。
- 类型:
-
MeasureHandle
- 类型:
handle
- 说明:由测量模型生成器(如
gen_measure_rectangle2()
)创建的测量句柄。 - 示例:
MeasureHandle := gen_measure_rectangle2(...)
- 类型:
-
SearchRadius
- 类型:
int
- 说明:在测量区域内搜索边缘的最大距离(像素单位)。
- 示例:
1
表示仅在测量模型中心周围1像素范围内搜索。
- 类型:
-
SNRThreshold
- 类型:
float
- 说明:信噪比阈值,用于筛选有效边缘。
- 示例:
30.0
表示仅保留幅度超过30的边缘。
- 类型:
-
EdgeType
- 类型:
string
- 说明:定义要检测的边缘类型:
'all'
: 检测所有方向的正负边缘。'positive'
: 仅检测正方向边缘(梯度上升)从暗区域到亮区域。'negative'
: 仅检测负方向边缘(梯度下降)从亮区域到暗区域。
- 类型:
输出参数
-
RowEdge & ColumnEdge
- 类型:
array[row]
- 说明:存储检测到的边缘行/列坐标(按距离中心点的远近排序)。
- 示例:
RowEdge[0]
为最近边缘,RowEdge[1]
为次近边缘。
- 类型:
-
Amplitude
- 类型:
array[float]
- 说明:对应边缘的信号强度(反映边缘对比度)。
- 类型:
-
Distance
- 类型:
float
- 说明:相邻边缘间的距离(仅当检测到两条及以上边缘时有效)。
- 类型:
-
边缘检测与定位
- 基于预定义的测量模型(如旋转矩形),在图像中搜索特定类型的边缘。
- 适用于圆环内外边缘、孔洞边缘等对称结构的测量。
-
参数化测量
- 通过调整
SearchRadius
和SNRThreshold
平衡检测灵敏度与误检率。 - 结合
EdgeType
选择需要检测的边缘方向。
- 通过调整
还想了解更多的线宽测量可以看看halcon的示例代码,正常来讲我上面那些基本都够用了,只要前面做好预处理操作,绘制好量测的位置框。
二.圆形测量相关
1.圆形计量模型量测
也是随便找个圆环图
然后使用计量模型或者说测量模型主要步骤是:1.创建计量模型,2.添加测量对象,3.应用计量模型到图像对象中去测量,4.获取测量后的一些参数。
绘制个测量圆区域(红线),将红线圆内的区域裁剪出来后面测量,这样就等于提取ROI区域,那些不感兴趣的区域就不要留着干扰测量了。
将裁剪图传入创建设定好参数的计量模型测量,得到测量结果,然后获取一下测量拟合成的圆形,是否贴合,来判断我们量测的对象准不准确。
可以看到绿色的轮廓线都切合圆边,我们量测的就是外圆,可以直接得到外圆的圆心和半径参数了。单个圆测量就只获取半径和圆心即可,这时候想要量测圆环的线宽怎么做?不就是分别用计量模型测
外圆和内圆,得到两个的数据,直接半径相减,就是圆环线宽了。基本上计量模型这套模式都可以量测目前工业上的控件了(计量模型:圆形,线段,矩形,椭圆,点),其他的就是你采集测量的图像干扰太多导致量测不准,这就要进行图像预处理,图像增强,噪声消除,裁剪ROI,填充干扰等等。
实例代码:
* 关闭所有打开窗口(安全起始操作) dev_close_window() * 关闭实时更新(提高处理速度) dev_update_off() * 读取目标图像到变量Image read_image(Image, '圆环.png') * 获取图像分辨率信息 get_image_size(Image, Width, Height) * 自适应窗口显示图像 dev_open_window_fit_image(Image, 0, 0, -1, -1, WindowHandle) * 显示原始图像 dev_display(Image) * 绘制辅助图形(绿色圆环) draw_circle_mod(WindowHandle, Height/2, Width/2, Width/2, Row, Column, Radius) * 生成精确数学圆形区域 gen_circle(Circle, Row, Column, Radius) * 提取圆形区域作为处理域(提高检测精度) reduce_domain(Image, Circle, ImageReduced) * 生成正向圆周轮廓线 gen_circle_contour_xld(ContCircle, Row, Column, Radius, 0, 6.28318, 'positive', 1) * 显示圆周轮廓线 dev_display(ContCircle) * 设置绘制颜色为绿色 dev_set_color('green') * 创建新的计量模型句柄 create_metrology_model(MetrologyHandle) * 添加圆形测量对象: add_metrology_object_generic(MetrologyHandle, 'circle', [Row, Column, Radius], 20, 5, 1, 50, [], [], Index) * 参数说明: * 'circle' - 测量类型 * [Row,Column,Radius] - 圆心坐标和半径 * 20 - 最小搜索半径(像素) * 5 - 信噪比阈值 * 1 - 边缘类型(0=正边缘,1=负边缘) * 50 - 最大允许倾斜角度(度数) * 应用计量模型到图像 apply_metrology_model(ImageReduced, MetrologyHandle) * 获取所有测量对象的通用参数 get_metrology_object_result(MetrologyHandle, 'all', 'all', 'result_type', 'all_param', Parameter) * 获取所有轮廓线的详细信息(1.5为最小相似度) get_metrology_object_result_contour(Contour, MetrologyHandle, 'all', 'all', 1.5) * 获取所有测量的几何参数 get_metrology_object_measures(Contours, MetrologyHandle, 'all', 'all', Row1, Column1) * 显示检测到的轮廓 dev_display(Contours) stop() * 清除计量模型资源 clear_metrology_model(MetrologyHandle) * 关键算子说明: * 释放计量模型占用的系统资源 * 必须在程序结束前调用以避免内存泄漏 * 当检测到至少3个参数时执行 if(|Parameter| > 2) * 绘制十字标记定位圆心 disp_cross(WindowHandle, Parameter[0], Parameter[1], 26, 0) message1 := 'CenterRow: ' + Parameter[0] message2 := 'CenterCol: ' + Parameter[1] message3 := 'Radius: ' + Parameter[2] * 设置字体样式 set_display_font(WindowHandle, 16, 'mono', 'true', 'false') * 显示测量结果信息 disp_message(WindowHandle, message1, 'window', 0, 230, 'forest green', 'false') disp_message(WindowHandle, message2, 'window', 20, 230, 'forest green', 'false') disp_message(WindowHandle, message3, 'window', 40, 230, 'forest green', 'false') endif
本文基本都是用小demo自己写的,基本都是从halcon示例代码里面提取出来的,想要了解的更全面就要去看完整的实例代码,我这种简单的小demo就是会学习的比较快,直接学习重点。
好了把上面主要的算子介绍一下:
1.create_metrology_model( : : : MetrologyHandle) 就是创建个计量模型句柄。
2.add_metrology_object_generic(:: MetrologyHandle, Shape, ShapeParam, MeasureLength1, MeasureLength2, MeasureSigma, MeasureThreshold, GenParamName, GenParamValue : Index)算子详解:
1. MetrologyHandle
- 类型:
handle
- 说明: 计量模型句柄,通过
create_metrology_model()
创建。 - 关键作用: 标识要添加测量对象的计量模型容器。
- 示例:
MetrologyHandle := create_metrology_model('single_window')
2. ObjectType
- 类型:
string
- 说明: 测量对象类型,决定几何特征匹配模板。
- 支持类型:
'circle'
: 圆形'line'
: 线段'rectangle'
: 矩形'ellipse'
: 椭圆'point'
: 点
- 注意事项:
- 需与后续
GeometryParameters
严格匹配。
- 需与后续
3. GeometryParameters
- 类型:
array[float]
- 说明: 几何特征的参数数组,格式取决于
ObjectType
。 - 典型配置:示例:
- 圆形:
[Row, Column, Radius]
Row
,Column
: 圆心坐标(像素单位)Radius
: 半径(像素单位)
- 线段:
[x1, y1, x2, y2]
或[x1, y1, Angle, Length]
- 矩形:
[x_center, y_center, Width, Height, Phi]
- 圆形:
-
* 圆形参数 GeometryParameters := [100.0, 200.0, 50.0] * 线段参数(端点坐标) GeometryParameters := [100.0, 100.0, 200.0, 200.0]
4. SearchRadius
- 类型:
float
- 说明: 搜索窗口半径(像素),控制检测范围。
- 影响:
- 过小: 可能遗漏弱特征或倾斜目标。
- 过大: 增加计算量并可能导致误检。
- 典型取值:示例:
- 特征直径的10%~30%(如直径100像素,
SearchRadius := 10~30
)
- 特征直径的10%~30%(如直径100像素,
-
SearchRadius := 20.0 % 对于直径40像素的圆
5. SNRThreshold
- 类型:
float
- 说明: 信噪比阈值,筛选有效边缘。
- 作用:
- 排除低对比度噪声边缘。
- 公式定义:
SNR = (信号强度 - 背景强度) / 噪声强度
。
- 典型取值:示例:
- 高对比度图像(如金属零件):
5.0 ~ 15.0
- 低对比度图像(如塑料件):
20.0 ~ 50.0
- 高对比度图像(如金属零件):
-
SNRThreshold := 30.0
6. EdgeType
- 类型:
int
- 说明: 边缘类型,决定检测方向。
- 选项:
0
: 正边缘(上升沿,从暗到亮)1
: 负边缘(下降沿,从亮到暗)
- 应用场景:示例:
- 正边缘: 孔洞边缘、凹陷区域。
- 负边缘: 凸起边缘、轮廓外侧。
-
EdgeType := 1 % 检测负边缘
7. MaxAngleDeviation
- 类型:
float
- 说明: 最大允许倾斜角度(度数),控制特征方向的容差。
- 影响:
- 值越小: 要求特征方向越严格(如垂直方向±1°)。
- 值越大: 允许更大倾斜(如±5°)。
- 典型取值:示例:
- 精密检测:
1.0 ~ 3.0
- 工业检测:
5.0 ~ 15.0
- 精密检测:
-
MaxAngleDeviation := 5.0 % 允许±5°倾斜
8. MinSimilarity
- 类型:
float
- 说明: 模板匹配相似度阈值(0~1)。
- 作用:
- 控制模板与图像区域的匹配严格程度。
- 值越小,匹配越严格(可能漏检)。
- 值越大,匹配越宽松(可能误检)。
- 典型取值:示例:
- 高精度场景:
0.8 ~ 0.95
- 快速检测:
0.6 ~ 0.8
- 高精度场景:
-
MinSimilarity := 0.85
9. MaxCorrelationDistance
- 类型:
float
- 说明: 最大相关距离(像素),限制搜索区域。
- 影响:
- 过小: 导致匹配失败(如目标偏移较大)。
- 过大: 增加计算负担。
- 计算公式:示例:
- 建议设为
SearchRadius × 1.5 ~ 2.0
。
- 建议设为
-
MaxCorrelationDistance := 30.0 % 基于SearchRadius=20
10. OutputHandle
- 类型:
handle
- 说明: 输出的测量对象句柄,用于后续操作。
- 用途:示例:
- 通过
get_metrology_object_result()
获取检测结果。 - 结合
apply_metrology_model()
应用模型。
- 通过
-
add_metrology_object_generic(..., CircleHandle)
参数 | 调整优先级 | 调整方向对结果的影响 |
---|---|---|
SearchRadius | 1 | 增大范围可检测更模糊的特征 |
SNRThreshold | 2 | 提高阈值可减少误检 |
MinSimilarity | 3 | 降低阈值可增加检测灵敏度 |
MaxAngleDeviation | 4 | 扩大角度容差可适应倾斜特征 |
3.apply_metrology_model(Image : : MetrologyHandle : ):就是传入待检测的图像和前面的句柄
4.get_metrology_object_result( : : MetrologyHandle, Index, Instance, GenParamName, GenParamValue : Parameter)详解:
参数详细说明
1. MetrologyHandle
- 类型:
handle
- 说明:示例:
- 通过
create_metrology_model()
创建的计量模型句柄。 - 作用: 标识要查询的计量对象所属的模型容器。
- 通过
-
MetrologyHandle := create_metrology_model('single_window')
2. Index: 'all'
- 类型:
string
(特殊值) - 说明:示例:
- 结果索引模式,设置为
'all'
表示获取所有匹配结果。 - 默认行为:
- 若省略此参数或设为
0
,仅获取第一个匹配结果。 - 设为
'all'
时,返回所有检测到的结果(如多条边缘或多实例匹配)。
- 若省略此参数或设为
- 结果索引模式,设置为
-
* 获取所有检测结果 get_metrology_object_result(..., 'all', ...)
3. Instance: 'all'
- 类型:
string
(特殊值) - 说明:示例:
- 实例编号模式,设置为
'all'
表示获取所有匹配实例。 - 适用场景:
- 当同一计量对象在图像中多次匹配时(如多个相似圆形)。
- 默认行为:
- 若省略此参数或设为
0
,仅获取第一个匹配实例。
- 若省略此参数或设为
- 实例编号模式,设置为
-
* 获取所有匹配实例的数据 get_metrology_object_result(..., 'all', 'all', ...)
4. GenParamName: 'result_type'
- 类型:
string
- 说明:
- 参数查询类型,设置为
'result_type'
表示获取所有可用结果类型。 - 其他常见值:
'SearchRadius'
: 搜索半径'SNRThreshold'
: 信噪比阈值'MinSimilarity'
: 相似度阈值
- 参数查询类型,设置为
- 作用:示例:
- 指定需要查询的参数类别。
- 结合
GenParamValue
模式(如'all_param'
)决定返回具体参数还是所有参数。
-
* 获取所有结果类型 get_metrology_object_result(..., 'result_type', 'all_param', Parameter)
5. GenParamValue: 'all_param'
- 类型:
string
(特殊值) - 说明:
- 参数查询模式,设置为
'all_param'
表示返回所有匹配的参数值。 - 适用场景:
- 需要一次性获取计量对象的全部配置参数。
- 其他常见值:
- 具体数值(如
20.0
、5.0
)或布尔值(如'true'
)。
- 具体数值(如
- 参数查询模式,设置为
- 作用:示例:
- 与
GenParamName
配合使用,决定返回参数的粒度。
- 与
-
* 获取所有参数值(如SearchRadius、SNRThreshold等) get_metrology_object_result(..., 'all_param', Parameter)
6. Parameter
- 类型:
array[variant]
- 说明:
- 输出参数: 存储查询到的参数集合。
- 这里就是给出半径圆心等参数,其他测量就会给出其他的参数
5.get_metrology_object_result_contour( : Contour : MetrologyHandle, Index, Instance, Resolution : )参数详解:
1. Contour
- 类型:
contour
(输出参数) - 说明:
- 存储检测到的轮廓线(边缘信息),数据类型为XLD(Extended Line Descriptor)。
- 每个轮廓线对应一个检测到的边缘或几何特征边界。
2. MetrologyHandle
- 类型:
handle
(输入参数) - 说明:
- 通过
create_metrology_model()
创建的计量模型句柄。 - 必须与之前配置的测量对象(如
add_metrology_object_generic()
)关联。
- 通过
3. Index: 'all'
- 类型:
string
(非常规用法)正常是0,1,2等获取第几个 - 说明:
- 非标准参数:在常规Halcon语法中,
Index
应为整数(从0开始计数)。 - all:通过
'all'
获取所有匹配结果的轮廓线。
- 非标准参数:在常规Halcon语法中,
4. Instance: 'all'
- 类型:
string
(非常规用法) - 说明:
- 非标准参数:
Instance
通常为整数(实例编号)。 - all:
- 希望获取所有匹配实例的轮廓线(如多次匹配同一特征)。
- 非标准参数:
5. Resolution: 1.5
- 类型:
float
- 说明:
- 轮廓线分辨率(像素),控制轮廓的精细程度。
- 取值范围:
0.1 ~ 10.0
。 - 作用:
- 低分辨率(如
1.0
):生成稀疏轮廓线,适合快速检测。 - 高分辨率(如
1.5
):生成密集轮廓线,保留更多边缘细节(如孔洞边缘)。
- 低分辨率(如
6.get_metrology_object_measures( : Contours : MetrologyHandle, Index, Transition : Row, Column)参数详解:
Contours :这里是计量轮廓的集合
其他参数跟上面的函数一样
2.矩形计量模型量测
这里的逻辑基本跟圆形量测一样,就不详细讲什么了
随便找个矩形图片
画个量测框
得到量测的结果
* 获取窗口句柄用于图像显示 dev_get_window(WindowHandle) * 读取目标图像到变量Image read_image(Image, '4.png') * 将RGB图像转换为灰度图像 rgb1_to_gray(Image, Image) * 创建新的计量模型容器 create_metrology_model(MetrologyHandle) * 在窗口中绘制旋转矩形(仅绘制不测量) draw_rectangle2(WindowHandle, Row, Column, Phi, Length1, Length2) * 参数说明: * Row:中心行坐标 * Column:中心列坐标 * Phi:旋转角度(弧度值) * Length1:长轴长度 * Length2:短轴长度 * 生成精确的旋转矩形区域 gen_rectangle2(Rectangle, Row, Column, Phi, Length1, Length2) * 输出矩形区域句柄 * 提取矩形区域作为处理域(提高检测精度) reduce_domain(Image, Rectangle, ImageReduced) * 添加矩形测量对象到计量模型 add_metrology_object_rectangle2_measure(MetrologyHandle, Row, Column, Phi, Length1, Length2, 30, 10, 1, 30, [], [], Index) * 关键参数说明: * 前六个参数:矩形几何参数 * SearchRadius:30像素搜索半径 * SNRThreshold:10信噪比阈值 * EdgeType:1检测负边缘 * MaxAngleDeviation:30度最大倾斜容差 * MinSimilarity:未使用(设为默认值) * MaxCorrelationDistance:未使用(设为默认值) * OutputHandle:输出测量对象句柄(存储在Index中) * 应用计量模型到处理域图像 apply_metrology_model(ImageReduced, MetrologyHandle) * 获取通用测量参数(所有结果/所有实例) get_metrology_object_result(MetrologyHandle, Index, 'all', 'result_type', 'all_param', Parameter) * 参数说明: * MetrologyHandle:计量模型句柄 * Index:结果索引(从0开始) * 'all' :获取所有匹配结果 * 'result_type' :查询参数类型 * 'all_param' :返回全部参数名称和值 * 获取轮廓线数据(所有结果/所有实例) get_metrology_object_result_contour(Contour, MetrologyHandle, Index, 'all', 1.5) * 参数说明: * Resolution:1.5像素轮廓线分辨率 * 获取几何测量结果 get_metrology_object_measures(Contours, MetrologyHandle, 'all', 'all', Row1, Column1) * 清除计量模型释放资源 clear_metrology_model(MetrologyHandle) * 当检测到至少4个参数时显示测量结果 if (|Parameter| > 3) * 构建显示消息 message1 := 'CenterRow: ' + Parameter[0] message2 := 'CenterCol: ' + Parameter[1] message3 := 'Phi: ' + Parameter[2] message4 := 'lenRa: ' + Parameter[3] message5 := 'lenRb: ' + Parameter[4] * 设置显示字体样式 set_display_font(WindowHandle, 26, 'mono', 'true', 'false') * 显示测量结果信息 disp_message(WindowHandle, message1, 'window', 0, 230, 'forest green', 'false') disp_message(WindowHandle, message2, 'window', 20, 230, 'forest green', 'false') disp_message(WindowHandle, message3, 'window', 40, 230, 'forest green', 'false') disp_message(WindowHandle, message4, 'window', 60, 230, 'forest green', 'false') disp_message(WindowHandle, message5, 'window', 80, 230, 'forest green', 'false') endif
本篇测量就这样,基本工业的量测都是用这些算子,其他就是你的界面操作编写,图像预处理那些了,详细的实例可以看看halcon的实例代码:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下