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              // 输出参数:测量句柄
)
复制代码

功能用途

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

 


 

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 :这里是计量轮廓的集合

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

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

 

 

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的实例代码:

 

 

posted @   aircraft  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示