原文作者: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 // 输出参数:测量句柄
)

功能用途

  1. 生成旋转矩形测量模型

    • 根据中心坐标(Row, Column)、旋转角度Phi、半轴长度Length1/Length2,定义一个旋转矩形区域。
    • 结合插值方法Interpolation,建立边缘检测的搜索模板。
  2. 边缘检测与测量

    • 模型用于在图像中匹配类似旋转矩形的边缘(如圆环的内外边缘)。
    • 示例:通过该模型检测圆环上下边缘,计算销钉高度(垂直间距)。

关键注意事项

  1. 旋转方向

    • 角度Phi以弧度为单位,正方向为逆时针(Halcon默认坐标系)。
    • 示例:phi := rad(90) 表示逆时针旋转90°,长轴指向左方。
  2. 半轴长度与图像尺寸

    • Length1Length2需在图像尺寸范围内(受Width/Height限制)。
    • 若半轴超出图像边界,可能导致测量失败。
  3. 插值方法选择

    • 'nearest_neighbor'适合精确匹配离散边缘(如机械零件的锐利边缘)。
    • 'linear'适合平滑边缘(如自然图像轮廓)。
  4. 测量结果处理

    • 通过measure_pos获取边缘坐标后,需验证结果的合理性(如坐标越界检查)。
measure_pos(
Image, // 输入参数:待处理的图像
MeasureHandle, // 输入参数:测量模型句柄
SearchRadius, // 输入参数:搜索半径(像素)
SNRThreshold, // 输入参数:信噪比阈值
EdgeType, // 输入参数:边缘类型('all', 'positive', 'negative')
RowEdge, ColumnEdge, // 输出参数:行/列边缘坐标数组
Amplitude, // 输出参数:边缘幅度值
Distance // 输出参数:相邻边缘间距
)

输入参数

  1. Image

    • 类型:image
    • 说明:需要进行边缘测量的目标图像。
    • 示例:需提前通过read_image()读取图像。
  2. MeasureHandle

    • 类型:handle
    • 说明:由测量模型生成器(如gen_measure_rectangle2())创建的测量句柄。
    • 示例:MeasureHandle := gen_measure_rectangle2(...)
  3. SearchRadius

    • 类型:int
    • 说明:在测量区域内搜索边缘的最大距离(像素单位)。
    • 示例:1表示仅在测量模型中心周围1像素范围内搜索。
  4. SNRThreshold

    • 类型:float
    • 说明:信噪比阈值,用于筛选有效边缘。
    • 示例:30.0表示仅保留幅度超过30的边缘。
  5. EdgeType

    • 类型:string
    • 说明:定义要检测的边缘类型:
      • 'all': 检测所有方向的正负边缘。
      • 'positive': 仅检测正方向边缘(梯度上升)从暗区域到亮区域。
      • 'negative': 仅检测负方向边缘(梯度下降)从亮区域到暗区域。

输出参数

  • RowEdge & ColumnEdge

    • 类型:array[row]
    • 说明:存储检测到的边缘行/列坐标(按距离中心点的远近排序)。
    • 示例:RowEdge[0]为最近边缘,RowEdge[1]为次近边缘。
  • Amplitude

    • 类型:array[float]
    • 说明:对应边缘的信号强度(反映边缘对比度)。
  • Distance

    • 类型:float
    • 说明:相邻边缘间的距离(仅当检测到两条及以上边缘时有效)。

功能用途

  1. 边缘检测与定位

    • 基于预定义的测量模型(如旋转矩形),在图像中搜索特定类型的边缘。
    • 适用于圆环内外边缘、孔洞边缘等对称结构的测量。
  2. 参数化测量

    • 通过调整SearchRadiusSNRThreshold平衡检测灵敏度与误检率。
    • 结合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(:: MetrologyHandleShapeShapeParamMeasureLength1MeasureLength2MeasureSigmaMeasureThresholdGenParamNameGenParamValue : 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
  •  
    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( : : MetrologyHandleIndexInstanceGenParamNameGenParamValue : 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.05.0)或布尔值(如'true')。
  • 作用:示例:
    • GenParamName配合使用,决定返回参数的粒度。
  •  
    * 获取所有参数值(如SearchRadius、SNRThreshold等)
    get_metrology_object_result(..., 'all_param', Parameter)

6. Parameter

  • 类型: array[variant]
  • 说明:
    • 输出参数: 存储查询到的参数集合。
    • 这里就是给出半径圆心等参数,其他测量就会给出其他的参数

5.get_metrology_object_result_contour( : Contour : MetrologyHandleIndexInstanceResolution : )参数详解:

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' 获取所有匹配结果的轮廓线。

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 : MetrologyHandleIndexTransition : RowColumn)参数详解:

Contours :这里是计量轮廓的集合

RowColumn:是每个小计量矩形提取到的圆边点

其他参数跟上面的函数一样

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学习教程(二) 测量量测相关(点到线距离,线到线距离,轮廓线距离,一维测量,圆形测量,矩形测量等)的更多相关文章

  1. redis学习教程二《四大数据类型》

    redis学习教程二<四大数据类型>  四大数据类型包括:字符串    哈希    列表   集合一 : Redis字符串         Redis字符串命令用于管理Redis中的字符串 ...

  2. Halcon学习之二:摄像头获取图像和相关参数

    1.close_all_framegrabbers ( : : : ) 关闭所有图像采集设备. 2.close_framegrabber ( : : AcqHandle : ) 关闭Handle为Ac ...

  3. storyBoard学习教程二(页面跳转)

    本篇是接着上一篇 storyBoard 学习教程一 的补充,有过storyBoard 编程经验的伙伴还是不要阅读本篇博客了,我自己认为,太基础太简单了,为了方便别人学习使用,我还是详细的做了这篇教程. ...

  4. git学习教程二之远程仓库学习

    首先你需要注册一个github用户名,我的github账户是:1654218052@qq.com 由于本地的git仓库和github的仓库是通过SSH加密的,所以我们还需要设置一点东西哦 第1步:创建 ...

  5. halcon学习相关资料(转载)

    https://blog.csdn.net/maweifei/article/details/78162581 论坛.培训 halcon学习网:http://www.ihalcon.com/ 鸟叔机器 ...

  6. ArcGIS JS 学习笔记1 用ArcGIS JS 实现仿百度地图的距离量测和面积量测

    一.开篇 在博客注册了三年,今天才决定写第一篇博客,警告自己不要懒!!! 二.关于ArcGIS JS 版本选择 在写这篇博客时ArcGIS JS 4.0正式版已经发布.它和3.x版本的不同是,Map不 ...

  7. C#入门教程(二)–C#常用快捷键、变量、类型转换-打造C#学习教程

    C#入门教程(一)–.Net平台技术介绍.C#语言及开发工具介绍-打造C#学习教程 上次教程主要介绍了.Net平台以及C#语言的相关介绍.以及经典程序案例,helloworld程序. 初来乍到,第一次 ...

  8. 跟我学机器视觉-HALCON学习例程中文详解-FUZZY检测用于开关引脚测量

    跟我学机器视觉-HALCON学习例程中文详解-FUZZY检测用于开关引脚测量 * This example program demonstrates the basic usage of a fuzz ...

  9. 跟我学机器视觉-HALCON学习例程中文详解-IC引脚测量

    跟我学机器视觉-HALCON学习例程中文详解-IC引脚测量 Lead Measurement: Example for the application of the measure object in ...

  10. Halcon学习笔记之支持向量机(二)

    例程:classify_halogen_bulbs.hdev 在Halcon中模式匹配最成熟最常用的方式该署支持向量机了,在本例程中展示了使用支持向量机对卤素灯的质量检测方法.通过这个案例,相信大家可 ...

随机推荐

  1. 鸿蒙应用开发从入门到入行 - 篇2:HarmonyOS开发快速基础入门

    鸿蒙应用开发从入门到入行 第二天 - 开发工具与基础组件 导读:在本篇文章里,您将掌握鸿蒙开发工具DevEco的基本使用.ArkUI里的基础组件,并通过制作一个简单界面掌握使用 鸿蒙开发工具 - De ...

  2. node-koa2 微信支付-企业付款到银行卡

    微信支付用的V2版本 微信支付说明文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay_yhk.php?chapter=24_2   参数详细 ...

  3. 精通 ASP.NET Core MVC (第 7 版) 源码下载

    将使用的 .NET 版本更新到 5.0 版本. GitHub 地址:https://github.com/haoguanjun/pro-asp.net-core-mvc-2

  4. 权限控制(acl,rbac)

    目录 一.权限控制(acl,rbac) 一.权限控制(acl,rbac) 将来我们编写的项目主要分成两类:公司内部项目和互联网项目 公司内部项目 使用RBAC-基于角色的访问控制 什么是RBAC? R ...

  5. iaas,saas,paas,daas区别:

    iaas,saas,paas,daas区别: Iaas(Infrastructure as a server):基础设施即服务,是基础层.PaaS(Platform as a Server):平台即服 ...

  6. 加入security+jwt安全策略

    Pom中引入 <!-- security --> <dependency> <groupId>org.springframework.boot</groupI ...

  7. cs-script:一个非常成熟的C#脚本开源引擎

    推荐一个强大C#脚本引擎,方便我们在项目中,动态执行C#脚本. 01 项目简介 CS-Script是非常成熟的C#脚本引擎,自2004年起就发布了,即.NET发布后的两年. 支持托管和独立(CLI)执 ...

  8. 基于Vue的前后段分离开发项目中<img :src />标签中引用vue的data属性中定义的图像地址失败的解决办法

    问题描述: 基于Vue的前后段分离开发项目中<img  :src />标签中引用vue的data属性中定义的图像地址失败,如下图所示: 解决办法: 修改后写法,加上require即可.如下 ...

  9. 一个小的图文编辑软件 -- 采用winform开发

    本人用winform开发了一款图文编辑软件,实现了图片.文字.图形混合排版; 可以对图元调整大小.设置角度.添加剪切区间等操作.本人以前也写过一款类似的软件<WinForm版图像编辑小程序> ...

  10. JAVA常见问题合集

    面向对象 面向过程和面向对象 面向对象的三大基本特征:封装.继承.多态 - 封装:隐藏内部细节 继承:复用现有代码 多态:改写对象行为 JAVA为什么是面向对象的,为什么还用int等基础类型 面向对象 ...