Halcon 《機器視覺演算法及應用》十例(其三)

2021-10-10 16:17:03 字數 4513 閱讀 3487

***該例項由於鋸片很薄,採用漫反射背光照明

* 該程式演示了如何通過測量影象中的角度來檢查鋸片的齒。

* * 初始化一些常量

pi := rad(180)

pi_2 := rad(90)

* * 顯示初始化

dev_update_off ()

read_image (image, 'saw_blade/saw_01')

get_image_size (image, width, height)

dev_close_window ()

dev_open_window_fit_image (image, 0, 0, 640, 640, windowhandlemain)

set_display_font (windowhandlemain, 16, 'mono', 'true', 'false')

get_window_extents (windowhandlemain, windowrow, windowcolumn, windowwidth, windowheight)

dev_open_window (400, windowwidth / 2, 300, 300, 'black', windowhandlezoom)

dev_set_line_width (2)

* * 主迴圈:處理不同的影象

for index1 := 1 to 7 by 1 //迴圈所以影象

read_image (image, 'saw_blade/saw_' + index1$'02')

* *通過亞畫素精確的閾值獲得鋸的輪廓。

threshold_sub_pix(image, border, 128) //以亞畫素精度從影象中提取crossing,而是將灰度值小於threshold的區域與灰度值大於threshold的區域分割線返回border

* * 分割,選擇和分類線性輪廓零件

segment_contours_xld(border, contourssplit, 'lines_circles', 5, 6, 4)

//將xld輪廓分割為線段、圓弧或橢圓弧

select_shape_xld (contourssplit, selectedcontours, 'contlength', 'and', 30, 200) //使用形狀特徵選擇輪廓或多邊形

count_obj (selectedcontours, number) //計算區域的數量

gen_empty_obj (toothsides)//生成空陣列物件

for index2 := 1 to number by 1

select_obj (selectedcontours, selectedcontour, index2)//迴圈所有物件

*獲得全域性輪廓屬性

get_contour_global_attrib_xld

如果attrib =0,這一部分輪廓最適合被擬合為橢圓弧。

如果attrib =1,這一部分輪廓最適合被擬合為圓弧。

如果attrib =-1,這一部分輪廓最適合被擬合為-直線。

if (attrib == -1)

concat_obj (toothsides, selectedcontour, toothsides) //兩個區域組合到一起,生成新區域toothsides

endif

endfor

sort_contours_xld (toothsides, toothsidessorted, 'upper_left', 'true', 'column') //根據輪廓的相對位置對輪廓進行排序

* * 計算鋸齒每側的方向

fit_line_contour_xld(toothsidessorted, 'tukey', -1, 0, 5, 2, rows1, columns1, rows2, columns2, nr, nc, dist) //

對一些線段的xld做近似計算直線計算

fit_line_contour_xld( contours : : algorithm, maxnumpoints, clippingendpoints, iterations, clippingfactor : rowbegin, colbegin, rowend, colend, nr, nc, dist )

contours(in):輸入輪廓

algorithm(in):形成線的演算法

maxnumpoints(in):用於計算的最大輪廓點個數

clippingendpoints(in):在逼近過程中被忽略的開始及末尾點個數

iterations(in):迭代的最大次數

clippingfactor(in):消除異常值的裁剪因子

rowbegin(out):線段開始點的行座標

colbegin(out):線段開始的列座標

rowend(out):線段結尾的行座標

colend(out):線段結尾的列座標

nr(out):線引數:法向量的行座標

nc(out):法向量的列座標

dist(out):原點到該線的距離

line_orientation(rows1, columns1, rows2, columns2, orientations) //返回直線的角度:-90到90之間

* 測量屬於同一鋸齒角度

angles :=

* 檢查第一顆鋸齒是否完全可見。

*如果沒有,請從第二顆鋸齒開始測量。

if (rows1[0] > rows2[0]) //如果起始座標rows1>結束座標 rows2,說明是鋸齒的右側,則第一顆鋸齒沒有左側,第一顆鋸齒可以跳過不計算了

start := 1

else

start := 2

endif

for index2 := start to |orientations| - 1 by 2

angle := abs(orientations[index2 - 1] - orientations[index2])

* 確保角度在[0,pi / 2]度的範圍內。

if (angle > pi_2)

angle := pi - angle

endif

* * 顯示結果

dev_display_tooth (image, toothsides, index2, rows1, columns1, rows2, columns2, windowhandlemain, windowhandlezoom)

dev_set_window (windowhandlemain)

dev_disp_text ('tooth ' + (index2 + 1) / 2, 'window', 10, 10, 'black', , )

dev_disp_text ('included angle: ' + deg(angle)$'.2f' + ' deg', 'window', 35, 10, 'black', , )

dev_disp_text ('press run (f5) to continue', 'window', 'bottom', 'right', 'black', , )

angles := [angles,angle]

stop ()

endfor

endfor

* dev_set_window (windowhandlemain)

dev_disp_text ('      end of program      ', 'window', 'bottom', 'right', 'black', , )

dev_set_window (windowhandlezoom)

dev_close_window ()

值得借鑑:

1.將鋸齒從背景中分割,使用亞畫素精度演算法。通常有兩種亞畫素精度演算法:亞畫素輪廓精度提取演算法(邊緣提取)、亞畫素閾值分割演算法(閾值分割),亞畫素閾值分割演算法適合此例子(背光照射使得背景為白色、鋸齒為黑色),閾值採用均值128。

2.將每個鋸齒分割,使用segment_contours_xld將輪廓分割為線段、直線以及橢圓,並出去過長、過短的線段。

3.進一步除去鋸齒間的圓弧get_contour_global_attrib_xld

4.從左至右 對輪廓排序,並使用fit_line_contour_xld對直線擬合

5.計算擬合直線的方向,line_orientation得到的直線方向範圍是[-90,90]

6.通過相鄰兩側擬合直線(同一鋸齒)相減, 計算每個鋸齒的角度

計算鋸齒沒測的方向,直接的方法是圖(b)用過輪廓起點、終點的直線角度,但鋸齒頂部不一定是理想的尖端,因此用輪廓線上的所有點(擬合直線)更好。

圖(c)可以看出,亞畫素精度下,擬合直線的角度與真實直線的角度(a)幾乎相等。

halcon學習筆記 機器視覺工程應用的開發思路

機器視覺工程應用主要可劃分為硬體和軟體兩大部分。硬體 工程應用的第一步就是硬體選型。硬體選型很關鍵,因為它是你後面工作的基礎。主要是光源 工業相機和鏡頭選擇。軟體 目前業內商業庫主要有halcon,康耐視,dalsa,evision,ni等,開源庫有opencv.其中ni的labview visio...

Halcon 機器視覺中常用運算元

在機器視覺中,影象處理是必不可少的步驟。一般而言,呼叫第三方影象處理函式庫是視覺軟體方便快捷開發的一種手段。而在這其中,德國付費軟體halcon是行業內使用較多的一款影象處理函式庫。本人現在接觸學習使用的是halcon12.0版本,通過本文,將一些常見的,開發中使用的halcon運算元簡單解析,總結...

Halcon 機器視覺 發展前景

無意中看到了 halcon c 混合程式設計,奈何我不懂咋回事,只有先了解 halcon是什麼。想要學習 halcon機器視覺,當然幫你找了資源 論壇 視覺imax 感興趣的自行了解 用halcon五年回答一下 1.機器視覺好找也不好找工作,在北京 上海 深圳 尤其深圳人才奇缺。如果是一些二線城市崗...