Halcon-第1课-基本语法
(⼀)Halcon的语法结构特点
类似于Pascal 与 Visual Basic,⼤部分的语句是Halcon提供的算⼦,此外也包含了少部分的控制语句;
不允许单独声明变量;
提供⾃动的内存管理(初始化、析构及OverWrite),但句柄则需要显⽰释放;
C++(算⼦模式)
通过代码导出,以C++为例,默认导出为算⼦型的语法结构,⽽⾮⾯向对象的;在此模式下,全部函数声明为全局类型,数据类型只需要⽤Hobject、HTuple两类类型进⾏声明;
C++(⾯向对象)
可以以⾯向对象的⽅式重写代码,也即利⽤类及类的成员函数;
在这种模式下,控制变量的类型仍未HTuple,⽽图形数据可以由多种类型,如HImage等;
其他语⾔(略)
HImage 可以查看halcon中类相关的内容
(⼆)Halcon的数据类型
两类参数:
1、图形参数Iconic (image, region, XLD)
2、与控制参数Control (string, integer, real, handle),
在Halcon算⼦的参数中,依次为:输⼊图形参数、输出图形参数、输⼊控制参数、输出控制参数;并且其输⼊参数不会被算⼦改变。
1、图形参数Iconic:
(1)Images
在Halcon中,Image = Channel + Domain , 像素点存放在Channel矩阵中,根据ROI来描述Image。
Image相关操作:
输⼊:从⽂件、从设备
⽣成:外部图像数据、空内存区域;
显⽰:disp_image()图像⾸通道灰度图;disp_color() 彩⾊图;disp_channel()某特定通道;disp_obj() ⾃动判别类别;
缩放:set_part() 设置显⽰区域;set_part_style() 设置显⽰参数;
说明:
Ø Multiple channels //多通道图像,可以是灰度图像或RGB图像
Ø Arbitrary region of interest //ROI区域图像
Ø Multiple pixel types(byte, (u)int1/2/4,real, complex, direction, cyclic, vector_field)
byte, uint2 //灰度图像的标准编码
int1, int2 //Difference of two images or derivates with integer precision(??)int4 //两幅灰度图的频谱
direction //图⽚边缘的梯度⽅向
real //边缘提取及特定灰度值的轮廓
complex //图⽚频率分布
cyclic //Assigning one "gray" value to each color(??)
vector_field //连续图形的光学流分布
(2)Regions
以⾏列坐标形式储存,有⼴泛的应⽤,特点是⾼效,可利⽤同态算⼦。⽐如⽤阈值对图像分割的结果,其他系统中称为BOLB,AREA等。(3)E x tended L ine D escription (XLD)
图像均⽤像素点保存,⽽像素点是整型的,不连续的,Halcon做了拓展,定义了亚像素(subpixel)的描述⼏何轮廓的对象:xld,主要⽤在亚像素测量的背景下,可⽤于如提取边缘、构建轮廓等等,xld在模板匹配、图形校准等多⽅⾯有重要的⽤途。
说明:
Subpixel accurate line and edge detection(亚像素精度的线和边缘检测)
Generic point list based data structure(依据数据结构产⽣点的表)
Handling of contours, polygons, lines, parallels, etc.(对轮廓,多边形,线等进⾏操作)
2、控制参数Control:
String类型变量由单引号’括起来;此外还有⼀些特殊字符;
Boolean型变量包括 true ( = 1 )、 false ( = 0 ) ;不为零的整数将被认为true;但绝⼤多数的Halcon函数接受字符串型的表
达:’true’‘false’,⽽⾮逻辑型表达;
此外,Halcon⽀持的类型还包括图形元组、控制变量元组及句柄:
元组的概念,使得可以⽤⼀个变量传递数个对象,可以由重载后的函数来进⾏处理;图形元组的下标从1开始,控制变量元组下标从0开始;句柄则可以⽤来描述窗体、⽂件等等,句柄不能是常量。
(三)Halcon的基本语句
1、标准赋值
Ø assign(Input, Result)    //编辑形式,永远都是输⼊在前,输出在后
1: assign(sin(x) + cos(y), u)
Ø Result := Input              //代码形式
1: u := sin(x) + cos(y)    //与之前的assign(sin(x) + cos(y), u)是等价的
2、元组插⼊赋值
Ø insert(Tuple, NewValue, Index, Tuple)    //编辑形式
1: Tuple := [1,2,3,4,5,6,7,8,9]
2: insert(Tuple,0,3,Tuple)
显⽰结果为:[1, 2, 3,0, 5, 6, 7, 8, 9]
Ø Tuple[Index] := NewValue                        //代码形式
1: Tuple := [1,2,3,4,5,6,7,8,9]
2: Tuple[3]:=0
显⽰结果为:[1, 2, 3,0, 5, 6, 7, 8, 9]
例程:
1: read_image (Mreut, 'mreut')              //读⼊图像
2: threshold (Mreut, Region, 190, 255)      //阈值化,输出阈值在190-255的Regions
3: Areas := []                              //定义数组Areas
4:for Radius := 1 to 50 by 1              //循环
5: dilation_circle (Region, RegionDilation, Radius) //利⽤半径为Radius的圆对Region进⾏膨胀运算,输出
6://RegionDilation,输出形式仍然为Region。
7: area_center (RegionDilation, Area, Row, Column) //输出区域的⾯积和中⼼像素坐标
8: Areas[Radius-1] := Area                        //对数组Areas的第Radius-1个元素进⾏赋值
9: endfor
3、基本数组操作极其对应的算⼦
数组操作说明对应的算⼦
t := [t1,t2]t1,t2连接成新的数组tuple_concat
i := |t|得到数组长度tuple_length
v := t[i]选取第i个元素0<= i < |t|tuple_select
t := t[i1:i2]选取i1到i2的元素tuple_select_range
t := subset(t,i)选取数组t中的第i个元素tuple_select
t := remove(t,i)去除数组t中的第i个元素tuple_remove
数组全部赋值为1i := find(t1,t2)到t2数组在t1数组中出现位置索引(or -
1 if no match)
tuple_find
t := uniq(t)在t数组中把连续相同的值只保留⼀个tuple_uniq
4、创建数组
(1)gen_tuple_const函数
1: tuple_old := gen_tuple_const(100,666) //创建⼀个具有100个元素的,每个元素都为666的数组
2: tuple_new := gen_tuple_const(|tuple_old|,4711) //创建⼀个和原来数据长度⼀样的,每个元素为4711的数组
上⾯的函数也可以通过如下表达式实现:tuple_new := (tuple_old * 0) + 4711
(2)当数组中的元素不同时,需要⽤循环语句对数组中的每⼀个元素赋值
例如:
1: tuple := []  //创建空数组
2:for i := 1 to 100 by 1  //建⽴步长为1的循环
3: tuple := [tuple,i*i]  //将i⽅的值赋给数组的第i个元素
4: endfor  //循环结束
算术运算
Ø a / a division
Ø a % a rest of the integer division
Ø a * a multiplication
Ø v + v addition and concatenation of strings
Ø a - a subtraction
Ø -a negation
位运算
Ø lsh(i,i)            left shift
Ø rsh(i,i)            right shift
Ø i band i          bit-wise and
Ø i bor i            bit-wise or
Ø i bxor i          bit-wise xor
Ø bnot i            bit-wise complement
字符串操作
Ø v$s                      conversion to string //字符串的格式化,有很丰富的参数Ø v + v                    concatenation of strings and addition
Ø strchr(s,s)          search character in string
Ø strstr(s,s)            search substring
Ø strrchr(s,s)        search character in string (reverse)
Ø strrstr(s,s)          search substring (reverse)
Ø strlen(s)              length of string
Ø s{i}                      selection of one character
Ø s{i:i}                    selection of substring
Ø split(s,s)              splitting to substrings
⽐较操作符
Ø t < t              less than
Ø t > t              greater than
Ø t <= t            less or equal
Ø t >= t            greater or equal
Ø t = t              equal
Ø t # t              not equal
逻辑操作符
Ø lnot l                    negation
Ø l and l                  logical ’and’
Ø l or l                      logical ’or’
Ø l xor l                    logical ’xor’
数学函数
Ø sin(a)                        sine of a
Ø cos(a)                      cosine of a
Ø tan(a)                      tangent of a
Ø asin(a)                      arc sine of a in the interval [-p/2, p/ 2], a Î [-1, 1]
Ø acos(a)                    arc cosine a in the interval [-p/2, p/2], a Î [-1, 1]
Ø atan(a)                    arc tangent a in the interval [-p/2, p/2], a Î [-1, 1]
Ø atan2(a,b)              arc tangent a/b in the interval [-p, p]
Ø sinh(a)                      hyperbolic sine of a
Ø cosh(a)                    hyperbolic cosine of a
Ø tanh(a)                    hyperbolic tangent of a
Ø exp(a)                      exponential function
Ø log(a)                      natural logarithm, a> 0
Ø log10(a)                  decade logarithm, a> 0
Ø pow(a1,a2)            power
Ø ldexp(a1,a2)          a1 pow(2,a2)
其他操作(统计、随机数、符号函数等)
Ø min(t)                    minimum value of the tuple
Ø max(t)                    maximum value of the tuple
Ø min2(t1,t2)            element-wise minimum of two tuples
Ø max2(t1,t2)          element-wise maximum of two tuples
Ø find(t1,t2)              indices of all occurrences of t1 within t2
Ø rand(i)                    create random values from 0..1 (number specified by i)
Ø sgn(a)                    element-wise sign of a tuple
Ø sum(t)                    sum of all elements or string concatenation
Ø cumul(t)                cumulative histogram of a tuple
Ø mean(a)                mean value
Ø deviation(a)          standard deviation
Ø sqrt(a)                    square root of a
Ø deg(a)                    convert radians to degrees
Ø rad(a)                    convert degrees to radians
Ø real(a)                    convert integer to real
Ø int(a)                      convert a real to integer
Ø round(a)                convert real to integer
Ø number(v)            convert string to a number
Ø is_number(v)        test if value is a number
Ø abs(a)                    absolute value of a (integer or real)
Ø fabs(a)                  absolute value of a (always real)
Ø ceil(a)                    smallest integer value not smaller than a
Ø floor(a)                  largest integer value not greater than a
Ø fmod(a1,a2)        fractional part of a1/a2, with the same sign as a1
Ø sort(t)                  sorting in increasing order
Ø uniq(t)                  eliminate duplicates of neighboring values(typically used in combination with sort)
Ø sort_index(t)      return index instead of values
Ø median(t)            Median value of a tuple (numbers)
Ø select_rank(t,v)  Select the element (number) with the given rank
Ø inverse(t)            reverse the order of the values
Ø subset(t1,t2)      selection from t1 by indices in t2
Ø remove(t1,t2)    Remove of values with the given indices
Ø environment(s)  value of an environment variable
Ø ord(a)                  ASCII number of a character
Ø chr(a)                  convert an ASCII number to a character
Ø ords(s)                ASCII number of a tuple of strings
Ø chrt(i)                  convert a tuple of integers into a string
(四)
1) if ... endif / if ... else ... endif / if ... elseif ... else ... endif
2) for ... endfor
3) while ... endwhile
4) repeat ... until(循环体⾄少被执⾏⼀次,直到满⾜条件时退出。等同于C语⾔的do...while语句)
此外,也有关键字 break、continue、return、exit、stop ⽤来控制语句的执⾏;
stop:终⽌后⾯的循环,点击Step Over or Run button继续。
exit:终⽌Hdevelop程序段。
(五)异常处理
异常处理:
try ... catch ... endtry:异常算⼦处理句柄
throw:允许处理⽤户定义的意外情况。
⽤MFC写的,我在捕获异常提时候,都需要在前⾯使⽤HException::InstallHHandler(&CPPExpDefaultExceptionHandler);才能全try{..}catch(HException &except){..} ⽣效
在VC中其实是靠不住的。例如下⾯的代码:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。