在Windows操作系統下,句柄代表一個標識符,通常是一個整數,和內存管理機制有關。一般句柄的命名都帶有handle,使用時注意即可。對於Halcon新人而言,往往不注重句柄的清除問題,這類似於C++中new,delete一樣,如果句柄不清除的話,回導致軟件運行過程中占用內存越來越大。
不僅僅Halcon存在句柄,很多開放的SDK都會有句柄,比如說海康相機SDK中的handle代表相機設備句柄,通過句柄可以更改相機的參數
句柄不釋放帶來的內存問題
比如說,剛新建一個halcon項目時,可以看到
for Index := 1 to 100 by 1 dev_open_window (0, 0, 512, 512, 'black', WindowHandle) endfor
打開任務管理器可以看見,在句柄創建之前,Halcon運行內存是68.9,建立了100次窗口句柄之后,運行內存上升到83.3.可能對於工控機來說,這點內存不算什么,但是一個大型項目來說,工控機一般是不停運轉的,如果沒有一個好的halcon管理習慣,會對電腦操作系統帶來巨大傷害。
Halcon中常見的句柄創建及銷毀
halcon的Image等,系統會自己釋放掉,但是句柄需要自己手動釋放。(好消息是halcon18過后版本無需自己手動釋放)
1. 相機句柄
打開相機句柄,需要手動關閉采集設備句柄
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'fabrik', '', 1, 2, FRHandle) ...... ...... close_framegrabber (FRHandle)
2. 模板句柄
開辟了一個模板句柄,需要清除模板句柄
create_shape_model (Image, 'auto', -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID) ...... ...... clear_shape_model (ModelID)
3. 文件句柄
打開文件句柄,需要清除
open_file ('standard', 'output', FileHandle) ...... ...... close_file (FileHandle)
其余的還有測量句柄,深度學習句柄、OCR字符句柄等等。
在halcon程序段中,要特別注意句柄的創建及銷毀。
在大型C++視覺項目中,可以在類的析構函數中增加函數判斷句柄是否銷毀,若沒有銷毀的話,在
析構函數內再執行一遍句柄清除函數。