Halcon例程一维函数的使用之check

编程入门 行业动态 更新时间:2024-10-23 23:22:52

Halcon例程一维<a href=https://www.elefans.com/category/jswz/34/1771370.html style=函数的使用之check"/>

Halcon例程一维函数的使用之check

提取垂直于矩形或环形弧的灰度值轮廓。

  • 前言
  • 1、一维函数——check_smd_tilt.hdev
    • 1.1 图像边缘清晰对应的振幅(amplitude)
    • 1.2 图像边缘模糊对应的振幅(amplitude)
    • 1.3 局部均值和标准差分析对图像进行阈值处理var_threshold
    • 1.4 借助形状特征选择区域 select_shape
    • 1.5 变换区域的形状 shape_trans
    • 1.6 缩小图像的域 reduce_domain
    • 1.7 使用 Sobel 算子检测边缘(幅度) sobel_amp
    • 1.8 任何方向的最小环绕矩形 smallest_rectangle2
    • 创建任意方向的矩形gen_rectangle2
    • 1.9 准备提取垂直于矩形的直边 gen_measure_rectangle2
  • 2、分析关键函数功能和用法
    • 2.1 dev_open_window (Operator)
      • 2.1.1 函数原型
      • 2.1.2 example
      • 2.1.3 analysis
    • 2.2 var_threshold
      • 2.2.1 函数原型
      • 2.2.2 分析
    • 2.3 connection (Operator)
      • 2.3.1 函数原型
      • 2.3.2 描述
    • 2.4 select_shape (Operator)
      • 2.3.1 函数原型
      • 2.3.2 example


前言

该程序检查 SMD 是否接近水平或是否相对于相机倾斜。图像是在小景深下拍摄的,因此倾斜的 SMD 部分模糊。
首先,从图像中分割出 SMD。 然后,计算边缘的幅度(灰度值的一阶导数)。 边缘幅度在模糊区域较弱。
因此,可以通过比较 SMD 左右部分的边缘幅度来检测倾斜的 SMD。


1、一维函数——check_smd_tilt.hdev

初始化窗口准备

dev_update_off ()
dev_close_window ()  //关闭活动图形窗口
//Open a new graphics window
dev_open_window (0, 0, 640 * .7, 512 * .7, 'black', WindowHandle)
dev_set_draw ('margin')   //定义区域填充模式
dev_set_line_width (3)    //定义区域轮廓输出的线宽
//Open a new graphics window
dev_open_window (0, 640 * .7 + 12, 640 * .7, 512 * .7, 'black', GrayProfileWindow)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
set_display_font (GrayProfileWindow, 16, 'mono', 'true', 'false')

图像处理

* 
NumImages := 10
for Index := 1 to NumImages by 1read_image (Image, 'smd/smd_tilted_' + Index$'02') //读取不同文件格式的图像* * Segment the SMD* //通过局部均值和标准差分析对图像进行阈值处理var_threshold (Image, Region, 20, 20, 0.1, 2, 'dark') //计算区域的连通分量connection (Region, ConnectedRegions)//借助形状特征选择区域select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 15000, 99999999)//变换区域的形状shape_trans (SelectedRegions, RegionTrans, 'convex')//缩小图像的域reduce_domain (Image, RegionTrans, ImageReduced)* * Check if the SMD is tilted* //使用 Sobel 算子检测边缘(幅度)sobel_amp (ImageReduced, EdgeAmplitude, 'sum_abs', 3)//任何方向的最小环绕矩形//区域的最小周围矩形,请注意,计算是基于区域像素的中心坐标。 smallest_rectangle2 (RegionTrans, Row, Column, Phi, Length1, Length2)//创建任意方向的矩形gen_rectangle2 (Rectangle, Row, Column, Phi, Length1 - 3, 20)//准备提取垂直于矩形的直边gen_measure_rectangle2 (Row, Column, Phi, Length1 - 3, 20, 640, 512, 'nearest_neighbor', MeasureHandle)//提取垂直于矩形或圆弧的灰度值轮廓measure_projection (EdgeAmplitude, MeasureHandle, GrayValues)// Delete a measure objectclose_measure (MeasureHandle)Sequence := [1:|GrayValues|]//创建一维函数 (x,y)create_funct_1d_pairs (Sequence, GrayValues, Function)gen_arrow_contour_xld (Arrow, [Row,Row], [Column,Column], [Row - Length1 * sin(Phi),Row + Length1 * sin(Phi)], [Column + Length1 * cos(Phi),Column - Length1 * cos(Phi)], 25, 25)* * Evaluate the edge amplitude of the SMD profileLength := |GrayValues|PartLeft := GrayValues[0:Length / 2]PartRight := GrayValues[Length / 2:Length - 1]RangeLeft := max(PartLeft) - min(PartLeft)RangeRight := max(PartRight) - min(PartRight)TiltRatio := RangeLeft / RangeRightif (TiltRatio > 3 or TiltRatio < 1.0 / 3)Color := 'red'String := 'Not OK:\nSMD is tilted'elseColor := 'green'String := 'OK:\nSMD is aligned'endif* 
显示结果
    * Display the resultsdev_set_window (WindowHandle)   //激活图形窗口dev_display (Image)             //在当前图形窗口中显示图像对象dev_set_color (Color)           //设置一种或多种输出颜色dev_display (Arrow)             //在当前图形窗口中显示图像对象dev_display (RegionTrans)disp_message (WindowHandle, String, 'window', 12, 12, 'black', 'true')dev_set_window (GrayProfileWindow)  //激活图形窗口dev_clear_window ()                 //清除活动图形窗口的内容//绘制一维函数图像plot_funct_1d (GrayProfileWindow, Function, [], [], Color, 'axes_color', 'none')disp_message (GrayProfileWindow, ['Edge amplitude','Tilt ratio = ' + TiltRatio$'3.2f'], 'window', 12, 12, 'white', 'false')if (Index != NumImages)disp_continue_message (WindowHandle, 'black', 'true')stop ()endif
endfor

1.1 图像边缘清晰对应的振幅(amplitude)

1.2 图像边缘模糊对应的振幅(amplitude)

1.3 局部均值和标准差分析对图像进行阈值处理var_threshold

1.4 借助形状特征选择区域 select_shape

1.5 变换区域的形状 shape_trans

1.6 缩小图像的域 reduce_domain

1.7 使用 Sobel 算子检测边缘(幅度) sobel_amp

1.8 任何方向的最小环绕矩形 smallest_rectangle2

创建任意方向的矩形gen_rectangle2

1.9 准备提取垂直于矩形的直边 gen_measure_rectangle2

2、分析关键函数功能和用法

2.1 dev_open_window (Operator)

2.1.1 函数原型

dev_open_window( : : Row, Column, Width, Height, Background : WindowHandle)
//其中
Row (input_control)     rectangle.origin.y → (integer)
Column (input_control)  rectangle.origin.x → (integer)//左/右上角的行索引。//默认值:0//典型值范围:0 ≤ Row/Column//最小增量:1//推荐增量:1//限制:Row/Column >= 0
Width (input_control)   rectangle.extent.x → (integer)
Height (input_control)  rectangle.extent.y → (integer)//窗口的宽度/高度。//默认值:256//典型值范围:0 ≤ Width/Height  //最小增量:1//推荐增量:1//限制:(Width/Height  > 0) || (Width/Height  == -1)
Background (input_control)  integer → (integer / string)//Color of the background of the new window.//Default value: 'black'
WindowHandle (output_control)  window → (integer)//窗口标识符

2.1.2 example

dev_close_window ()
read_image (For5, 'for5')
get_image_size (For5, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (For5)
dev_set_lut ('rainbow')
dev_display (For5)
stop ()
dev_set_lut ('default')
dev_display (For5)
stop ()
dev_set_part (100, 100, 300, 300)
dev_display (For5)

2.1.3 analysis

dev_open_window 打开一个新的图形窗口,可用于显示图像、区域和线条等标志性对象以及执行文本输出。此窗口自动变为活动状态,这意味着所有输出(dev_display 和操作员结果的自动显示)都重定向到此窗口。这由活动按钮上的发光灯显示。

图形窗口的原点是坐标 (0,0) 的左上角。 x 值(列)从左到右增加,y 值(行)从上到下增加。默认情况下,坐标系的设置方式是图像显示时无需剪裁并完全适合图形窗口。对于在程序重置或加载新程序之后显示的第一幅图像,或者如果当前图像的图像大小与之前显示的图像不同,则根据此规则,坐标系适应窗口大小。窗口的大小不会自动调整,因此,如果图像的纵横比与窗口的纵横比不同,则图像会扭曲以适应窗口。这可以通过窗口大小菜单进行更改。

每个图形窗口管理一个历史记录,其中包含
1.对象和
2.显示参数


2.2 var_threshold

通过局部均值和标准差分析对图像进行阈值处理。

2.2.1 函数原型

var_threshold(Image : Region : MaskWidth, MaskHeight, StdDevScale, AbsThreshold, LightDark : )

参数

//参数
Image (input_object)  singlechannelimage(-array) → object (byte/int2/int4/uint2/real)//input image
Region (output_object)  egion(-array) → object//Segmented regions
MaskWidth (input_control)   extent.x → (integer)
MaskHeight (input_control)  extent.y → (integer)//用于平均值和偏差计算的掩码宽度/高度。//默认值:15//建议值:9、11、13、15//限制:MaskWidth/MaskHeight  >= 1
StdDevScale (input_control)  number → (real / integer)//灰度值标准偏差的因子。//默认值:0.2//建议值:-0.2、-0.1、0.1、0.2
AbsThreshold (input_control) number → (real / integer)//与平均值的最小灰度值差异。//默认值:2//建议值:-2、-1、0、1、2
LightDark (input_control) string → (string)//Threshold type.//Default value: 'dark'//List of values: 'dark', 'equal', 'light', 'not_equal'

2.2.2 分析

运算符 var_threshold 从输入图像 Image 中选择像素满足阈值条件的那些区域。 阈值是根据每个像素 (x,y) 周围大小为 MaskWidth x MaskHeight 的局部窗口中的平均灰度值和标准偏差计算得出的。 如果 MaskWidth 或 MaskHeight 为偶数,则使用下一个较大的奇数值。 掩码窗口应大于要分割的图像特征,并且应至少包含三个像素。

设 g(x,y) 为输入图像 Image 中 (x,y) 位置的灰度值,m(x,y) 和 d(x,y) 为窗口中灰度值的对应均值和标准差 围绕那个像素和



标准偏差用作图像中噪声的度量,并由 StdDevScale 缩放以反映所需的灵敏度。 阈值条件由参数 LightDark 决定:

LightDark = ‘light’:

LightDark = ‘dark’:

LightDark = ‘equal’:

LightDark = ‘not_equal’:

所有满足上述条件的像素都被聚合到结果区域 Region 中。

对于参数 StdDevScale 值,介于 -1.0 和 1.0 之间是明智的选择,建议值为 0.2。 如果参数太高或太低,可能会返回一个空或完整的区域。 参数 AbsThreshold 在 StdDevScaledev(x,y) 上设置了一个额外的阈值。 如果 StdDevScaledev(x,y) 对于 StdDevScale 的正值低于 AbsThreshold,或者对于负值 StdDevScale 高于 AbsThreshold,则采用 AbsThreshold。


2.3 connection (Operator)

connection — 计算区域的连通分量

2.3.1 函数原型

connection(Region : ConnectedRegions : : )//参数
Region (input_object)               region(-array) → object//input region
ConnectedRegions (output_object)    region -array → object//连接的组件

2.3.2 描述

connection 确定 Region 中给定的输入区域的连通分量。 用于此的邻域可以通过 set_system(‘neighborhood’,<4/8>) 设置。 默认是 8-neighborhood,这对于确定前景的连通分量很有用。 connection 返回的最大连接组件数可以通过 set_system(‘max_connection’,) 设置。 默认值 0 会导致返回所有连接的组件。 连接的逆运算符是 union1。


2.4 select_shape (Operator)

select_shape — 借助形状特征选择区域

2.3.1 函数原型

select_shape(Regions : SelectedRegions : Features, Operation, Min, Max : )
//参数
Regions (input_object)            region-array → objec//要检查的区域
SelectedRegions (output_object)   region-array → object//满足条件的区域
Features (input_control)          string(-array) → (string)//选择筛选的形状特征。/*Default value: 'area'
List of values: 'anisometry', 'area', 'area_holes', 'bulkiness', 'circularity', 
'column', 'column1', 'column2', 'compactness', 'connect_num', 'contlength', 
'convexity', 'dist_deviation', 'dist_mean', 'euler_number', 'height', 'holes_num', 
'inner_height', 'inner_radius', 'inner_width', 'max_diameter', 'moments_i1', 
'moments_i2', 'moments_i3', 'moments_i4', 'moments_ia', 'moments_ib', 'moments_m02', 
'moments_m02_invar', 'moments_m03', 'moments_m03_invar', 'moments_m11',
'moments_m11_invar', 'moments_m12', 'moments_m12_invar', 'moments_m20',
'moments_m20_invar', 'moments_m21', 'moments_m21_invar', 'moments_m30',
'moments_m30_invar', 'moments_phi1', 'moments_phi2', 'moments_psi1', 'moments_psi2', 
'moments_psi3', 'moments_psi4', 'num_sides', 'orientation', 'outer_radius', 'phi', 
'ra', 'rb', 'rect2_len1', 'rect2_len2', 'rect2_phi', 'rectangularity', 'roundness', 
'row', 'row1', 'row2', 'struct_factor', 'width'
*/Operation (input_control)  string → (string)//单个特征的链接类型//Default value: 'and'//List of values: 'and', 'or'
Min (input_control)      real(-array) → (real / integer / string)//Lower limits of the features or 'min'.//Default value: 150.0//Typical range of values: 0.0 ≤ Min ≤ 99999.0//Minimum increment: 0.001//Recommended increment: 1.0
Max (input_control)    real(-array) → (real / integer / string) //Upper limits of the features or 'max'.//Default value: 99999.0//Typical range of values: 0.0 ≤ Max ≤ 99999.0//Minimum increment: 0.001//Recommended increment: 1.0//Restriction: Max >= Min

2.3.2 example

* where are the eyes of the ape ?
read_image(Image,'monkey')
threshold(Image,S1,160,255)
connection(S1,S2)
select_shape(S2,Eyes,['area','anisometry'],'and',[500,1.0],[50000,1.7])
dev_display(Image)

更多推荐

Halcon例程一维函数的使用之check

本文发布于:2024-02-26 16:07:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1703088.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:函数   例程   Halcon   check

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!