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