Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例
一.基本概念
基本流程为:
- 获取图像
- 对图像进行灰度值标定
(针对相机获取的图像灰度和输入能量之间的非线性关系,获得相机对输入能量的线性函数) - 排列感兴趣区域或图像
- 校正图像
- 创建测量句柄
- 进行测量
- 将测量结果转换到世界坐标系
- 结果可视化
- 释放测量句柄。
二.典型相关算子:
-
1.gen_rectangle2( : Rectangle : Row, Column, Phi, Length1, Length2 : )
创建任意方向的一个矩形,控制输入分别为矩形中心的行列坐标,矩形纵向与水平方向的夹角,长和宽的一半。 -
2.gen_measure_rectangle2( : : Row, Column, Phi, Length1, Length2, Width, Height, Interpolation : MeasureHandle)
产生测量句柄,准备提取和矩形主轴垂直的直边缘。插值方法有:‘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 :连续边缘对之间的距离。 -
4.get_points_ellipse( : : Angle, Row, Column, Phi, Radius1, Radius2 : RowPoint, ColPoint)
返回椭圆上某一点,该点与椭圆中线连线和椭圆长轴正方向成角为参数Angle。
Row, Column, Phi, Radius1, Radius2:为椭圆的参数
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)
产生圆弧测量句柄,提取和圆弧垂直的直线。
AnnulusRadius:为沿着半径方向测量宽度的一半。 -
7.count_seconds( : : : Seconds)
程序执行时间测量算子。
Eg. count_seconds(Start)* program segment to be measuredcount_seconds(End)Seconds := End - Start
- 8.measure_pos(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdge, ColumnEdge, Amplitude, Distance)
提取和矩形或者弧垂直的边缘线。
RowEdge, ColumnEdge:提取的边缘线与测量弧线或测量矩形的交点坐标,为亚像素精度,改算子常和循环配合使用。
Distance:连续边缘线之间的距离。
-
9.distance_pp( : : Row1, Column1, Row2, Column2 : Distance)
计算两点之间的距离。 -
10.create_funct_1d_pairs( : : XValues, YValues : Function)
根据一系列的(x,y)坐标值创建一个函数。X坐标值会被升序排列。 -
11.set_fuzzy_measure_norm_pair( : : MeasureHandle, PairSize, SetType, Function : )
设置归一化的隶属度函数。
PairSize:优先的边缘对宽度
SetType:待选择的模糊集合
Function :隶属度函数 -
12.fuzzy_measure_pairs(Image : : MeasureHandle, Sigma, AmpThresh, FuzzyThresh, Transition : RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, RowEdgeCenter, ColumnEdgeCenter, FuzzyScore, IntraDistance, InterDistance)
创建模糊测理论量句柄,提取和矩形或弧线垂直的直线。
AmpThresh:最小的边缘梯度阈值;
FuzzyThresh:最小的模糊阈值;
FuzzyScore:对所提取边缘值的模糊评价; -
13.create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)
为匹配准备一个形状模型。模型产生于多个图像金字塔级数,并储存在内存中。每个级数再进行多次旋转。最高的金字塔级数最少需要四个特征点进行匹配。
Template:定义域用来创建模板的输入图像
NzmLevels: 金字塔的最大级别。
AngleStart ;AngleExtent ;AngleStep :匹配旋转开始的角度和终止的角度范围,角度步长,单位弧度。
Optimization:产生模板的优化种类和方法。
Metric :模板被识别的条件。
Contrast:模板图像物体和背景之间或物体各部分之间的灰度差异值。最小为2个元素的数组。
MinContrast :最小灰度差异。
ModelID : 模型句柄代码。 -
14.get_shape_model_contours( : ModelContours : ModelID, Level : )
返回一个形状模型的多边形轮廓表示。 -
15.hom_mat2d_identity( : : : HomMat2DIdentity)
创建一个2D转换的齐次变换矩阵—平移矩阵。
-
16.hom_mat2d_translate( : : HomMat2D, Tx, Ty : HomMat2DTranslate)
增加一个平移量到其次变换矩阵HomMat2D中。
-
17.affine_trans_contour_xld(Contours : ContoursAffinTrans : HomMat2D : )
对多边形轮廓进行2D映射。HomMat2D为齐次变换矩阵,应用到轮廓的每一个点。 -
18.wait_seconds( : : Seconds : )
推迟程序执行时间。
三、示例: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.创建测量对象
* ****
* -> 指定ROI
Row := 297
Column := 545
Length1 := 80
Length2 := 10
Angle := rad(90)
gen_rectangle2 (ROI, Row, Column, Angle, Length1, Length2)
* -> 创建测量对象(准备提取垂直于矩形的直边,MeasureHandle->检测矩形的句柄)
gen_measure_rectangle2 (Row, Column, Angle, Length1, Length2, Width, Height, 'bilinear', MeasureHandle)
dev_display (ROI)
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* 3.测量
* ****
* 提取垂直于矩形或环形弧的直边对
* RowEdgeFirst ;ColumnEdgeFirst ;AmplitudeFirst 第一类边缘点的行列坐标和幅度值
* RowEdgeSecond ;ColumnEdgeSecond ;AmplitudeSecond 第二类边缘点的行列坐标和幅度值。
* IntraDistance :每个边缘对之间的距离。
* InterDistance :连续边缘对之间的距离。
measure_pairs (Fuse, MeasureHandle, 1, 1, 'negative', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* 4.可视化结果
* ****
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内测量边缘对
重要函数解析:
-
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个参数阈值比较重要