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个参数阈值比较重要
  
  
 