在使用苏州 Halcon机器视觉进行图像显示时,窗口图像可能会出现闪烁问题。为解决这个问题,Halcon 提供了防止闪烁的函数set_system,通过设置参数值'flush_graphic'为False可以暂停窗口刷新,将需要显示的内容存放到显示队列中,绘制完要显示的内容后再将其设置为True,统一显示显示队列中的值。这个方法在防止单窗口闪烁时非常有效,但如果系统存在两个或多个窗口,且每个窗口随机更新图像,无法做到每个窗口同时更新,这个方法就显得无能为力了。
为了解决多窗口防止闪烁的问题,可以采用双窗口缓存的办法,具体步骤如下:
- 获取显示窗口的尺寸:
使用window.GetWindowExtents(out hv_WindowRow, out hv_WindowColumn, out hv_WindowWidth, out hv_WindowHeight);获取显示窗口的行位置、列位置、宽度和高度。
- 打开一个缓冲窗口:
使用windowBuffer.OpenWindow(hv_WindowRow, hv_WindowColumn, hv_WindowWidth, hv_WindowHeight, 0, "buffer","");打开一个缓冲窗口。在 Halcon 中,OpenWindow函数的定义如下:
- 前四个参数int row, int column, int width, int height为窗口的位置和尺寸。
- HTuple fatherWindow是该缓存窗口隶属的窗口号。
- 'invisible':窗口是隐藏区,用于后台记录用,不显示。
- 'transparent':图像窗口是透明的,不显示图像,但是可以接受鼠标信息,可输出信息。
- 'buffer':这个模式也是不显示的,显示时需要将结果复制到显示窗口。
- string machine是计算机名称,默认为空即可。
- 将显示内容显示到缓存窗口:
使用windowBuffer.SetPart(viewPort.ImagePart.Y, viewPort.ImagePart.X, viewPort.ImagePart.Bottom, viewPort.ImagePart.Right);将显示内容显示到缓存窗口。SetPart函数比较简单,不在此多做介绍。
- 将缓存窗口的可视化结果复制到要显示的窗口中:
使用windowBuffer.CopyRectangle(window, 0, 0, hv_WindowHeight - 1, hv_WindowWidth - 1, 0, 0);将缓存窗口的可视化结果复制到要显示的窗口中。
该方法采用缓存窗口的方式防止图像窗口闪烁,避免了采用set_system设置系统级参数导致多窗口显示不理想的问题。