在halcon/.net,我們可以用過一個(gè)類的實(shí)例
(instancesofclass)來調(diào)用halcon算子。在halcondotnet引用里,也就是動(dòng)態(tài)鏈接庫(kù)里包許多實(shí)例化一個(gè)類方法,這些
方法可能是重載的,靜態(tài)的halcon算子我們可以直接通過類名來調(diào)用(這些方法包括halcon里所有的算子),而非靜態(tài)的方法必須要通過實(shí)例化一個(gè)類
后才可以使用,通常halcon/.net封裝了一個(gè)類的實(shí)例化方法以及類方法。
例如在c++中,可以使用以下兩種方法:
1.c++(算子模式)
通過代碼導(dǎo)出,以c++為例,默認(rèn)導(dǎo)出為算子型的語(yǔ)法結(jié)構(gòu),而非面向?qū)ο蟮模辉诖四J较拢亢瘮?shù)聲明為全局類型,數(shù)據(jù)類型只需要用hobject、htuple兩類類型進(jìn)行聲明;
2.c++(面向?qū)ο螅?/p>
可以以面向?qū)ο蟮姆绞街貙懘a,也即利用類及類的成員函數(shù);在這種模式下,控制變量的類型仍未htuple,而圖形數(shù)據(jù)可以由多種類型,如himage等;
halcon手冊(cè)建議使用者使用第二種方法。
例如我們使用第二種方法實(shí)現(xiàn)抓取圖像序列(imagesequence)里第一張圖像,并且將他顯示在hwindowcontrol窗口中。代碼是:
[cpp]viewplaincopy
privatehwindowwindow;
privatehframegrabberframegrabber;
privatehimageimg;
window=windowcontrol.halconwindow;
framegrabber=newhframegrabber("file",1,1,0,0,0,0,"default",
-1,"default",-1,"default",
"board/board.seq","default",1,-1);
img=framegrabber.grabimage();
img.dispobj(window);
grabimage算子是通過hframegrabber的實(shí)例來調(diào)用的。如果你是一個(gè)有經(jīng)驗(yàn)的halcon使用者,也許你已經(jīng)看出來hframegrabber的構(gòu)造函數(shù)調(diào)用了openframegraber算子。
但是對(duì)于新手來說,可能剛剛接觸halcon,對(duì)于halcon算子還處于熟悉階段,從hdevelop中直接到出來的代碼也是直接使用靜態(tài)類。那么建議先使用第一種方法,你只需要明白通過hoperatorset這個(gè)類你可以調(diào)用任何一個(gè)halcon算子。
下面我們來看一下到底怎么樣調(diào)用一個(gè)算子。以grabimage算子為例:
[cpp]viewplaincopy
staticvoidhoperatorset.grabimage(outhobjectimage,htupleacqhandle)//靜態(tài)方法直接調(diào)用算子,包含的參數(shù)和halcon算子參數(shù)完全相同
voidhimage.grabimage(hframegrabberacqhandle)//類中封裝的類方法,要先實(shí)例化類后才可以使用
himagehframegrabber.grabimage()//重載的方法
image(output_object).....................................................image;himage
acqhandle(input_control)..........................framegrabber;hframegrabber/htuple
[cpp]viewplaincopy
我們可以看出,算子可以通過三個(gè)類進(jìn)行調(diào)
用:hoperatorset,himage,和hframegrabber。其中第一種通過hoperatorset調(diào)用主要是用在導(dǎo)出的
hdevelop中(如果你導(dǎo)出程序的話就會(huì)看到),也是建議新手使用的方法。而熟悉了之后一般我們?cè)趯懗绦驎r(shí)建議使用另外兩種方式,就像下面這樣進(jìn)行調(diào)
用:
[cpp]viewplaincopy
himageimage1;
himageimage4=newhimage();
hframegrabberframegrabber=
newhframegrabber("file",1,1,0,0,0,0,"default",-1,
"default",-1,"default","board/board.seq","default",-1,-1);
image1=framegrabber.grabimage();
himageimage3=null;
需要注意的是通過
hframegrabber調(diào)用返回方法的值,而通過himage調(diào)用沒有返回值而是調(diào)用的類實(shí)例被修改,也就是himage對(duì)象被修改。通常,調(diào)用類實(shí)
例不會(huì)被一個(gè)算子所修改,除了被上面所看到的“類構(gòu)造器”(constructor-like)算子調(diào)用。
一些算子像countseconds可以當(dāng)做類方法來使用,例如,你可以直接通過類名調(diào)用它們而不用生成一個(gè)實(shí)例:
[cpp]viewplaincopy
doubles1,s2;
s1=hsystem.countseconds();
這是因?yàn)檫@些算子聲明前面都有static關(guān)鍵字:
[cpp]viewplaincopy
staticvoidhoperatorset.countseconds(outhtupleseconds)
staticdoublehsystem.countseconds()
下面我們看一下類的生命周期:從聲明(declaration)到終結(jié)(finalization)
下面的聲明僅僅聲明了一個(gè)類himage的變量,而沒有指向任何的對(duì)象:
[cpp]viewplaincopy
himageimage1;
在這個(gè)語(yǔ)句中,你不能只使用變量直接去調(diào)用算子;有些語(yǔ)言里面甚至不能夠?qū)⑺米鲆粋€(gè)輸出參數(shù)(例如vb2005)。只有先給它一個(gè)圖像對(duì)象,例如:
[cpp]viewplaincopy
image1=framegrabber.grabimage();
你也可以在聲明的時(shí)候初始化一個(gè)變量:
[cpp]viewplaincopy
himageimage2=framegrabber.grabimage();
[cpp]viewplaincopy