1.5 halcon上位机芯片引脚高度宽度间距的测量
*关闭当前活跃窗口
dev_close_window ()
*从磁盘读取图片到Image用于后续处理;
read_image (Image, 'ic_pin')
*获取图片长宽
get_image_size (Image, Width, Height)
*打开一新窗口,长宽为图片长宽一半
dev_open_window (0, 0, Width / 2, Height / 2, 'black', WindowHandle)
*设置窗口字体,mono类型,14大小,粗体 ,不用斜体。
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
*显示图像
dev_display (Image)
*窗口右下角显示 “press fun f5 to continue”
disp_continue_message (WindowHandle, 'black', 'true')
*暂停程序 执行
stop ()
* draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2)
*下面为矩形相关变量赋值
Row := 47
Column := 485
Phi := 0
Length1 := 420
Length2 := 10
*设置绘制图形颜色为绿色
dev_set_color ('green')
*设置边缘绘制的方法
dev_set_draw ('margin')
*设置线宽为3
dev_set_line_width (3)
*生成矩形,在些矩形 区域内进行浏览量 ,rectangle为生成的矩形变量,ROW COLUMN为矩形 中心的行列坐标
*Phi为矩形 的倾斜角,Length1, Length2为矩形的半宽,半高。
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
*row column为测量矩形 的直剖布线中心点的行列坐标,PHI为直剖面线的方向 ,可以结合 测量矩形
*的图来理解 ,也就是这条直线的倾斜角度,以水平向右为起始 边,逆时针方向为正,反之则反。
*Length1, Length2为矩形 的半宽半高,Width, Height为前面图像的高度宽度。
*'nearest_neighbor'表示 采用近邻插值算法。为函数输入的测量矩形 的句柄。
*gen_measure_rectangle2函数不测量的每步.
gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, 'nearest_neighbor', MeasureHandle)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*更新PC为关状态
dev_update_pc ('off')
*更新变量为关状态
dev_update_var ('off')
n := 100
*获取当前时间赋值给变量,单位 为秒。
count_seconds (Seconds1)
*循环对每一引脚进行测量
for i := 1 to n by 1
*此函数在前面生成的矩形范围内进行测量。Image为输入 图像 ,MeasureHandle为前面生成的矩形 句柄 ,1.5为
*高斯光滑系数,对应测量助手 的那个平滑系数,30为最小边缘幅度,对应助手电波边缘幅度;
*negativege表示找的是负的边缘,也就是由这到暗的边缘对,ALL表示选择全部边缘对
*rowedgefirst,ColumnEdgeFirst表示边缘对中第一条边缘的中心行列坐标。第一条的定义是从测量方向 起点 开始
*AmplitudeFirst边缘对第一个边缘振幅,也就是灰度值。RowEdgeSecond, ColumnEdgeSecond
*表示边缘对中第二条边缘的中心行列坐标,AmplitudeSecond边缘对第二个边缘振幅
* PinWidth边缘对宽度; PinDistance相邻连续两边缘对的距离 。
*此函数的参数 都是基于亚像素计算,也就是像素 级别是浮点 型。
measure_pairs (Image, MeasureHandle, 1.5, 30, 'negative', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, PinWidth, PinDistance)
endfor
count_seconds (Seconds2)
*计算花费时间
Time := Seconds2 - Seconds1
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_set_color ('red')
*将检测到的引脚的边缘对用直线画出来,WindowHandle为窗口句柄 ,ColumnEdgeFirst, RowEdgeSecond为直线的起点行列坐标
*这里是数组形式,因为为多条线。RowEdgeSecond, ColumnEdgeSecond为直线的终点行列坐标
disp_line (WindowHandle, RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond)
*显示计算的结果信息
avgPinWidth := sum(PinWidth) / |PinWidth|
avgPinDistance := sum(PinDistance) / |PinDistance|
numPins := |PinWidth|
dev_set_color ('yellow')
disp_message (WindowHandle, 'Number of pins: ' + numPins, 'image', 200, 100, 'yellow', 'false')
disp_message (WindowHandle, 'Average Pin Width: ' + avgPinWidth, 'image', 260, 100, 'yellow', 'false')
disp_message (WindowHandle, 'Average Pin Distance: ' + avgPinDistance, 'image', 320, 100, 'yellow', 'false')
* dump_window (WindowHandle, 'tiff_rgb', 'C:\\Temp\\pins_result')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
Row1 := 0
Column1 := 600
Row2 := 100
Column2 := 700
dev_set_color ('blue')
disp_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
stop ()
*设置要显示图像的部位 ,其实就是实现 放大图像,显示指定的引脚区域
dev_set_part (Row1, Column1, Row2, Column2)
dev_display (Image)
dev_set_color ('green')
dev_display (Rectangle)
dev_set_color ('red')
disp_line (WindowHandle, RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*关闭之前用gen_measure_rectangle2生成的测量矩形,释放资源
close_measure (MeasureHandle)
dev_set_part (0, 0, Height - 1, Width - 1)
dev_display (Image)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_set_color ('green')
* draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2)
Row := 508
Column := 200
Phi := -1.5708
Length1 := 482
Length2 := 35
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
*再生成一个矩形区域,用于计算引脚高度
gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, 'nearest_neighbor', MeasureHandle)
stop ()
*measure_pos也为一测量函数,用于测量边缘音距离 ,Image为输入图像, MeasureHandle为输入窗口句柄 ,
*1.5为高斯平滑系数, 30为最小边缘幅度值, 'all'检测所有正负边缘, 'all'表示选中所有边缘,
*RowEdge, ColumnEdge边缘中心行列坐标, Amplitude边缘幅度大小, Distance边缘间距
measure_pos (Image, MeasureHandle, 1.5, 30, 'all', 'all', RowEdge, ColumnEdge, Amplitude, Distance)
*第二边缘行坐标减去第一边缘行坐标为上边引脚的高度
PinHeight1 := RowEdge[1] - RowEdge[0]
PinHeight2 := RowEdge[3] - RowEdge[2]
dev_set_color ('red')
disp_line (WindowHandle, RowEdge, ColumnEdge - Length2, RowEdge, ColumnEdge + Length2)
disp_message (WindowHandle, 'Pin Height: ' + PinHeight1, 'image', RowEdge[1] + 40, ColumnEdge[1] + 100, 'yellow', 'false')
disp_message (WindowHandle, 'Pin Height: ' + PinHeight2, 'image', RowEdge[3] - 120, ColumnEdge[3] + 100, 'yellow', 'false')
* dump_window (WindowHandle, 'tiff_rgb', 'C:\\Temp\\pins_height_result')
close_measure (MeasureHandle)
dev_set_draw ('fill')
dev_set_line_width (1)
1.5 halcon上位机芯片引脚高度宽度间距的测量
|