halcon-fuse.hdev
* fuse.hdev: measuring the width of a fuse wire * dev_update_window ('off') dev_close_window () * **** * step: acquire image * **** 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, 'Courier', 'true', 'false') dev_set_draw ('margin') dev_set_line_width (3) dev_display (Fuse) set_display_font (WindowID, 12, 'courier', 'true', 'false') disp_continue_message (WindowID, 'black', 'true') stop () * **** * step: create measure object * **** * -> specify ROI Row := 297 Column := 545 Length1 := 90 Length2 := 10 Angle := rad(90) gen_rectangle2 (ROI, Row, Column, Angle, Length1, Length2) * -> create measure object gen_measure_rectangle2 (Row, Column, Angle, Length1, Length2, Width, Height, 'bilinear', MeasureHandle) dev_display (ROI) disp_continue_message (WindowID, 'black', 'true') stop () * **** * step: measure * **** measure_pairs (Fuse, MeasureHandle, 1, 1, 'negative_strongest', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance) disp_continue_message (WindowID, 'black', 'true') stop () * **** * step: visualize results * **** for i := 0 to |RowEdgeFirst|-1 by 1 row1:= [-sin(Angle+rad(90))*Length2+RowEdgeFirst[i], -sin(Angle-rad(90))*Length2+RowEdgeFirst[i]] column1:=[cos(Angle+rad(90))*Length2+ColumnEdgeFirst[i], cos(Angle-rad(90))*Length2+ColumnEdgeFirst[i]] row2:=[-sin(Angle+rad(90))*Length2+RowEdgeSecond[i], -sin(Angle-rad(90))*Length2+RowEdgeSecond[i]] column2:=[cos(Angle+rad(90))*Length2+ColumnEdgeSecond[i], cos(Angle-rad(90))*Length2+ColumnEdgeSecond[i]] gen_contour_polygon_xld (EdgeFirst, row1, column1) gen_contour_polygon_xld (EdgeSecond, row2, column2) 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) else set_tposition (WindowID, RowEdgeFirst[i] - 40, ColumnEdgeFirst[i]+20) endif write_string (WindowID, 'width: '+IntraDistance[i]+' pix') endfor disp_continue_message (WindowID, 'black', 'true') stop () * **** * step: destroy measure object * **** close_measure (MeasureHandle) dev_update_window ('on') dev_clear_window ()
重要函数解析:
gen_rectangle2 (ROI, Row, Column, Angle, Length1, Length2)
产生一个矩形,以便用于显示gen_measure_rectangle2的处理范围
gen_measure_rectangle2 (Row, Column, Angle, Length1, Length2, Width, Height, 'bilinear', MeasureHandle)
产生的这个矩形框将作为感兴趣区域
Prepare the extraction of straight edges perpendicular to a rectangle.
measure_pairs (Fuse, MeasureHandle, 1, 1, 'negative_strongest', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
第4个参数阈值比较重要
|
其中各点坐标
A:RowEdgeFirst[0],ColumnEdgeFirst[0]
A':RowEdgeSecond[0],ColumnEdgeSecond[0]
B:RowEdgeFirst[1],ColumnEdgeFirst[1]
B':RowEdgeSecon[1],ColumnEdgeSecond[1]
C:RowEdgeFirst[2],ColumnEdgeFirst[2]
C':RowEdgeSecond[2],ColumnEdgeSecond[2]
本例需要的是保险丝的宽度,即IntraDistance
gen_contour_polygon_xld (EdgeFirst, row1, column1)
本例是根据两点坐标产生一个轮廓EdgeFirst,比如row1=[1,2],column=[11,12],则产生的直线的首尾坐标是(1,11)和(2,12)
本例基本步骤:
1.输入灰度图像
2.gen_measure_rectangle2,划定ROI
3.measure_pairs.在ROI内测量边缘对