zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    工业大数据的理论体系
    我的偶像王坚博士,一位执着的学者!
    云计算遇上区块链,会产生怎样的能量和火花?
    管好超时才能做好异步
    “AliOS之父”——阿里巴巴王坚博士
    Centos7开放及查看端口
    直连不同网段
    实施:帧中继
    网线标准
    以太网的帧结构
  • 原文地址:https://www.cnblogs.com/xixixing/p/14323973.html
Copyright © 2011-2022 走看看