回覆列表
  • 1 # 使用者6183888778834

    在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

  • 中秋節和大豐收的關聯?
  • 如何做冬瓜海帶絲?