
實例一(3d_coordinates.hdev):
for I := 1 to NumImages by 1
read_image (Image, 'calib/calib-3d-coord-'+I$'02d')——C:\Program Files\MVTec\HALCON-10.0\images\的calib文件夾中開頭是calib-3d-coord-的圖像。I$'02d'表示后面的數字是兩位數,即0+‘I’。
實例二(3d_position_of_circles.hdev):
Dir := 'metal-parts'
for I := 1 to 5 by 1
?read_image (Image, Dir + '/work_sheet_'+ I$'.2')
實例三(autobahn.hdev):
for i := 0 to 28 by 1
? ? read_image (ActualImage, 'autobahn/scene_'+(i$'02'))
實例四(ball_seq.hdev):
ImageNames := 'die/'+['die_02','die_03','die_04','die_07']
read_image (Bond, ImageNames[0])
我把ImageNames[0]中的的0換成1讀出的第一張圖片就是die_03.png;換成2讀出的第一張圖片就是die_04.png;換成3讀出的第一張圖片是die_07.png。剛好與['die_02','die_03','die_04','die_07']里面的相對應。
實例五:
7.5.1???General Features of Tuple Operations——元組操作的一般特征
請注意,在所有以下表變量和常數已通過字母表示允許的數據類型取代。這些字母提供有關可能的限制,定義區域。字母和它們的意義列于表7.3。對這些符號的操作只能應用于指定的類型參數或表達式,返回一個結果。
符號名稱i, a, l和s原子可以表示元組(元組長度為1)以及任意長度的元組。
integer:整數 ? ? ? arithmetic:算法 ? ? ? ?boolean:布爾體系 ? ? ? atomic:原子的
操作通常假設原子元組描述。如果數組包含多個元素,大多數操作的工作方式如下:
1、如果一個元組的長度為1,其他的元組中的所有元素相結合,與所選擇的操作該單一值;
如果兩個元組具有的長度大于1,這兩個元組必須具有相同的長度(否則會發生運行時錯誤)。在這種情況下,所選擇的操作適用于所有具有2、相同索引的元素。由此產生的元組的長度是相同的輸入元組的長度;
3、如果一個元組的長度為0([]),運行時錯誤發生。
在表7.4中,你可以找到一些例子進行算術運算元組。要特別注意的順序執行字符串串聯。 HDevelop基本的算術運算符號是+, - ,*,/。 但+是一種二態操作,請注意:如果兩個操作數都是數字,它增加了數字。如果至少有一個操作數是一個字符串,它連接兩個操作數為字符串。
7.5.2???Assignment——任務
HDevelop ,assignment就是一個操作。要使用assignment,你必須用(Input, Result)的形式。這個操作符具有以下語義:?Input?(assignment的右側) ,并將其存儲在Result(assignment的左側)中 。然而,在程序文本中的分配代表賦值運算符通常的語法為Result := Input。下面的例子概括assignment在HDevelop與 C的語法和轉換版本之間的差異:
分配在C語法
u = sin(x) + cos(y)
HDevelop使用賦值運算符中定義
assign(sin(x) + cos(y), u)
這是在程序窗口中顯示
u := sin(x) + cos(y)
如果該表達式的結果并不需要被存儲到一個變量中,可以直接使用表達式的任何運算符作為輸入值。但只要所得值需要多次使用或變量必須初始化就要用assignment(例如,一個循環)。
第二個賦值運算符是 insert(Input, Value, Index, Result)?。它被用來分配的元組元素。如果第一個輸入參數,和第一輸出參數是相同的,該呼叫
insert (Areas, Area, Radius-1, Areas)
作為一個操作調用的程序文本中未顯示,但在更直觀的形式為:
Areas[Radius-1] := Area
舉一個例子:
assign([1,2,3], Area)
assign(9, Areas)
insert(Areas, Area, 1, Areas)
設置Areas為[ 1,9,3 ]?
為了通過insert構造一個元組,通常是一個空的元組作為初始值,并在一個循環中插入元素:
Tuple := []
for i := 0 to 5 by 1
Tuple[i] := sqrt(real(i))
endfor
正如你可以看到的例子,一個元組的指數從0開始。一個元組的一個插入,也可以以下列方式添加到元組的`back'或'front'。元組串聯操作,可以用上逗號‘,’。在這里,操作assign 可用下面的代替:
?assign([Tuple,NewVal],Tuple)轉換為? Tuple := [Tuple,NewVal]
如果索引的位置是介于兩者之間,已使用插入操作。它需要輸入以下參數:首先應插入新值的元組,然后將新值作為第三個輸入參數的索引位置。得到的結果(第四個參數)與輸入的元組幾乎是相同的,除了上面的定義的索引位置的新值(見上面的例子)。
在下面的示例中,區域通過圓擴張,并和之后的區域被存儲到元組區。在這種情況下,插入操作被使用。
? read_image (Mreut, 'mreut')
? threshold (Mreut, Region, 190, 255)
? Areas := []
? for Radius := 1 to 50 by 1
? dilation_circle (Region, RegionDilation, Radius)
? area_center (RegionDilation, Area, Row, Column)
? Areas[Radius-1] := Area
? endfor
請注意,第一,變量區域必須進行初始化,以避免運行時錯誤。在這個例子中地區被初始化為空的元組([]) 。而不是插入操作分配與元組串聯
?Areas := [Areas,Area]
可以使用,因為該元素附加在后面的元組中。更多的例子可以在程序assign.dev中發現?。
7.5.3???Basic Tuple Operations——基本元組操作
?一個基本的元組操作可選擇一個或多個值,結合元組(級聯)或得到的元素數(見表7.5作業對含有控制數據的元組)。注意:[[t]] = [t] = t
|t|返回一個元組元素的數目。從零到元素數減一的元素范圍的指標(即|t|-1)。因此,選擇指數必須在此范圍內。(請注意對象的指標(例如,select_obj)從1到元素的編號范圍。)
Tuple := [V1,V2,V3,V4]
for i := 0 to |Tuple|-1 by 1
fwrite_string (FileHandle,Tuple[i]+'\n')
endfor
在下面的例子中,該變量包含[2,2,3,'a','a',2,3,'b','b']:
請注意,這些直接操作不能用于標志性的元組,即,標志性的對象不能從一個元組使用[ ],其數量不能使用| |直接測定。然而,為了這個目的,HALCON操作提供執行相應的任務。表7.6中你可以看到元組操作控制數據的工作(這是通過assign or insert)。表中符號t表示控制元組,符號p和q代表符號元組。
7.5.4???Tuple Creation——元組創建
? assign ([],empty_tuple) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?empty:=[]
? assign (4711,one_integer) ? ? ? ? ? ? ? ? ? ? ? ? 顯示為 ? ? ? ? ? ? ? ? ? ? ? ? ?one_integer := 4711
? assign ([4711,0.815],two_numbers) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?two_numbers := [4711,0.815]
assign ([],tuple) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???tuple := []
for (1,100,1,i) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?顯示為 ? ? ? ? ? ? ? ? ? ? ? ? ??for i := 1 to 100 by 1
assign ([tuple,4711],tuple) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?tuple := [tuple,4711]
endfor ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???endfor
因為這不是很方便的一個特殊功能稱為gen_tuple_const是可構造一個元組,一個給定的長度,其中每個元素具有相同的值。使用此功能,從上面的程序被簡化為:
assign(gen_tuple_const(100,4711),tuple) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 顯示為 ? ? ? ? ? ? ? tuple := gen_tuple_const(100,4711)
如果我們要構建一個元組相同的長度為一個給定的元組得到一個簡單的解決方案有兩種方法,第一種是基于gen_tuple_const
assign(gen_tuple_const(|tuple_old|,4711),tuple_new) ? ? ? ? ? ? 顯示為 ? ? ? ? ? ? ? ?tuple_new := gen_tuple_const(|tuple_old|,4711)
第二個是有點棘手,使用算術運算功能:
assign((tuple_old * 0) + 4711,tuple_new) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 顯示為 ? ? ? ? ? ? ? ?tuple_new := (tuple_old * 0) + 4711
在這里,我們得到第一個元組具有相同的長度與每一個元素設置為零。然后,我們添加常數的每個元素。在具有不同值的元組的情況下,我們必須使用循環版本的值分配到每個位置:
assign([],tuple)
for (1,100,1,i)
assign([tuple,i*i],tuple)
endfor
which is displayed as
tuple := []
for i := 1 to 100 by 1
tuple := [tuple,i*i]
endfor
在這個例子中,我們構造一個元組,從12到1002的平方值。
7.5.5???Basic Arithmetic Operations——基本算術運算
提供基本的算術運算的概述,請參閱表7.7。所有的操作都是左結合的,除了右結合元負運算符。賦值通常是從左至右進行。但是,括號可以改變賦值的順序和一些操作有比別人更高的優先級(參見“7.5.14”)
HDevelop中的算術運算符合通常的定義。表達式可以有任意數量的括號。
除法運算符(A1/ A2)可以應用到整數以及實數。如果其結果是實數類型,則至少有一個操作數是實數類型。如果兩個操作數都是整數類型,操作是一個整數除法。其它的算術運算符(乘法,加法,減法,和否定),可以適用于任一整數或實數。如果至少有一個操作數是實數,其結果將是一個實數。示例:
例子可以在arithmetic.dev中找到
7.5.6???Bit Operations——位操作
?本節介紹了用于處理位數字的操作。運算數必須是整數。
7.5.7???String Operations——字串操作
有幾個字符串操作,可修改,選擇,和組合字符串。此外,有些操作允許轉換成數字(實數和整數)為字符串。
concatenate:聯系、連接 ? ? ? ? ? ? ? ?substring:子鏈 ? ? ? ? ? ? ? ? ? ? ??? ?
$將數字轉換為字符串或修改字符串。操作有兩個操作數:第一個($左邊)是數字,已被轉換。第二個($右邊)指定的轉換。這是類似于C語言編程的printf()函數格式字符串。這個格式字符串由以下四個部分組成
?:
<flags><width>.<precision><conversion>?這個也可以用[-+ #]?([0-9]+)?(\.[0-9]*)?[doxXfeEgGsb]?表示
(這大致可以轉換為零或更多的字符在第一支架對后跟零個或更多位數,任選一個點可以跟著數字后跟從最后一架雙轉換字符)
<flags>
零個或多個標記,以任何順序,它修改的轉換規格的意義。旗標可以包含下列字符:
—:轉換的結果是左對齊的領域內。
+:一個符號轉換的結果總是開始于一個標志,+或—。
<space>:如果一個符號轉換的第一個字符是不是一個符號,空格是r前綴
?#該值將轉換為“交替形式”。d和s(見下文)的轉換,這標志是無效。o轉換(見下文),它增加了精密力結果的第一個數字是零。x或X轉換(見下文),一個非零的結果有0x或0X做前綴。e,E,f,g,G轉換,結果總是包含一個基數字符。g和G轉換,尾隨零不是從結果中刪除,相反,與平常不同。
<width>
指定一個最小字段寬度的小數位數的可選字符串。一個輸出字段,如果轉換后的值的字符比字段寬度減少,它是在左邊(或右,如果左調整標志了)的字段寬度。
<precision>
字符串串聯(+)可以應用于字符串或數值類型組合;如有必要,先被轉化成字符串運算數(根據他們的標準表示)。至少一個操作數必須是一個字符串,已經使操作者可以作為一個字符串的concatenator。在下面的例子中的一個文件的名稱(例如'Name5.tiff')。為了這個目的,兩個字符串常量('name' '和'tiff’)和一個整數(循環指數i)連接:
for i := 1 to 5 by 1
read_image (Image, 'Name'+i+'.tiff')
endfor
7.5.8???Comparison Operations——比較運算
?7.5.9???Boolean Operations——布爾運算
?布爾運算and, xor, or,以及not(和、異、或,否)只是長度的1元組定義。7.5.10???Trigonometric Functions——三角函數
7.5.12???Numerical Functions——數值計算功能
7.5.13???Miscellaneous Functions——雜項功能
random:任意、隨機?? ? ? ? inverse:倒轉、相反 ? ? ? ? ? ?ord——order ? ? ? ? ? ? ? ? ? ? ? ?chr——character
chrt——CHR+Tuple ? ? ? ? ??rand——random ? ? ? ? ? ? ? ? ?sort:排列 ? ? ? ? ? ? ? ? ? ? ? ? ? ?reverse:反轉、調換 ? ? ??
7.5.14???Operation Precedence——運算優先級
原文鏈接:http://k594081130.blog.163.com/blog/static/21835901320138923731316/