2.3 構造函數(shù)與Halcon算子

Halcon/C++提供了構造函數(shù)栅屏,主要基于適合的Halcon算子膀懈。比如說HImage和HBarCode基于read_image and create_bar_code_model称杨。

請注意當前的Halcon版本針對不同的算子構造函數(shù)的功能不同硝烂。如下我們介紹了一些最常用的Halcon算子奔脐,而一個完整的構造函數(shù)列表可以在%HALCONROOT%\include\cpp中找到测萎。

  • Images:

HImage基于算子read_image,gen_image1,gen_image1_extern,and gen_image_const提供了構造器闹伪。

在通過HImage使用其構造函數(shù)時請注意以下的陷阱:與直覺正好相反沪铭,該算子并不能修改調用它的實例,相反偏瓤,被創(chuàng)建好的圖像需要通過算子返回值返回杀怠。這樣,我們看如下的代碼厅克,事實上并沒有初始化圖像.

HImage image;
image.ReadImage("barcode/ean13/ean1301"); // incorrect

正確的方法是:

image = HImage::ReadImage("barcode/ean13/ean1301"); // correct

從上面可以看出ReadImage是靜態(tài)成員函數(shù)赔退。
注意: HImage作為輸出參數(shù)出現(xiàn)的任何算子都要注意這種陷阱,例如GrabImage.

  • Regions:

類HRegion提供了基于像gen_rectangle2 or gen_circle生成的構造函數(shù)。并且硕旗,也提供了直接的派生類HRectangle2 or HCircle.

請注意HRegion也表現(xiàn)了和HImage一樣的陷阱窗骑。比如像GenRectangle2并不能直接修改調用它的實例HRegion,但是可以返回生成的初始化region.

  • XLDs:
    XLDs(HXLD,HXLDCont等等)沒有提供相應的構造函數(shù)漆枚。

  • Windows:

類HWindow提供了基于open_window and new_extern_window的構造函數(shù).注意:前者(指open_window)對于所有的參數(shù)可以使用默認值實現(xiàn)创译,這樣就可以生成默認的構造器,因此一旦創(chuàng)建即打開墙基。

當然了软族,你可以選擇使用CloseWindow關閉窗口,然后使用OpenWindow再次打開它碘橘。

與圖形化參數(shù)不同互订,你可以用一個直觀的方式使用HWindow實例調用“類構造器”樣的算子如OpenWindow。因此痘拆,對應的句柄被返回仰禽。

  • Other Handle Classes:

其他封裝了句柄的類,如HBarCode 和 HFramegrabber纺蛆,更系統(tǒng)地提供了構造函數(shù):如果類作為輸入參數(shù)出現(xiàn)在算子中吐葵,則自動存在一個基于此算子的構造函數(shù)。這樣 ,基于create_bar_code_model創(chuàng)建了HBarcode桥氏,基于create_shape_model創(chuàng)建了HShapeModel温峭,基于open_framegrabber創(chuàng)建了HFramegrabber.

與圖形化的參數(shù)不同,句柄類允許用一個直觀的方式使用類實例調用“類構造器”樣的算子字支,并且調用對象被修改凤藏。比如,你可以創(chuàng)建一個帶有默認構造器的HBarCode對象堕伪,并且使用CreateBarCodeModel初始化它揖庄。

HBarCode barcode;
barcode.CreateBarCodeModel(HTuple(), HTuple());

如果對象已經被初始化,在調用和重新初始化之前欠雌,原先的數(shù)據(jù)將自動銷毀蹄梢。

2.4 析構函數(shù)和Halcon算子

所有的HALCON/C++類都提供了默認的析構函數(shù)用來自動銷毀對應的內存。對于某些類富俄,析構函數(shù)基于適合的算子:

  • Windows:
    HWindow類的析構函數(shù)基于close_window關閉窗口禁炒。注意:算子本身不是析構器。你可以選擇調用CloseWindow關閉窗口霍比,并且使用OpenWindow再次打開它幕袱。

  • Other Handle Classes:
    其他句柄類的默認析構函數(shù),如HShapeModel or HFramegrabber 悠瞬,相應地應用了像clear_shape_model and close_framegrabber算子凹蜂。與close_window不同,這些算子不能通過類對象調用阁危,這個對于clear_all_shape_models一樣適用玛痊。事實上,你沒必要調用調用它狂打,直接重新初始化即可擂煞,如5.2節(jié)描述的那樣。

請注意: 你不能調用適用類對象來調用如下的算子:clear_shape_model,clear_all_shape_models, or close_framegrabber

2.5 Tuple模式

所謂tuple模式就是HALCON算子被調用趴乡。用這種模式对省,你可以使用一個簡單的調用區(qū)處理許多圖像或者區(qū)域。標準情況下晾捏,用一張單獨的照片去調用一個算子叫做簡單模式蒿涎。一個算子是否支持這種tuple模式可以在查詢手冊中查詢。比如惦辛,看下圖5.5劳秋,展現(xiàn)了算子char_threshold的用法。


觀察算子的說明胖齐,參數(shù)Image被描述成一個image(-array)玻淑;這表明你可以應用此算子一次性到多個圖片。

如果你使用多張圖片調用算子char_threshold,比如說呀伙,用一個圖像數(shù)組补履,那么輸出參數(shù)也自動變?yōu)閿?shù)組。因此剿另,參數(shù)Characters and Threshold被描述成region(-array)和integer(-array).

注意觀察圖5.5的算子簽名箫锤,我們發(fā)現(xiàn)面向過程的方法,調用char_threshold的簡單模式和數(shù)組模式僅僅在輸出參數(shù)Threshold上不同:一個指向long的指針雨女,一個指向long的數(shù)組的指針谚攒。

面向對象的方法,簡單模式和數(shù)組模式關于圖形化參數(shù)使用了不同的類:HImage and HRegion vs.HImageArray and HRegionArray.正如面向過程的方法一樣戚篙,控制參數(shù)可以是基本類型(僅僅簡單模式)或者HTuple類型(簡單和數(shù)組模式)

在看了理論上的介紹后五鲫,我們來看一個簡單的例子。圖5.6岔擂,char_threshold被應用于簡單模式位喂,即一幅單個的圖片,圖5.7 一次性應用于兩張圖片乱灵。


 HImageArray    images;
  HRegionArray   regions;
  HTuple         thresholds;

  for (int i=1; i<=2; i++)
  {
    images[i-1] = HImage::ReadImage(HTuple("alpha") + i);
  }

  regions = images.CharThreshold(images[0].GetDomain(), 2, 95, &thresholds);

  for (int i=0; i<images.Num(); i++)
  {
    images[i].Display(window);
    regions[i].Display(window);
    cout << "Threshold for 'alpha" << i+1 << "': " << thresholds[i].L();
    window.Click();

Hobject        images, image;
  Hobject        regions, region;
  long           num;
  HTuple         thresholds;

  gen_empty_obj(&images);

  for (int i=1; i<=2; i++)
  {
    read_image(&image, HTuple("alpha") + i);
    concat_obj(images, image, &images);
  }

  char_threshold(images, image, &regions, 2, 95, &thresholds);
  count_obj(images, &num);

  for (int i=0; i<num; i++)
  {
    select_obj(images, &image, i+1);
    disp_obj(image, window);
    select_obj(regions, &region, i+1);
    disp_obj(region, window);
    cout << "Threshold for 'alpha" << i+1 << "': " << thresholds[i].L();
  }

Figure 5.7: Using CharThreshold in tuple mode, via HImageArray, or in the procedural approach (declaration and opening of window omitted).

兩個例子都使用面向對象和面向過程的方法實現(xiàn)塑崖。例子中概括了以下幾個有趣的點:

  • 圖形化數(shù)組的創(chuàng)建和初始化:
    在面向對象的方法中,圖像數(shù)組可以通過眾所周知的運算符[]來創(chuàng)建痛倚。而面向過程的方法规婆,你必須使用gen_empty_obj創(chuàng)建一個空的對象(即數(shù)組),然后通過concat_obj增加圖像。

  • 訪問圖形化對象
    正如所期望的那樣,在面向對象的方法中抒蚜,單個圖像和區(qū)域可以通過[]來訪問掘鄙;數(shù)組的個數(shù)可以通過方法Num()來獲得。而面向過程的方法中嗡髓,對象必須顯式地使用算子select_obj來獲得操漠;個數(shù)必須通過count_obj獲得。

  • Hobject的多態(tài)性:(part I)
    正如已經提到的那樣饿这,Hobject的實例既可以使用簡單模式也可以使用數(shù)組模式浊伙。但是與之相反的是,面向對象的方法中當從簡單模式切換到數(shù)組模式時长捧,你必須使用不同的類嚣鄙。

  • Hobject的多態(tài)性:(part II)
    Hobject可以用于所有圖形化對象。并且串结,圖像對象可以當做region使用作為參數(shù)哑子。在這種情況下,圖像的domain奉芦,即像素“有效”的區(qū)域(即ROI)
    自動提取赵抢。而面向對象的方法,你必須使用GetDomain顯式地提取声功。

  • Array(tuple) indices:(數(shù)組目錄)
    面向對象的圖形化數(shù)組以0開始烦却,比如對于HTuple就是這樣。但是Hobject數(shù)組就是從1開始先巴。

大多數(shù)時候其爵,你將使用數(shù)組模式:只要你通過算子Connection將一個region分成連通的區(qū)域,你就將以HRegionArray結束伸蚯。這樣摩渺,任何子序列的處理,比如形態(tài)學處理剂邮,像DilationCircle or 或者使用AreaCenter計算region的位置都將自動在數(shù)組的所有區(qū)域中呈現(xiàn)摇幻,也就是數(shù)組模式。這樣挥萌,數(shù)組模式終究也是一個簡單的模式绰姻!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市引瀑,隨后出現(xiàn)的幾起案子狂芋,更是在濱河造成了極大的恐慌,老刑警劉巖憨栽,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帜矾,死亡現(xiàn)場離奇詭異翼虫,居然都是意外死亡,警方通過查閱死者的電腦和手機屡萤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門珍剑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灭衷,你說我怎么就攤上這事次慢。” “怎么了翔曲?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長劈愚。 經常有香客問我瞳遍,道長,這世上最難降的妖魔是什么菌羽? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任掠械,我火速辦了婚禮,結果婚禮上注祖,老公的妹妹穿的比我還像新娘猾蒂。我一直安慰自己,他們只是感情好是晨,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布肚菠。 她就那樣靜靜地躺著,像睡著了一般罩缴。 火紅的嫁衣襯著肌膚如雪蚊逢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天箫章,我揣著相機與錄音烙荷,去河邊找鬼。 笑死檬寂,一個胖子當著我的面吹牛终抽,可吹牛的內容都是我干的。 我是一名探鬼主播桶至,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼昼伴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了塞茅?” 一聲冷哼從身側響起亩码,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎野瘦,沒想到半個月后描沟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體飒泻,經...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年吏廉,在試婚紗的時候發(fā)現(xiàn)自己被綠了泞遗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡席覆,死狀恐怖史辙,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情佩伤,我是刑警寧澤聊倔,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站生巡,受9級特大地震影響耙蔑,放射性物質發(fā)生泄漏。R本人自食惡果不足惜孤荣,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一甸陌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盐股,春花似錦钱豁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涛目,卻和暖如春秸谢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背霹肝。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工估蹄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沫换。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓臭蚁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親讯赏。 傳聞我的和親對象是個殘疾皇子垮兑,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內容

  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,216評論 0 4
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評論 1 51
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法漱挎,內部類的語法系枪,繼承相關的語法,異常的語法磕谅,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 別人笑我太瘋癲私爷,我笑他人看不穿 我身邊的同學朋友多稱我作挑剔的多情種雾棺,其實,他們不知衬浑,我本質上是一顆早熟種子捌浩。 那...
    添一抹嵐閱讀 1,076評論 32 17
  • 在白洋淀度五一, 同學一起工秩,在賞風景尸饺、瞻仰名勝古跡之余, 學會了一種撲克牌玩法助币。 名字挺有意思浪听,叫:“干瞪眼” 光...
    毛英勇閱讀 1,334評論 0 1