Halcon编程指南:符号与元组操作详解
符号
等号 :=
注释 *
比较运算符:
=
、==
、>
、<
、#
、and
、or
取反:
not(true)
流程控制
判断
if(index < 1)a:='b' endif if(index < 1)a:='b' elsea:='c' endif if(index < 1)a:='b' elseif(index > 3)a:='c' endif
for循环
for I := 0 to NumBalls - 1 by 1 endfor
while循环
while (x== 1) Endwhile
switch分支
switch (Index) case 1:break case 2:break default:break endswitch
异常获取:
Try catch (Exception) Endtry
Tuple元组
元组类似数组,用于存储一系列相同类型的数据
元组定义和赋值
* 声明一个元组并赋值 变量名 := [1,2,3,4] * 批量给Tuple数组赋值,其值为0到10000连续数值 Tuple3 := [0:10000] * 批量给Tuple数组赋值,其值为3到200连续数值,步长为1 Tuple4 := [3:1:200] * 批量给Tuple数组赋值,其值为100到-100连续数值,步长为-10 Tuple5 := [100:-10:-100]
索引数据修改
*索引赋值 Tuple1[1] := 2 * 批量索引赋值 Tuple1[1,3,5] := 'abc'
数组其他操作
对两个Tuple数组进行合并操作
tuple_union (数组a, 数组b, 新数组名称)
两个Tuple数组进行交集操作
tuple_intersection (数组a, 数组b, IntersectionInt)
替换
tuple_replace (源数组, 1, 88, 新数组名称)
替换索引1的值为88tuple_replace (源数组, [1,3], 88, 新数组名称)
替换索引1、3的值为88tuple_replace (源数组, [1,3], [66,88], 新数组名称)
替换索引1、3的值为66、88
向Tuple数组插入数值
tuple_insert(源数组, 3, 'x', 新数组名称)
数组反转
tuple_inverse (源数组, 新数组)
获取数组长度
tuple_length (源数组, 长度)
len := |源数组|
tuple_strlen(字符串, 长度)
获取字符串长度
最大值、最小值、平均数
tuple_max、tuple_min、tuple_mean
返回一个随机数tuple数组,分布在[0,1)范围之间
tuple_rand(10,temp)
两个数组相减
tuple_sub(Array1,Array2,Sub)
将两个数组元素逻辑与
tuple_and(Array1,Array2,And)
将两个数组元素逻辑或
tuple_or(Array1,Array2,Or)
给数组元素升序排序
tuple_sort(Array,Sorted)
数组元素升序排序
tuple_sort(Array,Sorted)
创建固定长度的数组,其中放置相同的数据
gen_tuple_const(长度, 内容)
格式化
a2 := 123$'#o'
OCT,表示8进制(小写o),得到的字符串以0为前缀 '0173'a3 := 123$'#x'
hex,表示16进制,得到的字符串以0x为前缀(小写) '0x7b'a4 := 123$'X'
Hex,表示16进制,得到的字符串以0X为前缀(大写) '0X7B'a5 := 123$'f'
double类型,默认保留小数点后六位a5 := 123$'.3f'
double类型,保留小数点后三位a6 := 123$'g'
使数字始终保持六位,不足在后面补.0a7 := 123$'G'
使数字始终保持六位,不足在后面补.0a8 := 123$'e'
转换成科学计数 '1.230000e+02'a9 := 123$'E' // 转换成科学计数 '1.230000E+02'b1 := 123$'6'
保证字符串至少六位。小于六位文本右对齐,在前面补空格。大于六位不影响b2 := 123$'-6'
保证字符串至少六位。小于六位文本左对齐,在后面补空格。大于六位不影响b3 := 123$'.6'
保证字符串至少六位。小于六位前面补0。大于六位不影响b4 := 123$'10.6'
保证字符串至少十位。小于六位前面补0,文本右对齐,前面补4个空格。大于六位小于十位,在前面补空格文本右对齐。大于十位不影响s1 := 'abc'$'6'
同上s2 := 'abc'$'-6'
同上
数据结构
图形参数
Image
Halcon中,Image = 通道和域构成.
通道:包括单通道和多通道,图像数据存放在通道里; 单通道指能用一个灰度级数值表示像素,黑白图像。如果像素值使用三原色表示,则为多通道图像,也就是3通道,分别为(Red,红色)、G(Green,绿色)、B(Blue,蓝色)3个通道,各自的取值范围都是0~255。
大多数情况下,灰度图像可以满足检测需求,为了节约计算量并加快速度,因此通常会将彩色图像转换为灰度图像进行处理。
像素类型:
Byte:8 bits 无符号; 标准的灰度图像会用这种类型;
Uint2:16 bits 无符号;标准的灰度图像会用这种类型;
Int1:8 位有符号; 两帧图像的差异会用这种类型;
Int2: 16 位有符号;两帧图像的差异会用这种类型;
Int4:32位有符; 两幅图形的灰度频谱会使用这种类型
Direction:8 位无符号;值为:0-179;边缘梯度会用这种类型
Real:32 位浮点类型:边缘提取会用这种类型;
Complex:每个像素用2个real 值:用频率表示图像用这种类型
Cyclic:8 位无符号;给每个颜色分配灰度值
Vector field:两帧 rea| 类型的图像,描述X或者Y方向的运动。
图像相关算子
read_image( : Image : FileName : )
读取图像access_channel(MultiChannelImage : Image : Channel :)
获取多通道图像中的某一个通道count_channels(MultiChannelImage:::Channels)
获取图像的通道数量append_channel(MultiChannelImage, Image:ImageExtended::)
将两通道的图像叠加得到新图像compose3(Imagel, Image2,Image3:MultiChannelImage::)
将三个单通道的图像合成一个三通道彩色图像decompose3(MultiChannellmage:Imagel, Image2, Image3::)
将三通道彩色图像转换为三个单灰度图像trans_from_rgb(ImageRed, ImageGreen, ImageBlue:ImageResultl, ImageResult2, ImageResult3:ColorSpace:)
将彩色图像从RGB空间转换到其他颜色空间ImageRed、ImageGreen、ImageBlue:分别对应彩色图像的R通道、G 通道、B通道的灰度图像。
ImageResult1、ImageResult2、ImageResult3:分别对应转换后得到 的三个单通道灰度图像。
ColorSpace : 输 出 的 颜 色 空 间 , 包 括‘hsv’、‘hls’、‘hsi’、‘ihs’、‘yiq’、‘yuv’等,RGB颜 色空间转换到其他颜色空间有对应的函数关系。
Regions
Region指图像中的一块区域。机器视觉的任务之一就是识别图像中包 含某些特性的区域,比如执行阈值分割处理。
将区域标识为以行列坐标为内容的游程编码的形式,使之成为一种压缩方式,存储更加高效
例如:字符串5555557777733322221111111 游程编码为:(5,6)(7,5)(3,3)(2,4)(1,7)。可见,行程编码的位数远远少于原始字符串的位数
区域的特征主要有以下3个部分
基础特征:Region的面积、中心、宽高、左上角与右下角坐标、长 半轴、短半轴、椭圆方向、粗糙度、连通数、最大半径、方向等。
形状特征:外接圆半径、内接圆半径、圆度、紧密度、矩形度、凸 性、偏心率、外接矩形的方向等。
几何矩特征:二阶矩、三阶矩、主惯性轴等。
区域相关算子
threshold(Image:Region:MinGray, MaxGray:)
阈值分割,将图像按照对应的灰度值分割出区域,区域的灰度值g满足:MinGray≤g≤MaxGray可以使用灰度直方图工具
打开之后选择输出使能
拖拽直方图中红色和绿色的线条来调整阈值的最大值和最小值,选择比较合适的范围
XLD
XLD对象提供了亚像素精度,轮廓多边形。
xld特征分为4个部分
基础特征:XLD面积、中心、宽高、左上角及右下角坐标。
形状特征:圆度、紧密度、长度、矩形度、凸性、偏心率、外接矩 形的方向及两边的长度等。
云点特征:云点面积、中心、等效椭圆半轴及角度、云点方向等。
几何矩特征:二阶矩等。
XLD相关算子
threshold_sub_pix(Image:Border:Threshold:)
根据预置提取单通道图像中的轮廓edges_sub_pix(Image : Edges : Filter, Alpha, Low, High : )
使用滤波提取轮廓
控制参数
和高级语言的类型相似
string 字符串
integer 整型
real 实型
tuple array 数组(可为整型,实型或是字符串)
handle 句柄
打开图像窗口的三种方式
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
打开一个窗口, 位置:0 0,宽高:512,512,背景,句柄dev_open_window_fit_image (Image, 0, 0, 200, 200, WindowHandle1)
打开一个窗口,并根据指定的图像的尺寸保持纵横比,参数4、参数5分别指定宽度和高度的限制值参数4和5如果指定为-1则分别使用 [500,800] [400,600]
dev_open_window_fit_size(0, 0, Width, Height, 200, 200, WindowHandle2)
打开一个窗口,并根据指定的尺寸保持纵横比,参数5、参数6分别指定宽度和高度的限制值
一般打开窗口之后需要dev_display(Image)
进行图像的显示
xld和区域的读写
write_contour_xld_dxf
、read_contour_xld_dxf
这两个算子可以将轮廓xld存储和读取到文件中。可以使用edges_sub_pix
提取轮廓xldwrite_regions
、read_regions
这两个算子可以将区域存储到文件中,以及从文件中读取区域。可以使用threshold
阈值后获得区域