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

此函數可以讓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)

類似截圖,保存窗體中的圖像。得到的是3通道圖(因爲界面可能五彩繽紛),大小=窗口大小。

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

4、copy_rectangle (WindowHandleBuffer, WindowHandle, 0, 0, Height - 1, Width - 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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章