所有的HALCON類,不僅僅HImage,HRegion,HTuple,HFramegrabber等等,還有面向過程的方法中使用的Hobject,都可以使用默認的析構器自動釋放內存。
( see also section 2.4 “Destructors and Halcon Operators”))進一步地,當再一次構造對象,比如通過已經初始化的實例(see section “Constructors and Halcon Operators)調用CreateBarCodeModel,則已經分配好的內存將自動釋放掉,然后再次重新分配。這樣,在HALCON/C++中就沒有必要調用clear_obj。另外,如果你的確調用了它,HALCON會抱怨已經釋放了內存。
然而,仍然有兩種場合需要顯式地管理內存:第一種,見2.1節,string類型的輸出參數,你必須為他們顯式地分配內存。
第二種是當在面向過程的方法中調用句柄時:當創建一個句柄,如使用open_framegrabber內存分配,必須要在程序的末尾通過對應的算子釋放內存,如close_framegrabber.
如何結合面向對象和面向過程的代碼
正如前面說明的那樣,我們推薦盡可能地使用面向對象的編程方法。然而,由于某些原因我們使用了面向過程的方法。比如,如果你想快速整合從HDevelop導出的代碼,此種情況下,你只能通過面向過程的方法。除此之外,當前情況下,某些算子僅僅提供面向過程的方法,如創建仿射變換算子像vector_to_ragid。
圖像化的參數和句柄可以通過如下方式轉換:
將Hobject轉換為圖形化的參數類
Hobject p_image; read_image(&p_image, "barcode/ean13/ean1301");HImage o_image(p_image);
圖形化的參數可以從Hobject轉換成比如HImage,只需簡單調用使用這個過程化的變量作為參數的構造函數即可。
轉換句柄到句柄類
HTuple p_barcode;create_bar_code_model(HTuple(), HTuple(), &p_barcode);HBarCode o_barcode;o_barcode.SetHandle(p_barcode[0]);o_code_region = o_barcode.FindBarCode(o_image, "EAN-13", &result);
句柄不能直接通過構造函數轉換,但是,可以使用SetHandle()轉換。
- 轉換句柄類為句柄
p_barcode = o_barcode.GetHandle();
相似地,一個句柄可以由對應的類通過GetHandle()獲得。你可以忽略這種方法,因此句柄類提供了強制轉換算子,可以自動將其轉換為句柄:
p_barcode=o_barcode;
- 轉換圖形化參數類為Hobject
Hobject p_code_region = o_code_region.Id();
圖形化參數可以從像HRegion這樣的類轉換成Hobject,只需調用方法Id()。
- 轉換HWindow為一個窗口句柄
long p_window;open_window(0, 0, width/2, height/2, 0, "visible", "", &p_window);HWindow o_window(0, 0, 100, 100, 0, "visible", "");p_window = o_window.WindowHandle();disp_obj(p_code_region, p_window);
與其他句柄不同,面向過程的窗口句柄不能轉換為HWindow類的對象!然而,你可以從HWindow通過WindowHandle()提取句柄。
正如章節“析構器和Halcon算子”中所說,你不能將clear_shape_model,clear_all_shape_models,or close_framegrabber和對應的句柄類一起使用。
I/O Streams
自從HALCON 7.1開始,halcon/c++不再提供輸入輸出流算子,因為一些項目想要使用舊的輸入輸出流(即他們想要使用
#include "HalconCpp.h"
using namespace Halcon;
#include "HIOStream.h"
#if !defined(USE_IOSTREAM_H)
using namespace std;
#endif
