Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例
Halcon學習筆記:1D Measuring一維測量_fuse.hdev燈絲測量示例
一.基本概念
基本流程為:
- 獲取圖像
- 對圖像進行灰度值標定
(針對相機獲取的圖像灰度和輸入能量之間的非線性關(guān)系,獲得相機對輸入能量的線性函數(shù)) - 排列感興趣區(qū)域或圖像
- 校正圖像
- 創(chuàng)建測量句柄
- 進行測量
- 將測量結(jié)果轉(zhuǎn)換到世界坐標系
- 結(jié)果可視化
- 釋放測量句柄。
二.典型相關(guān)算子:
-
1.gen_rectangle2( : Rectangle : Row, Column, Phi, Length1, Length2 : )
創(chuàng)建任意方向的一個矩形,控制輸入分別為矩形中心的行列坐標,矩形縱向與水平方向的夾角,長和寬的一半。 -
2.gen_measure_rectangle2( : : Row, Column, Phi, Length1, Length2, Width, Height, Interpolation : MeasureHandle)
產(chǎn)生測量句柄,準備提取和矩形主軸垂直的直邊緣。插值方法有:‘nearest_neighbor’, ‘bilinear’, 'bicubic’三種。 -
3.measure_pairs(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
抽取和矩形或者圓弧垂直的直線。
MeasureHandle:測量句柄
Sigma:進行高斯平滑的方差值。
Threshold :邊緣的最小幅值。
Transition:沿主軸方向dark-to-light定義為第一類邊緣,反之為第二類邊緣。
Select (input_control) string → (string)
RowEdgeFirst ;ColumnEdgeFirst ;AmplitudeFirst
第一類邊緣點的行列坐標和幅度值。
RowEdgeSecond ;ColumnEdgeSecond ;AmplitudeSecond
第二類邊緣點的行列坐標和幅度值。
IntraDistance :每個邊緣對之間的距離。
InterDistance :連續(xù)邊緣對之間的距離。 -
4.get_points_ellipse( : : Angle, Row, Column, Phi, Radius1, Radius2 : RowPoint, ColPoint)
返回橢圓上某一點,該點與橢圓中線連線和橢圓長軸正方向成角為參數(shù)Angle。
Row, Column, Phi, Radius1, Radius2:為橢圓的參數(shù)
RowPoint, ColPoint:返回點的行列坐標。 -
5.disp_arc( : : WindowHandle, CenterRow, CenterCol, Angle, BeginRow, BeginCol : )
在窗口中顯示圓弧。從(BeginRow, BeginCol)點,順時針顯示,角度為Angle -
6.gen_measure_arc( : : CenterRow, CenterCol, Radius, AngleStart, AngleExtent, AnnulusRadius, Width, Height, Interpolation : MeasureHandle)
產(chǎn)生圓弧測量句柄,提取和圓弧垂直的直線。
AnnulusRadius:為沿著半徑方向測量寬度的一半。 -
7.count_seconds( : : : Seconds)
程序執(zhí)行時間測量算子。
- 8.measure_pos(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdge, ColumnEdge, Amplitude, Distance)
提取和矩形或者弧垂直的邊緣線。
RowEdge, ColumnEdge:提取的邊緣線與測量弧線或測量矩形的交點坐標,為亞像素精度,改算子常和循環(huán)配合使用。
Distance:連續(xù)邊緣線之間的距離。
-
9.distance_pp( : : Row1, Column1, Row2, Column2 : Distance)
計算兩點之間的距離。 -
10.create_funct_1d_pairs( : : XValues, YValues : Function)
根據(jù)一系列的(x,y)坐標值創(chuàng)建一個函數(shù)。X坐標值會被升序排列。 -
11.set_fuzzy_measure_norm_pair( : : MeasureHandle, PairSize, SetType, Function : )
設(shè)置歸一化的隸屬度函數(shù)。
PairSize:優(yōu)先的邊緣對寬度
SetType:待選擇的模糊集合
Function :隸屬度函數(shù) -
12.fuzzy_measure_pairs(Image : : MeasureHandle, Sigma, AmpThresh, FuzzyThresh, Transition : RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, RowEdgeCenter, ColumnEdgeCenter, FuzzyScore, IntraDistance, InterDistance)
創(chuàng)建模糊測理論量句柄,提取和矩形或弧線垂直的直線。
AmpThresh:最小的邊緣梯度閾值;
FuzzyThresh:最小的模糊閾值;
FuzzyScore:對所提取邊緣值的模糊評價; -
13.create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)
為匹配準備一個形狀模型。模型產(chǎn)生于多個圖像金字塔級數(shù),并儲存在內(nèi)存中。每個級數(shù)再進行多次旋轉(zhuǎn)。最高的金字塔級數(shù)最少需要四個特征點進行匹配。
Template:定義域用來創(chuàng)建模板的輸入圖像
NzmLevels: 金字塔的最大級別。
AngleStart ;AngleExtent ;AngleStep :匹配旋轉(zhuǎn)開始的角度和終止的角度范圍,角度步長,單位弧度。
Optimization:產(chǎn)生模板的優(yōu)化種類和方法。
Metric :模板被識別的條件。
Contrast:模板圖像物體和背景之間或物體各部分之間的灰度差異值。最小為2個元素的數(shù)組。
MinContrast :最小灰度差異。
ModelID : 模型句柄代碼。 -
14.get_shape_model_contours( : ModelContours : ModelID, Level : )
返回一個形狀模型的多邊形輪廓表示。 -
15.hom_mat2d_identity( : : : HomMat2DIdentity)
創(chuàng)建一個2D轉(zhuǎn)換的齊次變換矩陣—平移矩陣。
-
16.hom_mat2d_translate( : : HomMat2D, Tx, Ty : HomMat2DTranslate)
增加一個平移量到其次變換矩陣HomMat2D中。
-
17.affine_trans_contour_xld(Contours : ContoursAffinTrans : HomMat2D : )
對多邊形輪廓進行2D映射。HomMat2D為齊次變換矩陣,應(yīng)用到輪廓的每一個點。 -
18.wait_seconds( : : Seconds : )
推遲程序執(zhí)行時間。
三、示例:fuse.hdev燈絲測量
main
* fuse.hdev: 測量保險絲的寬度 * dev_update_window ('off') dev_close_window () * **** * 1.取圖、顯示 * **** read_image (Fuse, 'fuse') get_image_size (Fuse, Width, Height) dev_open_window_fit_image (Fuse, 0, 0, Width, Height, WindowID) set_display_font (WindowID, 12, 'mono', 'true', 'false') dev_set_draw ('margin') dev_set_line_width (3) dev_display (Fuse) set_display_font (WindowID, 12, 'mono', 'true', 'false') disp_continue_message (WindowID, 'black', 'true') stop () * **** * 2.創(chuàng)建測量對象 * **** * -> 指定ROI Row := 297 Column := 545 Length1 := 80 Length2 := 10 Angle := rad(90) gen_rectangle2 (ROI, Row, Column, Angle, Length1, Length2) * -> 創(chuàng)建測量對象(準備提取垂直于矩形的直邊,MeasureHandle->檢測矩形的句柄) gen_measure_rectangle2 (Row, Column, Angle, Length1, Length2, Width, Height, 'bilinear', MeasureHandle) dev_display (ROI) disp_continue_message (WindowID, 'black', 'true') stop () * **** * 3.測量 * **** * 提取垂直于矩形或環(huán)形弧的直邊對 * RowEdgeFirst ;ColumnEdgeFirst ;AmplitudeFirst 第一類邊緣點的行列坐標和幅度值 * RowEdgeSecond ;ColumnEdgeSecond ;AmplitudeSecond 第二類邊緣點的行列坐標和幅度值。 * IntraDistance :每個邊緣對之間的距離。 * InterDistance :連續(xù)邊緣對之間的距離。 measure_pairs (Fuse, MeasureHandle, 1, 1, 'negative', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance) disp_continue_message (WindowID, 'black', 'true') stop () * **** * 4.可視化結(jié)果 * **** for i := 0 to |RowEdgeFirst| - 1 by 1* 從一個多邊形(作為元組給出)生成一個XLD輪廓gen_contour_polygon_xld (EdgeFirst, [-sin(Angle + rad(90)) * Length2 + RowEdgeFirst[i],-sin(Angle - rad(90)) * Length2 + RowEdgeFirst[i]], [cos(Angle + rad(90)) * Length2 + ColumnEdgeFirst[i],cos(Angle - rad(90)) * Length2 + ColumnEdgeFirst[i]])gen_contour_polygon_xld (EdgeSecond, [-sin(Angle + rad(90)) * Length2 + RowEdgeSecond[i],-sin(Angle - rad(90)) * Length2 + RowEdgeSecond[i]], [cos(Angle + rad(90)) * Length2 + ColumnEdgeSecond[i],cos(Angle - rad(90)) * Length2 + ColumnEdgeSecond[i]])dev_display (Fuse)dev_display (ROI)dev_set_color ('cyan')dev_display (EdgeFirst)dev_set_color ('magenta')dev_display (EdgeSecond)dev_set_color ('blue')if (i == 0)set_tposition (WindowID, RowEdgeFirst[i] + 5, ColumnEdgeFirst[i] + 20)elseset_tposition (WindowID, RowEdgeFirst[i] - 40, ColumnEdgeFirst[i] + 20)endifwrite_string (WindowID, 'width: ' + IntraDistance[i] + ' pix') endfor disp_continue_message (WindowID, 'black', 'true') stop () * **** * 5.清楚測量對象 * **** close_measure (MeasureHandle) dev_update_window ('on') dev_clear_window ()本例基本步驟:
- 1.輸入灰度圖像
- 2.gen_measure_rectangle2,劃定ROI
- 3.measure_pairs.在ROI內(nèi)測量邊緣對
重要函數(shù)解析:
-
gen_rectangle2 (ROI, Row, Column, Angle, Length1, Length2)
產(chǎn)生一個矩形,以便用于顯示gen_measure_rectangle2的處理范圍 -
gen_measure_rectangle2 (Row, Column, Angle, Length1, Length2, Width, Height, ‘bilinear’, MeasureHandle)
產(chǎn)生的這個矩形框?qū)⒆鳛楦信d趣區(qū)域(即為測量對象創(chuàng)建)
Prepare the extraction of straight edges perpendicular to a rectangle. -
measure_pairs (Fuse, MeasureHandle, 1, 1, ‘negative_strongest’, ‘a(chǎn)ll’, RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
第4個參數(shù)閾值比較重要
總結(jié)
以上是生活随笔為你收集整理的Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV学习笔记(六):非线性滤波-
- 下一篇: AI 趋势