Halcon 测量之measure_pos算子介绍(四)

measure_pos
原型
measure_pos(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdge, ColumnEdge, Amplitude, Distance)

功能
提取垂直于矩形或者环形弧的直边。

参数列表
Image (input_object) :输入图像
MeasureHandle (input_control) :测量对象句柄
Sigma (input_control) :高斯滤波参数
Threshold (input_control) :边缘强度控制阈值
Transition (input_control) :边界从白到黑还是从黑到白(分别对应’negative’, ‘positive’,也可以选择‘all’)
Select (input_control) :选择寻点的模式( 'all’输出所有点, 'first’输出第一个点, 'last’输出最后一个点)
RowEdge (output_control) :寻到直边的中心点行坐标
ColumnEdge (output_control) :寻到直边的中心点列坐标
Amplitude (output_control) :寻到直边的边缘强度值
Distance (output_control) :连续边之间的距离

详解
有关1D测量的概念解释参考:https://blog.csdn.net/qq_18620653/article/details/106214957
measure_pos通过计算垂直于矩形或者环形弧长轴(轮廓线)的每个切片上的平均灰度值,这些平均灰度值称为一维边界轮廓。

 

 

切片采样虽然是亚像素级别,但行列移动步长始终为1Pixel(可以用助手拖动轮廓或一阶导数折线图上的红色线条观察)。由于在生成测量对象句柄时,绝大部分计算是雷同的,为了提高Measure_Pos的测量效率,算子gen_measure_rectangle2 或者 gen_measure_arc 只需要执行一次即可(下面会举例说明)。在亚像素级别切片平均灰度值计算过程中,测量的精度和效率需要权衡。通过算子gen_measure_rectangle2 可以选择不同的插值方式(仅当轮廓线和要测量的图像边界不垂直的时候才起作用),当然不同的插值方式精度和效率不同,可以根据自己的需求舍弃某一方(Halcon 测量之1D边缘提取过程介绍(二)有说明)。通过gen_measure_rectangle2 生成测量对象句柄MeasureHandle。

 

 

在计算一维边缘轮廓之后,通过将轮廓与标准差Sigma的高斯平滑核的导数卷积来计算亚像素边缘位置(其实就是平滑轮廓,去除噪点)。紧接着,对平滑后的轮廓求一阶导数,并取其绝对值作为输出。最后,通过参数Threshold来选择强边界。需要注意的是振幅值按系数Sigma x sqrt(2π)对一阶导数进行缩放。

此外,如果Transition模式选择positive,也即是沿着矩形或者环形弧主轴方向边界是从黑到白的;相反,如果选择negative,寻边是从白到黑;如果选择‘all’,获取的边界是以上两种情况的并集。如果参数Select = ‘all’,寻到所有的点都会返回;如果Select = ‘first’,仅返回第一个点;如果Select = ‘last’,仅返回最后一个点。

提取到的边将会以坐标的方式返回,这个坐标是边与轮廓线的交点,同时边缘梯度对应输出(Amplitude);另外,连续边缘点间的距离输出到参数Distance中。这里,Distance[i]对应的是Edge[i]和Edge[i+1]之间的距离,即最终Distance 的数组长度比RowEdge以及ColumnEdge少1。

说了那么多,只怕遗漏重要内容,影响对算子的正确理解。如果仅想大致了解算子,可以参考下面简要总结:
1、通过算子gen_measure_rectangle2 生成MeasureHandle句柄,沿着切片方向计算平均灰度值(可选择插值方式,仅当轮廓线和要测量图像的边界不垂直时起作用)
2、对平均灰度值(轮廓)进行高斯滤波,目的是让曲线更平滑,消除噪点。
3、对平滑后的轮廓求一阶导数(根据Sigma x sqrt(2π)因子进行缩放)。
4、根据设置的参数提取边缘点。

如何设置参数Threshold的值
Halcon测量核心应该就是这个参数的调节,因为合适的值不仅可以提取到高精度的边界,而且程序稳定性好。
方式一:
打开测量助手,调节最小边缘幅度,保证提取到边界前提下,确定最小边缘幅度的范围,然后在范围内设置一个合适值即可。优点方便快捷,不需要熟悉测量工具运行机制,傻瓜式操作;缺点依赖Halcon软件。
式二:
结合文中以及下图解释,可以直接计算,大致确定最大边缘幅度。
首先查看要提取边界黑白界限的灰度值GrayLightValue、GrayDarkValue,求差值SubGrayValue = GrayLightValue - GrayDarkValue,其实SubGrayValue 这个值就是灰度图像某个位置的一阶导数,最后计算幅度值AmplitudeValue = SubGrayValue x Sigma x sqrt(2π) (大致值,因为过程中没有插值运算,平均灰度值也是按照一个像素宽计算的,但相差不大)优点是可以快速调试参数,且如果在现场调试可以脱离Halcon软件;缺点会有微小误差。


举例

 

 


注意事项

 

 

测量结果
每个小矩形红色框为轮廓线的ROI(一共38个),绿色十字架是对应提取到的边缘点。

 

 

* **测量变量初始化**
* 第一个测量对象轮廓线中心点行坐标
MeasureStartRow := 70
* 第一个测量对象轮廓线中心点列坐标
MeasureStartCol := 130
* 测量对象角度(90度)
MeasurePhi := 1.57079
* 测量对象长轴
MeasureLength1 := 100
* 测量对象短轴
MeasureLength2 := 10
* 寻边个数
FindEdgeNum := 37
* 加载一张图像
read_image (Image, 'ic_pin')

* 显示窗口初始化
dev_close_window ()
dev_update_off ()
get_image_size (Image, ImageWidth, ImageHeight)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_set_line_width (2)
dev_set_draw ('margin')
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')

* 灰度值闭运算消除小引脚
gray_closing_rect (Image, ImageClosing, 60, 60)
dev_display (ImageClosing)
* 生成测量对象句柄
* 易出错示例
gen_measure_rectangle2 (MeasureStartRow, MeasureStartCol, rad(0), MeasureLength2, MeasureLength1, ImageWidth, ImageHeight, 'nearest_neighbor', MeasureHandle)
gen_rectangle2 (Rectangle, MeasureStartRow, MeasureStartCol, rad(0), MeasureLength2, MeasureLength1)

* 正确示例
gen_measure_rectangle2 (MeasureStartRow, MeasureStartCol, MeasurePhi, MeasureLength1, MeasureLength2, ImageWidth, ImageHeight, 'nearest_neighbor', MeasureHandle)

for Index := 0 to FindEdgeNum by 1
* 移动测量对象句柄
translate_measure (MeasureHandle, MeasureStartRow, MeasureStartCol + 2 * MeasureLength2 * Index)
* 根据测量变量生成Rectangle2(用于可视化,可注释掉)
gen_rectangle2 (Rectangle, MeasureStartRow, MeasureStartCol + 2 * MeasureLength2 * Index, MeasurePhi, MeasureLength1, MeasureLength2)
dev_display (Rectangle)
* 测量
measure_pos (ImageClosing, MeasureHandle, 1, 30, 'positive', 'first', RowEdge, ColumnEdge, Amplitude, Distance)
* 显示寻到的边界位置点
dev_set_color ('green')
disp_cross (WindowHandle, RowEdge, ColumnEdge, 20, 0)
dev_set_color ('red')
endfor
* 关闭测量对象
close_measure (MeasureHandle)

————————————————
版权声明:本文为CSDN博主「智信仁勇严道」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_18620653/article/details/106194813

posted @ 2022-04-24 14:26  Malcon机器视觉底层库  阅读(1164)  评论(0编辑  收藏  举报