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的实例代码:
Halcon学习教程(二) 测量量测相关(点到线距离,线到线距离,轮廓线距离,一维测量,圆形测量,矩形测量等)的更多相关文章
- redis学习教程二《四大数据类型》
redis学习教程二<四大数据类型> 四大数据类型包括:字符串 哈希 列表 集合一 : Redis字符串 Redis字符串命令用于管理Redis中的字符串 ...
- Halcon学习之二:摄像头获取图像和相关参数
1.close_all_framegrabbers ( : : : ) 关闭所有图像采集设备. 2.close_framegrabber ( : : AcqHandle : ) 关闭Handle为Ac ...
- storyBoard学习教程二(页面跳转)
本篇是接着上一篇 storyBoard 学习教程一 的补充,有过storyBoard 编程经验的伙伴还是不要阅读本篇博客了,我自己认为,太基础太简单了,为了方便别人学习使用,我还是详细的做了这篇教程. ...
- git学习教程二之远程仓库学习
首先你需要注册一个github用户名,我的github账户是:1654218052@qq.com 由于本地的git仓库和github的仓库是通过SSH加密的,所以我们还需要设置一点东西哦 第1步:创建 ...
- halcon学习相关资料(转载)
https://blog.csdn.net/maweifei/article/details/78162581 论坛.培训 halcon学习网:http://www.ihalcon.com/ 鸟叔机器 ...
- ArcGIS JS 学习笔记1 用ArcGIS JS 实现仿百度地图的距离量测和面积量测
一.开篇 在博客注册了三年,今天才决定写第一篇博客,警告自己不要懒!!! 二.关于ArcGIS JS 版本选择 在写这篇博客时ArcGIS JS 4.0正式版已经发布.它和3.x版本的不同是,Map不 ...
- C#入门教程(二)–C#常用快捷键、变量、类型转换-打造C#学习教程
C#入门教程(一)–.Net平台技术介绍.C#语言及开发工具介绍-打造C#学习教程 上次教程主要介绍了.Net平台以及C#语言的相关介绍.以及经典程序案例,helloworld程序. 初来乍到,第一次 ...
- 跟我学机器视觉-HALCON学习例程中文详解-FUZZY检测用于开关引脚测量
跟我学机器视觉-HALCON学习例程中文详解-FUZZY检测用于开关引脚测量 * This example program demonstrates the basic usage of a fuzz ...
- 跟我学机器视觉-HALCON学习例程中文详解-IC引脚测量
跟我学机器视觉-HALCON学习例程中文详解-IC引脚测量 Lead Measurement: Example for the application of the measure object in ...
- Halcon学习笔记之支持向量机(二)
例程:classify_halogen_bulbs.hdev 在Halcon中模式匹配最成熟最常用的方式该署支持向量机了,在本例程中展示了使用支持向量机对卤素灯的质量检测方法.通过这个案例,相信大家可 ...
随机推荐
- 鸿蒙应用开发从入门到入行 - 篇2:HarmonyOS开发快速基础入门
鸿蒙应用开发从入门到入行 第二天 - 开发工具与基础组件 导读:在本篇文章里,您将掌握鸿蒙开发工具DevEco的基本使用.ArkUI里的基础组件,并通过制作一个简单界面掌握使用 鸿蒙开发工具 - De ...
- node-koa2 微信支付-企业付款到银行卡
微信支付用的V2版本 微信支付说明文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay_yhk.php?chapter=24_2 参数详细 ...
- 精通 ASP.NET Core MVC (第 7 版) 源码下载
将使用的 .NET 版本更新到 5.0 版本. GitHub 地址:https://github.com/haoguanjun/pro-asp.net-core-mvc-2
- 权限控制(acl,rbac)
目录 一.权限控制(acl,rbac) 一.权限控制(acl,rbac) 将来我们编写的项目主要分成两类:公司内部项目和互联网项目 公司内部项目 使用RBAC-基于角色的访问控制 什么是RBAC? R ...
- iaas,saas,paas,daas区别:
iaas,saas,paas,daas区别: Iaas(Infrastructure as a server):基础设施即服务,是基础层.PaaS(Platform as a Server):平台即服 ...
- 加入security+jwt安全策略
Pom中引入 <!-- security --> <dependency> <groupId>org.springframework.boot</groupI ...
- cs-script:一个非常成熟的C#脚本开源引擎
推荐一个强大C#脚本引擎,方便我们在项目中,动态执行C#脚本. 01 项目简介 CS-Script是非常成熟的C#脚本引擎,自2004年起就发布了,即.NET发布后的两年. 支持托管和独立(CLI)执 ...
- 基于Vue的前后段分离开发项目中<img :src />标签中引用vue的data属性中定义的图像地址失败的解决办法
问题描述: 基于Vue的前后段分离开发项目中<img :src />标签中引用vue的data属性中定义的图像地址失败,如下图所示: 解决办法: 修改后写法,加上require即可.如下 ...
- 一个小的图文编辑软件 -- 采用winform开发
本人用winform开发了一款图文编辑软件,实现了图片.文字.图形混合排版; 可以对图元调整大小.设置角度.添加剪切区间等操作.本人以前也写过一款类似的软件<WinForm版图像编辑小程序> ...
- JAVA常见问题合集
面向对象 面向过程和面向对象 面向对象的三大基本特征:封装.继承.多态 - 封装:隐藏内部细节 继承:复用现有代码 多态:改写对象行为 JAVA为什么是面向对象的,为什么还用int等基础类型 面向对象 ...