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