Halcon,大名鼎鼎,如雷貫耳,機(jī)器視覺領(lǐng)域無人不知,無人不曉,但很多初學(xué)的同學(xué)被一大堆SDK(算子)看的蒙頭轉(zhuǎn)向,喪失信心,在這里,我談?wù)刪alcon的學(xué)習(xí)方法和心得。
此所謂halcon開始學(xué)習(xí)、學(xué)習(xí)的過程、學(xué)習(xí)的結(jié)果。 學(xué)halcon的三個(gè)過程,開始學(xué)習(xí)的時(shí)候,你要有目標(biāo),哪怕你現(xiàn)在是學(xué)生還是轉(zhuǎn)行來學(xué)習(xí)halcon的人,心中要有一個(gè)目標(biāo),不能做一條“閑魚”就滿足了。學(xué)習(xí)halcon過程中,不拋棄不放棄,衣帶漸寬終不悔為伊消得人憔悴。當(dāng)你堅(jiān)持學(xué)習(xí)下來,經(jīng)過不斷努力學(xué)習(xí),成長起來,卻無意間看到那人正在燈火闌珊處,勝利儼然已經(jīng)歸來。 我們?nèi)チ私鈾C(jī)器視覺發(fā)展歷史就知道,機(jī)器視覺是產(chǎn)業(yè)驅(qū)動發(fā)展的, 我們學(xué)習(xí)halcon也是通過機(jī)器視覺應(yīng)用場景驅(qū)動的,機(jī)器視覺應(yīng)用主要分為四大類:定位、識別、測量、檢測,學(xué)習(xí)halcon我們主要圍繞著著四類問題進(jìn)行展開,每個(gè)應(yīng)用通過幾個(gè)項(xiàng)目總結(jié)和歸納,我覺得就已經(jīng)入門了,真正要成為資深視覺工程師,還需要項(xiàng)目經(jīng)驗(yàn)、工程實(shí)踐經(jīng)驗(yàn)來進(jìn)行深入。 ?
機(jī)器視覺應(yīng)用場景分類
視覺定位
視覺定位應(yīng)用主要是找到物體的位置,那么怎么找?在這里一個(gè)重要的步驟就是標(biāo)定,標(biāo)定是把相機(jī)的像素坐標(biāo)系轉(zhuǎn)換為機(jī)械上的物理坐標(biāo)系,使得圖像中的識別的像素值轉(zhuǎn)換為機(jī)械坐標(biāo)值后發(fā)送給機(jī)械運(yùn)動,找到目標(biāo)位置。
坐標(biāo)變換過程 在標(biāo)定過程中,使用halcon,不需要你自己解矩陣,一個(gè)算子搞定?vector_to_hom_mat2d( : : Px, Py, Qx, Qy : HomMat2D)?輸入像素坐標(biāo)點(diǎn)Px,Py,輸入機(jī)械坐標(biāo)點(diǎn)Qx,Qy生成一個(gè)仿射變換矩陣,比如我用模板匹配查找到了一個(gè)像素點(diǎn)(X,Y),那么通過affine_trans_point_2d( : : HomMat2D, Px, Py : Qx, Qy)就可以計(jì)算出機(jī)械坐標(biāo),入門,你知道這些就夠了,至于深入的應(yīng)用,比如不共軸情況那就是后面入門之后的事情。
計(jì)算坐標(biāo) 那么,上面說的定位標(biāo)定是一個(gè)純數(shù)學(xué)問題,那么現(xiàn)在我們怎么找到特征點(diǎn)?怎么做定位?在這里就要用halcon的圖像處理算子了,常用的定位方法有模板匹配、blob定位、圓查找、線查找, 模板匹配是亞像素精度(sub-pixel),定位中大多數(shù)場合會使用,模板匹配2個(gè)核心算子,也是最常用的,至于其他的可變性、基于點(diǎn)、基于灰度、基于描述符、局部可變性、可變性的基本在實(shí)際應(yīng)用中應(yīng)用的很少,基于此,你只需要知道在哪里找到halcon的這些模塊例程,用到了去學(xué)習(xí)即可。查找方法 在Hdevelop中 快捷鍵 Ctrl+E->方法 中查找
常用圖像定位方法
查找例程 ?
模板匹配
當(dāng)然,在進(jìn)行模板匹配之前,可能會用到很多圖像預(yù)處理,比如進(jìn)行圖像濾波mean_image、gauss_filter、smooth_image、binominal_filter等濾波算子,還會進(jìn)行ROI(region of interest)設(shè)置圖像感興趣區(qū)域,所用到的halcon算子是draw_開頭的一些列算子,在HDevelop中,按F1幫助按鈕,搜索draw_可以看到畫圓、畫橢圓、或線、畫點(diǎn)、畫多邊形等都有,其中*_mod代表在原有的圖像基礎(chǔ)上修飾圖形,這樣這一些系列算子你又記住了,是不是很簡單
交互畫ROI
直接創(chuàng)建和通過輪廓創(chuàng)建模板 直接通過create_shape_model創(chuàng)建模板會有很多不需要的輪廓,我們通過xld來進(jìn)行創(chuàng)建,通過edges_sub_pixel獲取亞像素輪廓,然后通過select_shape_xld的長度特征刪選掉一些不必要的輪廓,大家可以看到,基本上每一個(gè)算子的含義都可以通過算子的組合理解到,何況halcon中有智能提示、VS中也有智能提示,只需要打出一個(gè)單詞你就可以選擇了。
blob定位
使用blob定位就是精度不高的情況或者用來做粗定位了,在halcon中,搜索threshold可以出現(xiàn)一系列二值化操作的接口(如果大家用的多了,在OpenCV或則其他算法庫都一樣),可以得到一系列二值化操作,常用的有threshold、auto_threshold、binary_threshold、dyn_threshold、var_threshold,其他的閾值很少用。
Threshold判斷出產(chǎn)品是否OK
找線、找圓
在這里有一個(gè)重要的算子gen_measure_rectangle2,這個(gè)算子是準(zhǔn)備一個(gè)測量對象,然后通過mesure_pos/measure_pair進(jìn)行測量邊界點(diǎn),最后通過fit_circle_contour_xld和fit_line_contour_xld進(jìn)行擬合出圓和直線。
擬合直線和擬合圓 總結(jié)一下,定位類項(xiàng)目,一個(gè)關(guān)鍵是標(biāo)定,另一個(gè)關(guān)鍵就是定位算法,大多數(shù)情況下定位都是通過找模板來定位。
視覺測量
視覺測量項(xiàng)目類應(yīng)用主要是應(yīng)用在有2個(gè)步驟,第一步粗定位,第二部測量。定位階段使用模板匹配create_shape_model、find_shape_mode來解決,然后使用vector_angle_to_rigid生成一個(gè)仿射變換矩陣,使用這個(gè)矩陣矯正圖像affine_trans_image,使用之后使用gen_measure_rectangle2生成測量對象,通過mesure_pos/measure_pair進(jìn)行測量邊界點(diǎn),最后通過fit_circle_contour_xld和fit_line_contour_xld進(jìn)行擬合出圓和直線,最后利用halcon中的 distance_算子來計(jì)算點(diǎn)點(diǎn)測量、點(diǎn)線測量等。 這類應(yīng)用比較簡單,應(yīng)用也比較廣泛。
找點(diǎn)擬合圓
識別項(xiàng)目
識別項(xiàng)目,識別什么?通常在機(jī)器視覺領(lǐng)域,識別主要是進(jìn)行OCR、一維碼、二維碼的識別。
OCR
在halcon傳統(tǒng)識別中,要識別OCR,就要先分割出字符,分割字符最常用的就是閾值分割,也就是帶threshold的系列算子組合,再通過濾波算子組合、形態(tài)學(xué)算子處理區(qū)域,把字符完全分割出來識別
分割字符步驟 分割出來后就可以使用halcon 的create_ocr_class_mlp/svm/knn/box創(chuàng)建分類器,再就調(diào)用trainf_ocr_class_mlp訓(xùn)練字符,通過write_ocr_class_mlp寫入字符句柄到文件中,clear_ocr_class_mlp清理create_ocr_class_*創(chuàng)建的句柄對象,以免句柄內(nèi)存泄漏。 在識別字符的時(shí)候通過read_ocr_class_mlp讀取字符模型再通過do_ocr_single_class_mlp讀取字符即可。大家看到這個(gè)過程是 create->trainf->write; read->do_ocr,在大多數(shù)halcon應(yīng)用中都是這個(gè)模式,創(chuàng)建->訓(xùn)練->寫入文件, 讀取文件->識別, 這些都是經(jīng)驗(yàn)套路。 當(dāng)然halcon中OCR字符識別模塊已經(jīng)有預(yù)訓(xùn)練好的字符,這些事常用的,但在很多實(shí)際項(xiàng)目情況中是需要自己訓(xùn)練的。
halcon默認(rèn)訓(xùn)練的字符庫
一維碼
一維碼識別中,create_bar_code_model創(chuàng)建一維碼模型,通過set_bar_code_param設(shè)置一維碼參數(shù),通過find_bar_code查找一維碼內(nèi)容,最后clear_bar_code清空數(shù)據(jù)模型。在一維碼應(yīng)用中,我們沒有做圖像預(yù)處理的工作,halcon通過set_bar_code_param設(shè)置一些參數(shù),就可以解碼出一維碼了,halcon強(qiáng)大的圖像處理能力。
二維碼
二維碼識別中,create_data_code_2d_model創(chuàng)建二維碼模型,通過set_data_code_2d_param設(shè)置二維碼參數(shù),再通過find_data_code_2d查找二維碼的內(nèi)容,最后clear_data_code_2d_model清空數(shù)據(jù)模型,同樣,在這里沒有做圖像預(yù)處理工偶,halcon通過set_data_code_2d_param參數(shù),強(qiáng)大的算法就可以解碼了。 總結(jié)一點(diǎn),識別類應(yīng)用主要是在軟件層的設(shè)計(jì),軟件層需要設(shè)計(jì)出交互好用的軟件,以及讀取數(shù)據(jù)后對一維碼、二維碼數(shù)據(jù)的處理,以及跟第三方平臺對接,所以這才是實(shí)際項(xiàng)目中不確定的。
視覺檢測
在這里視覺檢測是一個(gè)綜合應(yīng)用算子的場景,你可能會使用blob來進(jìn)行檢測,也可能使用模板匹配來進(jìn)行檢測,也可能用FFT,以及顏色識別,視覺檢測的情況非常多,這也是實(shí)際項(xiàng)目中最多的非標(biāo)項(xiàng)目,在這里使用的最多的就是blob算法,產(chǎn)品有無、產(chǎn)品臟污、產(chǎn)品破損、產(chǎn)品裂紋等都可以通過blob特征來區(qū)分,用到的算子還是上面提到的, 不過視覺檢測很依耐圖像成像,比如現(xiàn)實(shí)項(xiàng)目中的布匹、瓷磚等檢測圖像成像是主要問題,還有就是線掃相機(jī)的掃描速度!
視覺檢測常用的算法處理 至于FFT傅里葉變換,是把空間信息轉(zhuǎn)化為頻域信息,使用的算法很少 ,rft_generic->convol_fft->rft_generic,最后通過blob來進(jìn)行處理,再加上形態(tài)學(xué)。
FFT 上面是一個(gè)大的分類,至于大家經(jīng)常聽到的標(biāo)定,在這里有很多種類型標(biāo)定,視覺定位中的標(biāo)定上面已經(jīng)說了,vector_to_hom_mat2d/affine_trans_point_2d。還有尺度標(biāo)定,尺度標(biāo)定就是一個(gè)像素轉(zhuǎn)物理單位的過程,在測量項(xiàng)目中會用用到,經(jīng)常性的使用一個(gè)標(biāo)定塊計(jì)算出單像素大小即可。畸變標(biāo)定,這是圖像校正,當(dāng)我們使用焦距比較短比如8mm的鏡頭時(shí),畸變比較大,在HDevelop->助手->打開Calibration進(jìn)行標(biāo)定即可,使用halcon標(biāo)定助手外加一塊標(biāo)定板解決。
標(biāo)定 當(dāng)然這四大類不是獨(dú)立運(yùn)行的, 很多項(xiàng)目同時(shí)存在定位、缺陷、測量、識別的情況,這就要考驗(yàn)工程師的應(yīng)用能力了,要熟練的使用起來,這些基本的幾大類知識點(diǎn)要明白的。 ?
審核編輯:黃飛
?
評論