在使用Halcon進(jìn)行圖像顯示時(shí)窗口圖像會(huì)閃爍,為了解決這個(gè)問題,Halcon提供了防止閃爍的函數(shù):
即Halcon的系統(tǒng)設(shè)置參數(shù)設(shè)置函數(shù)set_system。
set_system具有參數(shù)值' flush_graphic '設(shè)置為’False’則窗口暫停刷新,將需要顯示的內(nèi)容存放到顯示隊(duì)列中。
當(dāng)繪制完要顯示的內(nèi)容時(shí)將' flush_graphic '設(shè)置為’True’即可將顯示隊(duì)列中的值統(tǒng)一顯示。
該方法確實(shí)在防止單窗口閃爍是非常有效,但是因?yàn)檫@個(gè)參數(shù)的設(shè)置屬于系統(tǒng)級(jí)的,假如我們的系統(tǒng)存在兩個(gè)甚至多個(gè)窗口,且每個(gè)窗口隨機(jī)更新圖像,無法做到每個(gè)每個(gè)窗口同時(shí)更新,則這個(gè)方法就無能為力了。
為了解決多窗口防止閃爍的問題,可以采用雙窗口緩存的辦法。
1)獲取顯示窗口的尺寸
window.GetWindowExtents(out hv_WindowRow, outhv_WindowColumn, out hv_WindowWidth, out hv_WindowHeight);
2)采用Open_Window打開一個(gè)緩沖窗口;
windowBuffer.OpenWindow(hv_WindowRow, hv_WindowColumn,hv_WindowWidth, hv_WindowHeight, 0, "buffer","");
看一下Halcon中關(guān)于這個(gè)函數(shù)的定義:
void HWindow.OpenWindow(int row,int column,int width,int height, HTuple fatherWindow,string mode,string machine)
前四個(gè)參數(shù):int row, int column, int width, int height,為窗口的位置和尺寸;
HTuple fatherWindow:該緩存窗口隸屬的窗口號(hào);
string mode:打開窗口的模式;
'visible':正常的圖像顯示模式
'invisible':顧名思義該窗口是隱藏區(qū),用于后臺(tái)記錄用,不顯示;
'transparent':圖像窗口是透明的,不顯示圖像,但是可以接受鼠標(biāo)信息,可輸出信息;
'buffer':這個(gè)模式也是不顯示的,顯示是需要將結(jié)果復(fù)制到顯示窗口。
string machine:計(jì)算機(jī)名稱,默認(rèn)為空即可
3)將顯示內(nèi)容顯示到緩存窗口;
windowBuffer.SetPart(viewPort.ImagePart.Y,viewPort.ImagePart.X, viewPort.ImagePart.Bottom, viewPort.ImagePart.Right);
SetPart函數(shù)比較簡(jiǎn)單,不在多做介紹。
4)將緩存窗口的可視化結(jié)果復(fù)制到要顯示的窗口中;
windowBuffer.CopyRectangle(window, 0, 0,hv_WindowHeight-1, hv_WindowWidth-1, 0, 0);
該方法采用緩存窗口的方式防止圖像窗口閃爍,避免了采用set_system設(shè)置系統(tǒng)級(jí)參數(shù)導(dǎo)致多窗口顯示不理想的問題。