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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?