1. 程式人生 > >halcon學習筆記——(1)HDevelop language(語法結構特點)

halcon學習筆記——(1)HDevelop language(語法結構特點)

(一)Halcon的語法結構特點

類似於Pascal 與 Visual Basic,大部分的語句是Halcon提供的運算元,此外也包含了少部分的控制語句;

不允許單獨宣告變數;

提供自動的記憶體管理(初始化、析構及OverWrite),但控制代碼則需要顯示釋放;

C++(運算元模式)

通過程式碼匯出,以C++為例,預設匯出為運算元型的語法結構,而非面向物件的;在此模式下,全部函式宣告為全域性型別,資料型別只需要用Hobject、HTuple兩類型別進行宣告;

C++(面向物件)

可以以面向物件的方式重寫程式碼,也即利用類及類的成員函式;

在這種模式下,控制變數的型別仍未HTuple,而圖形資料可以由多種型別,如HImage等;

二、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)Extended Line Description (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開始;控制代碼則可以用來描述窗體、檔案等等,控制代碼不能是常量。

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] 例題: x:=16
y:=9
Result := 10
SqrtY_Result := sqrt(y)
Z:=90/180
Z_Result := sin(Z)
Z_Result:=sin(Z)*sin(y)
Tuple1:=[1,2,3,4,5,6,7,8,9]
insert (Tuple1, 10, 9, OutTuple)
OutTuple[10]:=11
Tuple2:=[12,13,14,15]
Tuple3:=[Tuple1,Tuple2]             //連線成新的陣列
len:=|Tuple3|                           //得到陣列長度
seletevalue:=Tuple3[10]                //選取第i個元素0<= i < |t|
Tuple4:=[]
Tuple4:=Tuple3[1:10] //選取i1到i2的元素
value4:=subset(Tuple4,4)//選取陣列Tuple4中的第i個元素
value5:=remove(value4,4)//去除陣列Tuple4中的第i個元素
stop()
tuple_gen_const (value5, 66, Newtuple)//建立一個具有value5個元素的,每個元素都為66的陣列
tuple:=[]
for i := 1 to 5 by 1
   tuple:=[tuple,i*i] //將i方的值賦給陣列的第i個元素
endfor
stop()

例程:

   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
i := 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:允許處理使用者定義的意外情況。

In the reference manual,operator signatures are visualized in the following way:
operator ( iconic input : iconic output : control input : control output )

在HALCON所有運算元中,變數皆是如上格式,即:影象輸入:影象輸出:控制輸入:控制輸出。

其中四個引數任意一個可以為空。

控制輸入可以是變數、常量、表示式;

控制輸出以及影象輸入和輸出必須是變數。

1.caltab_points:從標定板中讀取marks中心座標,該座標值是標定板座標系統裡的座標值,該座標系統以標定板為參照,向右為X正,下為Y正,垂直標定板向下為Z正。該運算元控制輸出為標定板中心3D座標。

2.create_calib_data:建立Halcon標定資料模型。輸出一個輸出資料模型控制代碼。

3.set_calib_data_cam_param:設定相機標定資料模型中設定相機引數的原始值和型別。設定索引,型別,以及相機的原始內參數等。

4.set_calib_data_calib_object:在標定模型中設定標定物件。設定標定物件控制代碼索引,標定板座標點儲存地址。

5.find_caltab:分割出影象中的標準標定板區域。輸出為標準的標定區域,控制

6.find_marks_and_pose:抽取標定點並計算相機的內參數。輸出MARKS座標陣列,以及估算的相機外引數。

即標定板在相機座標系中的位姿,由3個平移量和3個旋轉量構成。

7.set_calib_data_observ_points( : : CalibDataID, CameraIdx, CalibObjIdx,CalibObjPoseIdx, Row, Column, Index, Pose : )

收集運算元6的標定資料,將標定資料儲存在標定資料模型中。輸入控制分別為標定資料模型控制代碼,相機索引,標定板索引,位姿索引,行列座標,位姿。

8.calibrate_cameras( : : CalibDataID : Error) 標定一臺或多臺相機,依據CalibDataID中的資料。控制輸出平均誤差。

9.get_calib_data( : : CalibDataID, ItemType, ItemIdx, DataName : DataValue) 獲得標定資料。

依靠索引號和資料名稱來返回輸出的資料值。可查詢與模型相關的資料,與相機相關的資料(包括相機的內外引數等),與標定物件相關的資料,與標定物件的姿態相關的資料。控制輸出是要查詢的標定資料。

如:

get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam) //查詢相機的位姿

get_calib_data (CalibDataID, 'calib_obj_pose', [0, NumImage], 'pose', Pose) //查詢標定板位姿

10.write_cam_par( : : CameraParam, CamParFile : ) 記錄相機的內參數,輸入控制為內參數,輸出控制為

存取相機內參數的檔名。

11.set_origin_pose( : : PoseIn, DX, DY, DZ : PoseNewOrigin)

設定新的座標原點,控制輸入為原始的位姿和沿著世界座標系的三個座標軸的平移量,控制輸出為新的位姿。