Halcon operator measure_pos and measure_pairs classic case

No nonsense, just go to the code.

*测量引线的长度,然后测量它们之间的宽度和距离
*测量引线的个数
read_image (Image, 'ic_pin')
get_image_pointer1 (Image, Pointer, Type, Width, Height)
dev_close_window ()
dev_open_window_fit_image (Image, 0, 0, 509, 509, WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_display (Image)
dev_set_draw ('margin')
dev_set_line_width (3)
* 
* 定义检测边缘的矩形roi参数
Row := 55
RowBottom := 955
Column := 200
*角度-90度,代表的是以水平线顺时针旋转90度。这样子卡尺搜索方向刚好是从上到下,与水平轴夹角90
Phi := rad(-90)
Length1 := 50
Length2 := 35
dev_set_color ('gray')
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
gen_rectangle2 (Rectangle, RowBottom, Column, Phi, Length1, Length2)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
*为图像顶部的ROI创建一个测量对象。
Interpolation := 'nearest_neighbor'
gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, Interpolation, MeasureHandle)
* 
* measure_pos测量参数赋值
Sigma := 1.0
Threshold := 30
Transition := 'all'
Select := 'all'
measure_pos (Image, MeasureHandle, Sigma, Threshold, Transition, Select, RowEdge, ColumnEdge, Amplitude, Distance)
LeadLength1 := Distance
* 
* Display the results
dev_set_color ('white')
disp_line (WindowHandle, RowEdge, ColumnEdge - Length2, RowEdge, ColumnEdge + Length2)
disp_message (WindowHandle, 'Lead Length:  ' + LeadLength1$'.2f', 'window', RowEdge[1] + 40, ColumnEdge[1] + 100, 'yellow', 'false')
* 
* 转换测量模型的中心点到图像底部Roi(RowBottom, Column)
translate_measure (MeasureHandle, RowBottom, Column)
measure_pos (Image, MeasureHandle, Sigma, Threshold, Transition, Select, RowEdge, ColumnEdge, Amplitude, Distance)
LeadLength2 := Distance
* 
* Display the results
dev_set_color ('white')
disp_line (WindowHandle, RowEdge, ColumnEdge - Length2, RowEdge, ColumnEdge + Length2)
disp_message (WindowHandle, 'Lead Length:  ' + LeadLength2$'.2f', 'window', RowEdge[1] - 120, ColumnEdge[1] + 100, 'yellow', 'false')
* 
* Close the measure
close_measure (MeasureHandle)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* 现在,定义并显示垂直于引线的矩形ROI
dev_display (Image)
Row := 47
Column := 485
*角度0度,代表的是卡尺搜索方向刚好是从左到右,与水平轴夹角0
Phi := 0
Length1 := 420
Length2 := 8
Interpolation := 'nearest_neighbor'
dev_set_color ('black')
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, Interpolation, MeasureHandle)
* 
* Determine all edge pairs that have a negative transition, i.e., edge pairs
* that enclose dark regions.
Sigma := 1.0
Threshold := 30
Transition := 'negative'
Select := 'all'
*RowEdgeFirst,ColumnEdgeFirst是negative模式下,同一对卡尺找到的白到黑的边。RowEdgeSecond,ColumnEdgeSecond则是同一对卡尺找到的黑到白的边
*当Transition为all时,RowEdgeFirst是同一对卡尺找到的第一条边,不分极性。RowEdgeSecond是同一对卡尺找到的第二条边,不分极性。
*AmplitudeFirst,AmplitudeSecond是边缘振幅
*IntraDistance同一对卡尺对中间的距离。InterDistance是相邻两对卡尺对之间的边距离。所以IntraDistance个数比InterDistance多1
measure_pairs (Image, MeasureHandle, Sigma, Threshold, Transition, Select, RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_set_color ('white')
disp_line (WindowHandle, RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond)
avgLeadWidth := sum(IntraDistance) / |IntraDistance|
avgLeadDistance := sum(InterDistance) / |InterDistance|
numLeads := |IntraDistance|
disp_message (WindowHandle, 'Number of Leads: ' + numLeads, 'window', 200, 100, 'yellow', 'false')
disp_message (WindowHandle, 'Average Lead Width:  ' + avgLeadWidth$'.2f', 'window', 260, 100, 'yellow', 'false')
disp_message (WindowHandle, 'Average Lead Distance:  ' + avgLeadDistance$'.2f', 'window', 320, 100, 'yellow', 'false')
disp_continue_message (WindowHandle, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
*放大以更详细地显示测量结果。
*首先,定义并显示缩放窗口。
Row1 := 0
Column1 := 600
Row2 := 100
Column2 := 700
dev_set_color ('blue')
disp_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* Then, zoom the image and display the results.
dev_set_part (Row1, Column1, Row2, Column2)
dev_display (Image)
dev_set_color ('black')
dev_display (Rectangle)
p_disp_edge_marker (RowEdgeFirst, ColumnEdgeFirst, Phi, 5, 'white', 3, WindowHandle)
p_disp_edge_marker (RowEdgeSecond, ColumnEdgeSecond, Phi, 5, 'white', 3, WindowHandle)
* 
* Close the measure
close_measure (MeasureHandle)
* 
* Reset the display parameters.
dev_set_part (0, 0, Height - 1, Width - 1)
dev_set_draw ('fill')
dev_set_line_width (1)

Original image
insert image description here
Process image
insert image description here
insert image description here
insert image description here
insert image description here

おすすめ

転載: blog.csdn.net/Douhaoyu/article/details/128386504