测量图中工件的水平边缘对距离,应用到的主要算子:measure_pairs
measure_pairs算子参数:图像、测量句柄、平滑参数(越大越平滑)、边缘幅度最小值、边缘类型(positive正边缘:由暗到亮、negative负边缘:由亮到暗)、选哪条边、第一个边缘中心行列坐标、第一条边边缘幅度、第二个边缘中心行列坐标、第二条边边缘幅度、一个边缘对的两条边之间的距离、两组边缘对的中心点距离。
上代码。
*测量边缘对 2020/04/01
*更新
dev_update_window('off')
dev_update_pc ('off')
dev_update_var ('off')
dev_close_window ()
*读入图片
read_image (MetalParts10, 'C:/metal-parts-10.png')
get_image_size (MetalParts10, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_open_window (Height + 70, 0, Width, 120, 'black', WindowHandleText)
dev_set_window (WindowHandle)
dev_display (MetalParts10)
threshold (MetalParts10, Regions, 115, 255)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1836.92, 17069.9)
shape_trans (SelectedRegions, RegionTrans, 'rectangle2')
orientation_region (RegionTrans, Phi)
area_center (RegionTrans, Area, Row, Column)
vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(90), HomMat2D)
affine_trans_image (MetalParts10, ImageAffineTrans, HomMat2D, 'constant', 'false')
set_display_font (WindowHandle, 16, 'mono', 'false', 'false')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*形成矩形
Row := 205
Column := 209
Length1 := 80
Length2 := 10
Angle := rad(0)
dev_set_draw ('margin')
dev_set_color ('red')
dev_set_line_width (2)
gen_rectangle2 (ROI, Row, Column, Angle, Length1, Length2)
*得到测量矩形
gen_measure_rectangle2 (Row, Column, Angle, Length1, Length2, Width, Height, 'bilinear', MeasureHandle)
dev_display (ROI)
stop ()
*测量
count_seconds (Seconds)
measure_pairs (ImageAffineTrans, MeasureHandle, 1, 50, 'all', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
count_seconds (Seconds1)
time:= (Seconds1-Seconds)*1000
avgPinWidth := sum(IntraDistance) / |IntraDistance|
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*显示
if(|InterDistance| > 0)
for i := 0 to |RowEdgeFirst| - 1 by 1
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_set_color ('cyan')
dev_display (EdgeFirst)
dev_set_color ('magenta')
dev_display (EdgeSecond)
dev_set_color ('cyan')
if(i=0)
set_tposition (WindowHandle, RowEdgeFirst[i] +60, ColumnEdgeFirst[i] -50)
write_string (WindowHandle, 'The first distance: '+IntraDistance[i]$'5.2f'+' pix')
endif
if(i=1)
set_tposition (WindowHandle, RowEdgeFirst[i] + 20, ColumnEdgeFirst[i] + 20)
write_string (WindowHandle, 'The second distance: '+IntraDistance[i]$'5.2f'+' pix')
endif
endfor
set_display_font (WindowHandleText, 20, 'mono', 'true', 'false')
disp_message (WindowHandleText, 'center distance: '+InterDistance$'5.2f'+' pix' , 'image', 20, 20, 'yellow', 'false')
disp_message (WindowHandleText, 'average distance: '+avgPinWidth$'5.2f'+' pix' , 'image', 50, 20, 'green', 'false')
disp_message (WindowHandleText, 'Measuring time: '+time$'5.2f'+' ms' , 'image', 80, 20, 'blue', 'false')
endif
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*关闭测量句柄
close_measure (MeasureHandle)
dev_update_window ('on')
dev_clear_window ()
测量结果
原图