halcon的有形窗口(普通窗口)与无形窗口(buffer窗口)

此篇博客希望对您开发界面有帮助,也是对官方自带案例的理解(C:\Users\Public\Documents\MVTec\HALCON-18.11-Progress\examples\cpp\qt\Matching)。

open_window (0, 0, Width, Height, 0, 'visible', '', WindowHandle)
open_window (0, 0, Width, Height, 0, 'buffer', '', WindowHandleBuffer)

buffer窗口是不可见的,在缓存中。其参数中的3个0是无意义无效的。

与窗口有关的函数,buffer窗口与普通窗口可以无差别使用。

【有关函数】

1、flush_buffer (WindowHandle) 与 set_window_param (WindowHandle, 'flush', 'false')成对使用。可以让多次disp_obj的图一次性显示出来,而不是每disp_obj一次显示一次。

举例:

set_window_param (WindowHandle, 'flush', 'false') //默认true,即每个disp_obj都被显示
disp_obj你想展示的图(可能多次disp_obj)
flush_buffer (WindowHandle)    //到此,所有disp_obj的图一次性全部显示

2、set_window_param (WindowHandle, 'graphics_stack', 'true'),默认false。强烈推荐在界面开发中设置为true。

功能一:打开图形堆栈,使图像和区域保持,即使缩放或调整。如果false,那么展示图像的控件尺寸发生变化时,图像会消失。

功能二:此函数可以让disp_obj之后的set_part直接把结果展示在窗口,而不需要每set_part一次就disp_obj一次。也就是官方讲解的“移动和缩放”可能会用到此函数设置。

当然,你可以每set_part一次就disp_obj一次,那么这个函数可以省略不用,true、false一样。

举例:

read_image (Image, 'mreut')
get_image_size (Image, Width, Height)
dev_close_window ()
open_window (0, 0, Width, Height, 0, 'visible', '', WindowHandle)
set_window_param (WindowHandle, 'graphics_stack', 'true')
set_part (WindowHandle, 0, 0, Height - 1, Width - 1)    //原图的全部,显示在窗体中。图适应窗体
disp_obj (Image, WindowHandle)    //显示
set_part (WindowHandle, 0, 0, (Height - 1)/2, (Width - 1)/2)    // disp_obj之后的set_part立即生效,展示在窗体中。即窗口会看到图的1/4
set_part (WindowHandle, 0, 0, (Height - 1)/4, (Width - 1)/4)    //1/16

3、dump_window_image (Image1, WindowHandle),等效于copy_rectangle (WindowHandleBuffer, WindowHandle, 0, 0, 窗中图高- 1, 窗中图宽- 1, 0, 0)

保存“窗中图”。得到的是3通道图(因为界面可能五彩缤纷),大小不一定等于窗口大小,因为窗中图是图像坐标系尺寸,窗口是电脑桌面坐标系尺寸。

此处可以理解2中“直接把结果展示在窗口”的用处了。

4、copy_rectangle (WindowHandleBuffer, WindowHandle, 0, 0, 窗中图高- 1, 窗中图宽- 1, 0, 0)

把buffer窗口中指定区域的图像像素复制到普通窗口。

注意有三个尺寸:指定区域、buffer窗口、普通窗口

这三个之间的尺寸大小关系没有要求。也就是说指定区域可以大于buffer窗口,不报错。

普通窗口只呈现自己尺寸容纳的像素,不够就补0,多了就只要自己尺寸的那部分像素。

复制的像素从左上角开始往普通窗口中粘。

比如:普通窗口512*512,buffer窗口1024*1024

指定区域超过512*512,则普通窗口只复制buffer窗口512*512的像素

指定区域小于512*512,则普通窗口只复制buffer窗口中指定区域的像素,不够补0。

5、clear_window (WindowHandleBuffer)

注意养成清理窗口的好习惯,否则保存出来的可能有很多历史痕迹。

disp_obj (Image, WindowHandleBuffer)前清空窗口
copy_rectangle (WindowHandleBuffer, WindowHandle, 50, 50, 250, 250, 0, 0)前清空窗口

【代码案例】

************** 1、读图
read_image (Image, 'mreut')
get_image_size (Image, Width, Height)
dev_close_window ()
************** 2、打开有形窗口
open_window (0, 0, Width, Height, 0, 'visible', '', WindowHandle)
set_window_param (WindowHandle, 'graphics_stack', 'false')
************** 3、打开无形窗口,设置显示参数
open_window (0, 0, Width*2, Height*2, 0, 'buffer', '', WindowHandleBuffer)
set_color (WindowHandleBuffer, 'red')
set_draw (WindowHandleBuffer, 'margin')
set_part (WindowHandleBuffer, 0, 0, Height - 1, Width - 1)
************** 4、对图像进行处理
threshold (Image, Regions, 0, 110)
************** 5、缓存到无形窗口
clear_window (WindowHandleBuffer)
set_window_param (WindowHandleBuffer, 'flush', 'false')
disp_obj (Image, WindowHandleBuffer)
disp_obj (Regions, WindowHandleBuffer)
flush_buffer (WindowHandleBuffer)
************** 6、从无形窗口展示到有形窗口,或者直接保存出来
clear_window (WindowHandle)
copy_rectangle (WindowHandleBuffer, WindowHandle, 50, 50, 250, 250, 0, 0)
dump_window_image (Image1, WindowHandleBuffer)
dump_window_image (Image2, WindowHandle)

 

posted @ 2021-01-25 10:39  夕西行  阅读(2063)  评论(0编辑  收藏  举报