在使用Halcon进行图像显示时窗口图像会闪烁,为了解决这个问题,Halcon提供了防止闪烁的函数:
即Halcon的系统设置参数设置函数set_system。
set_system具有参数值' flush_graphic '设置为’False’则窗口暂停刷新,将需要显示的内容存放到显示队列中。
当绘制完要显示的内容时将' flush_graphic '设置为’True’即可将显示队列中的值统一显示。
该方法确实在防止单窗口闪烁是非常有效,但是因为这个参数的设置属于系统级的,假如我们的系统存在两个甚至多个窗口,且每个窗口随机更新图像,无法做到每个每个窗口同时更新,则这个方法就无能为力了。
为了解决多窗口防止闪烁的问题,可以采用双窗口缓存的办法。
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中关于这个函数的定义:
void HWindow.OpenWindow(int row,int column,int width,int height, HTuple fatherWindow,string mode,string machine)
前四个参数:int row, int column, int width, int height,为窗口的位置和尺寸;
HTuple fatherWindow:该缓存窗口隶属的窗口号;
string mode:打开窗口的模式;
'visible':正常的图像显示模式
'invisible':顾名思义该窗口是隐藏区,用于后台记录用,不显示;
'transparent':图像窗口是透明的,不显示图像,但是可以接受鼠标信息,可输出信息;
'buffer':这个模式也是不显示的,显示是需要将结果复制到显示窗口。
string machine:计算机名称,默认为空即可
3)将显示内容显示到缓存窗口;
windowBuffer.SetPart(viewPort.ImagePart.Y,viewPort.ImagePart.X, viewPort.ImagePart.Bottom, viewPort.ImagePart.Right);
SetPart函数比较简单,不在多做介绍。
4)将缓存窗口的可视化结果复制到要显示的窗口中;
windowBuffer.CopyRectangle(window, 0, 0,hv_WindowHeight-1, hv_WindowWidth-1, 0, 0);
该方法采用缓存窗口的方式防止图像窗口闪烁,避免了采用set_system设置系统级参数导致多窗口显示不理想的问题。