在halcon/.net,我們可以用過一個類的例項
(instancesofclass)來呼叫halcon運算元。在halcondotnet引用裡,也就是動態連結庫裡包許多例項化一個類方法,這些
方法可能是過載的,靜態的halcon運算元我們可以直接透過類名來呼叫(這些方法包括halcon裡所有的運算元),而非靜態的方法必須要透過例項化一個類
後才可以使用,通常halcon/.net封裝了一個類的例項化方法以及類方法。
例如在c++中,可以使用以下兩種方法:
1.c++(運算元模式)
透過程式碼匯出,以c++為例,預設匯出為運算元型的語法結構,而非面向物件的;在此模式下,全部函式宣告為全域性型別,資料型別只需要用hobject、htuple兩類型別進行宣告;
2.c++(面向物件)
可以以面向物件的方式重寫程式碼,也即利用類及類的成員函式;在這種模式下,控制變數的型別仍未htuple,而圖形資料可以由多種型別,如himage等;
halcon手冊建議使用者使用第二種方法。
例如我們使用第二種方法實現抓取影象序列(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的例項來呼叫的。如果你是一個有經驗的halcon使用者,也許你已經看出來hframegrabber的建構函式呼叫了openframegraber運算元。
但是對於新手來說,可能剛剛接觸halcon,對於halcon運算元還處於熟悉階段,從hdevelop中直接到出來的程式碼也是直接使用靜態類。那麼建議先使用第一種方法,你只需要明白透過hoperatorset這個類你可以呼叫任何一個halcon運算元。
下面我們來看一下到底怎麼樣呼叫一個運算元。以grabimage運算元為例:
staticvoidhoperatorset.grabimage(outhobjectimage,htupleacqhandle)//靜態方法直接呼叫運算元,包含的引數和halcon運算元引數完全相同
voidhimage.grabimage(hframegrabberacqhandle)//類中封裝的類方法,要先例項化類後才可以使用
himagehframegrabber.grabimage()//過載的方法
image(output_object).....................................................image;himage
acqhandle(input_control)..........................framegrabber;hframegrabber/htuple
我們可以看出,運算元可以透過三個類進行調
用:hoperatorset,himage,和hframegrabber。其中第一種透過hoperatorset呼叫主要是用在匯出的
hdevelop中(如果你匯出程式的話就會看到),也是建議新手使用的方法。而熟悉了之後一般我們在寫程式時建議使用另外兩種方式,就像下面這樣進行調
用:
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呼叫返回方法的值,而透過himage呼叫沒有返回值而是呼叫的類例項被修改,也就是himage物件被修改。通常,呼叫類實
例不會被一個運算元所修改,除了被上面所看到的“類構造器”(constructor-like)運算元呼叫。
一些運算元像countseconds可以當做類方法來使用,例如,你可以直接透過類名呼叫它們而不用生成一個例項:
doubles1,s2;
s1=hsystem.countseconds();
這是因為這些運算元宣告前面都有static關鍵字:
staticvoidhoperatorset.countseconds(outhtupleseconds)
staticdoublehsystem.countseconds()
下面我們看一下類的生命週期:從宣告(declaration)到終結(finalization)
下面的宣告僅僅聲明瞭一個類himage的變數,而沒有指向任何的物件:
在這個語句中,你不能只使用變數直接去呼叫運算元;有些語言裡面甚至不能夠將它用做一個輸出引數(例如vb2005)。只有先給它一個影象物件,例如:
你也可以在宣告的時候初始化一個變數:
himageimage2=framegrabber.grabimage();
在halcon/.net,我們可以用過一個類的例項
(instancesofclass)來呼叫halcon運算元。在halcondotnet引用裡,也就是動態連結庫裡包許多例項化一個類方法,這些
方法可能是過載的,靜態的halcon運算元我們可以直接透過類名來呼叫(這些方法包括halcon裡所有的運算元),而非靜態的方法必須要透過例項化一個類
後才可以使用,通常halcon/.net封裝了一個類的例項化方法以及類方法。
例如在c++中,可以使用以下兩種方法:
1.c++(運算元模式)
透過程式碼匯出,以c++為例,預設匯出為運算元型的語法結構,而非面向物件的;在此模式下,全部函式宣告為全域性型別,資料型別只需要用hobject、htuple兩類型別進行宣告;
2.c++(面向物件)
可以以面向物件的方式重寫程式碼,也即利用類及類的成員函式;在這種模式下,控制變數的型別仍未htuple,而圖形資料可以由多種型別,如himage等;
halcon手冊建議使用者使用第二種方法。
例如我們使用第二種方法實現抓取影象序列(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的例項來呼叫的。如果你是一個有經驗的halcon使用者,也許你已經看出來hframegrabber的建構函式呼叫了openframegraber運算元。
但是對於新手來說,可能剛剛接觸halcon,對於halcon運算元還處於熟悉階段,從hdevelop中直接到出來的程式碼也是直接使用靜態類。那麼建議先使用第一種方法,你只需要明白透過hoperatorset這個類你可以呼叫任何一個halcon運算元。
下面我們來看一下到底怎麼樣呼叫一個運算元。以grabimage運算元為例:
[cpp]viewplaincopy
staticvoidhoperatorset.grabimage(outhobjectimage,htupleacqhandle)//靜態方法直接呼叫運算元,包含的引數和halcon運算元引數完全相同
voidhimage.grabimage(hframegrabberacqhandle)//類中封裝的類方法,要先例項化類後才可以使用
himagehframegrabber.grabimage()//過載的方法
image(output_object).....................................................image;himage
acqhandle(input_control)..........................framegrabber;hframegrabber/htuple
[cpp]viewplaincopy
我們可以看出,運算元可以透過三個類進行調
用:hoperatorset,himage,和hframegrabber。其中第一種透過hoperatorset呼叫主要是用在匯出的
hdevelop中(如果你匯出程式的話就會看到),也是建議新手使用的方法。而熟悉了之後一般我們在寫程式時建議使用另外兩種方式,就像下面這樣進行調
用:
[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呼叫返回方法的值,而透過himage呼叫沒有返回值而是呼叫的類例項被修改,也就是himage物件被修改。通常,呼叫類實
例不會被一個運算元所修改,除了被上面所看到的“類構造器”(constructor-like)運算元呼叫。
一些運算元像countseconds可以當做類方法來使用,例如,你可以直接透過類名呼叫它們而不用生成一個例項:
[cpp]viewplaincopy
doubles1,s2;
s1=hsystem.countseconds();
這是因為這些運算元宣告前面都有static關鍵字:
[cpp]viewplaincopy
staticvoidhoperatorset.countseconds(outhtupleseconds)
staticdoublehsystem.countseconds()
下面我們看一下類的生命週期:從宣告(declaration)到終結(finalization)
下面的宣告僅僅聲明瞭一個類himage的變數,而沒有指向任何的物件:
[cpp]viewplaincopy
himageimage1;
在這個語句中,你不能只使用變數直接去呼叫運算元;有些語言裡面甚至不能夠將它用做一個輸出引數(例如vb2005)。只有先給它一個影象物件,例如:
[cpp]viewplaincopy
image1=framegrabber.grabimage();
你也可以在宣告的時候初始化一個變數:
[cpp]viewplaincopy
himageimage2=framegrabber.grabimage();
[cpp]viewplaincopy