2.4 內(nèi)存管理

所有的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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,810評(píng)論 11 349
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛(ài)閱讀 2,251評(píng)論 0 7
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,068評(píng)論 25 709
  • 又到周末了,今天做了一天的實(shí)驗(yàn)。貝諾酯的合成,實(shí)驗(yàn)很失敗。哎!重在參與吧。 明天周六任務(wù):藥劑學(xué)第三章表面活性劑;...
    c28369096728閱讀 292評(píng)論 0 0
  • 老師評(píng)語(yǔ):雖然和我的顏色不一樣但是不要緊。第一:陰天的效果有,天亮底暗;第二:天偏藍(lán)灰色,地面偏紫顏色,綠顏色,地...
    獨(dú)尊孤鷹閱讀 198評(píng)論 0 0

友情鏈接更多精彩內(nèi)容