Halcon 2D測量之三

2021-08-17 10:51:29 字數 3796 閱讀 8276

建立輪廓

一般獲取輪廓的步驟是提取邊緣,邊緣是一張中亮暗區域的過渡位置,它可以由梯度計算得出。梯度也可以表示為邊緣幅度和邊緣方向。通過選擇那些有高的邊緣幅值的畫素點或者有特定邊緣方向的畫素點,區域內的輪廓可以提取出來。可以通過多種的方式以多種精度提取輪廓。

使用邊緣濾波器後,將產生乙個或兩個邊緣影象。通過使用閾值運算元從得到的邊緣影象中選擇具有給定的最小邊緣幅度的畫素來提取邊緣區域。為了獲得具有乙個畫素厚度的邊緣,必須通過使用運算元(例如:skeleton)來減薄所獲得的區域。

常見的畫素精確邊緣濾波器是運算速度較快的sobel_amp和速度較慢但已經包括滯後閾值和細化的edges_image,其結果比sobel_amp更精確。edges_image及其對應的彩色影象(edges_color)也可以在引數filter設定為「sobel_fast」的情況下應用。這樣,運算元的速度也很快,但僅推薦用於雜訊或紋理小且邊緣銳利的影象。

除了邊緣之外,還可以提取由薄結構構建的線。這些線有著不均勻的一定的寬度,一般採用濾波運算元bandpass_image,結合了閾值和細化。

經過濾波、閾值和細化後得到的結果一般都會轉換為輪廓。將薄邊緣區域轉換為輪廓的運算元有gen_contours_skeleton_xld。

採用亞畫素邊緣提取運算元可以立刻得到輪廓。例如edges_sub_pix、edges_color_sub_pix、zero_crossing_sub_pix。

檢測圖中的線以及其寬度lines_gauss, lines_facet , lines_color, edges_sub_pix.

亞畫素精度方法通常比畫素精度方法慢。為了加快亞畫素精度的邊緣提取,建議僅將其應用於roi 。為了獲得合適的roi,可以使用閾值運算元(例如,使用fast _ threshold )來確定輪廓所包圍的區域。然後,返回的區域通過運算元boundary縮小到其邊界,並且可以用運算元clip _ region _ rel進行裁剪。利用形態學運算元,例如expansion _ circle,對返回區域進行少量擴充套件,通過reduce _ domain將影象縮小到返回區域,並將縮小後的影象用作roi。roi作為亞畫素精確邊緣提取的搜尋空間。

另一種快速提取輪廓的方法是使用運算元threshold_sub_pix來進行亞畫素精度閾值化,可實時應用於整個影象。它與用於區域處理的那些閾值運算元類似,但它不產生閉合區域,而是產生區域的邊界或部分邊界的亞畫素精度輪廓。因此,與為區域處理引入的閾值運算元相反,threshold_sub_pix返回的輪廓不需要閉合,可以獲得相同區域的多個輪廓,並且等高線之間是可以連線的。和用於區域處理的閾值處理運算元一樣,您可以使用灰度直方圖來選擇合適的閾值,也可以通過使用運算元gray_histo, histo_to_thresh和intensity的到的灰度值來選擇合適的閾值。

選擇輪廓

建立輪廓的過程產生了一系列的輪廓,我們需要從這些輪廓中選擇需要的輪廓用於下一步的測量。

根據特徵選擇輪廓: 運算元select_shape_xld可以用於選擇具有特定凸性、圓性或面積等30多種形狀特徵的閉合輪廓,運算元select _ contures _ xld可以根據輪廓的長度、曲率或方向選擇閉合或非閉合的輪廓。select _ xld _ point可以與滑鼠功能結合使用,以互動方式選擇輪廓。

通過輪廓合併可以將接近的輪廓合併成乙個選擇輪廓:運算元union_collinear_contours_xld可以用於合併大致位於同一直線上的輪廓;運算元union_cocircular_contours_xld在同乙個圓上;相鄰union_adjacent_contours_xld;相切union_cotangential_contours_xld;

集合論運算元選擇輪廓:運算元intersection_closed_contours_xld 和 intersection_closed_polygons_xld用於計算閉合輪廓或多邊形相交部分;運算元 difference_closed_contours_xld 和difference_closed_polygons_xld 用於計算閉合輪廓或多邊形不相交的部分;運算元symm_difference_closed_contours_xld 和 symm_difference_closed_polygons_xld;運算元union2_closed_contours_xld 和union2_closed_polygons_xld。

簡化輪廓:可以通過直接將輪廓轉換為類似的形狀基元來簡化輪廓,使用運算元shape _ trans _ xld可以將輪廓轉換為最小的封閉圓,具有相同力矩的橢圓,凸包,最小的封閉矩形(平行於座標軸或具有任意方向)

分割輪廓

所獲得的輪廓通常由或多或少的複雜的形狀組成。如果輪廓由已知的線段組成

,例如直線或圓弧等線段。將輪廓分割成這些較不複雜的線段

有助於更容易地分析,因為

這些線段組成的形狀基元更便於測量

,例如圓的直徑或線的長度。

形狀基元包括線、圓、橢圓和矩形。

運算元segment_contours_xld可以用於輪廓分割。根據選擇的

引數,可將輪廓分割成直線段,直線和圓形

段或直線和橢圓形段。

如果只需要直線段,則

也可以改為使用運算元gen _ polygens _ xld。使用運算元split_contours_xld可以獲取多邊形的每乙個邊

。通過近似輪廓到已知形狀提取特徵

在選擇和

分割輪廓之後的共同步驟是將形狀基元擬合到輪廓

或輪廓段以獲得它們特定的形狀引數。可以選擇的形狀基元有線段,圓形,橢圓形和矩形。特定的形狀引數有線段的端點、圓的半徑和中心。

對於直線段( ' cont _ joup ' = - 1 ),fit _ line _ contour _ xld獲取每個直線段的引數,例如兩個端點的座標。

對於圓弧( ' cont _ joup ' = 1 ),fit_circle_contour_xld和

對於橢圓弧( ' cont _ joup ' = 0 ),fit_ellipse_contour_xld用於計算中心點位置、半徑以及由輪廓覆蓋的圓或橢圓部分段(由起點和終點的角度確定)。

用運算元union_adjacent_contours_xld可以合併純(未分段)輪廓和線性輪廓來組成矩形。fit_rectangle2_contour_xld用於獲取矩形的引數。

提取未知輪廓的特徵

area _ center _ xld :由輪廓或多邊形包圍的區域的面積和重心,

以及沿邊界的點的順序。

diameter _ xld :輪廓上距離最遠的兩個極值點的座標

,還有他們之間的距離。

elliptic_axis_xld::與輪廓具有相同方向和縱橫比的橢圓的兩個半徑和方向。

length _ xld :輪廓或多邊形的長度。

orientation_xld :輪廓的方向。

smallest_circle_xld :最小封閉圓的中心位置和半徑。

smallest_rectangle1_xld:平行於座標軸的最小封閉矩形的中心點座標 

smallest_rectangle2_xld: 任意方向的最小封閉矩形的中心位置、方向和兩個半徑

某些運算元僅在沒有自相交的輪廓上工作。自相交並不總是顯而易見的,因為它們可能由於運算元的內部計算而發生。可以運算元test _ self_intersection_xld檢查輪廓是否與自身相交。如果自相交造成了問題,還可以使用相應的基於點的運算元。可用的運算元有area_center_points_xld, moments_points_xld, orientation_points_xld,    elliptic_axis_points_xld,   eccentricity_points_xld,   和 moments_any_points_xld.

幾何運算

點到點到線到線段到輪廓。。。。。的距離

Halcon 2D測量之一

通過2d測量可以獲取一些特徵,如 物體的範圍,也就是說組成物體的畫素陣列 物體的方向 物體間或者物體組成部分間的角度 物體的位置 物體的尺寸 也就是說他的寬度高度或者物體間的距離,物體組成部分間的距離 物體的個數 分析measure metal part first example.hdev例程 第...

Halcon 2D測量之二

影象分割得到感興趣的區域 可以用以下運算元 各種各樣的閾值運算元可以通過灰度值將灰度值影象或者多通道影象的其中乙個通道分割出感興趣的區域,如 auto threshold,bin threshold,dyn threshold,fast threshold,threshold.獲取的灰度值的可以用g...

Halcon 1D測量之一

學習如何使用halcon進行1d測量,可以參考 1 halcon自帶的文件 solution guide iii a 1d measuring.pdf 2 halcon例程 measure switch.hdev 其中 solution guide iii a 1d measuring.pdf 第一...