所有的HALCON類,不僅僅HImage,HRegion,HTuple,HFramegrabber等等,還有面向過(guò)程的方法中使用的Hobject,都可以使用默認(rèn)的析構(gòu)器自動(dòng)釋放內(nèi)存。
( see also section 2.4 “Destructors and Halcon Operators”))進(jìn)一步地,當(dāng)再一次構(gòu)造對(duì)象,比如通過(guò)已經(jīng)初始化的實(shí)例(see section “Constructors and Halcon Operators)調(diào)用CreateBarCodeModel,則已經(jīng)分配好的內(nèi)存將自動(dòng)釋放掉,然后再次重新分配。這樣,在HALCON/C++中就沒(méi)有必要調(diào)用clear_obj。另外,如果你的確調(diào)用了它,HALCON會(huì)抱怨已經(jīng)釋放了內(nèi)存。
然而,仍然有兩種場(chǎng)合需要顯式地管理內(nèi)存:第一種,見2.1節(jié),string類型的輸出參數(shù),你必須為他們顯式地分配內(nèi)存。
第二種是當(dāng)在面向過(guò)程的方法中調(diào)用句柄時(shí):當(dāng)創(chuàng)建一個(gè)句柄,如使用open_framegrabber內(nèi)存分配,必須要在程序的末尾通過(guò)對(duì)應(yīng)的算子釋放內(nèi)存,如close_framegrabber.
2.5 如何結(jié)合面向?qū)ο蠛兔嫦蜻^(guò)程的代碼
正如前面說(shuō)明的那樣,我們推薦盡可能地使用面向?qū)ο蟮木幊谭椒?。然而,由于某些原因我們使用了面向過(guò)程的方法。比如,如果你想快速整合從HDevelop導(dǎo)出的代碼,此種情況下,你只能通過(guò)面向過(guò)程的方法。除此之外,當(dāng)前情況下,某些算子僅僅提供面向過(guò)程的方法,如創(chuàng)建仿射變換算子像vector_to_ragid。
圖像化的參數(shù)和句柄可以通過(guò)如下方式轉(zhuǎn)換:
- 將Hobject轉(zhuǎn)換為圖形化的參數(shù)類
Hobject p_image;
read_image(&p_image, "barcode/ean13/ean1301");
HImage o_image(p_image);
圖形化的參數(shù)可以從Hobject轉(zhuǎn)換成比如HImage,只需簡(jiǎn)單調(diào)用使用這個(gè)過(guò)程化的變量作為參數(shù)的構(gòu)造函數(shù)即可。
- 轉(zhuǎn)換句柄到句柄類
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);
句柄不能直接通過(guò)構(gòu)造函數(shù)轉(zhuǎn)換,但是,可以使用SetHandle()轉(zhuǎn)換。
- 轉(zhuǎn)換句柄類為句柄
p_barcode = o_barcode.GetHandle();
相似地,一個(gè)句柄可以由對(duì)應(yīng)的類通過(guò)GetHandle()獲得。你可以忽略這種方法,因此句柄類提供了強(qiáng)制轉(zhuǎn)換算子,可以自動(dòng)將其轉(zhuǎn)換為句柄:
p_barcode=o_barcode;
- 轉(zhuǎn)換圖形化參數(shù)類為Hobject
Hobject p_code_region = o_code_region.Id();
圖形化參數(shù)可以從像HRegion這樣的類轉(zhuǎn)換成Hobject,只需調(diào)用方法Id()。
- 轉(zhuǎn)換HWindow為一個(gè)窗口句柄
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);
與其他句柄不同,面向過(guò)程的窗口句柄不能轉(zhuǎn)換為HWindow類的對(duì)象!然而,你可以從HWindow通過(guò)WindowHandle()提取句柄。
正如章節(jié)“析構(gòu)器和Halcon算子”中所說(shuō),你不能將clear_shape_model,clear_all_shape_models,or close_framegrabber和對(duì)應(yīng)的句柄類一起使用。
2.6 I/O Streams
自從HALCON 7.1開始,halcon/c++不再提供輸入輸出流算子,因?yàn)橐恍╉?xiàng)目想要使用舊的輸入輸出流(即他們想要使用<iostream.h>而不是<iostream>)。
為了向后兼容,對(duì)于HTuple的IO算子被提供為內(nèi)聯(lián)函數(shù),存在于頭文件HIOStream.h.HIOStream.h默認(rèn)使用新的接口<iostream>,但是如果USE_IOSTREAM_H在HIOStream.h之前被包含,則使用舊的版本<iostream.h>.注意,包含using namespace std;可能是必須的。
為了使用IO流,我們推薦在HalconCpp.h后插入如下幾行:
#include "HalconCpp.h"
using namespace Halcon;
#include "HIOStream.h"
#if !defined(USE_IOSTREAM_H)
using namespace std;
#endif