此篇博客希望對您開發界面有幫助,也是對官方自帶案例的理解(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)