平面网站设计,如何租用网站服务器,天津小型网站建设,东莞网页设计培训中心前言
1卡尺工具介绍
Halcon中的Metrology方法即为卡尺工具#xff0c;可用来拟合线#xff0c;圆#xff0c;这种方法对于目标比背景很明显的图像尺寸测量是很方便的#xff0c;不需要用blob进行边缘提取等#xff0c;但缺点也很明显#xff0c;需要目标的相对位置基本…前言
1卡尺工具介绍
Halcon中的Metrology方法即为卡尺工具可用来拟合线圆这种方法对于目标比背景很明显的图像尺寸测量是很方便的不需要用blob进行边缘提取等但缺点也很明显需要目标的相对位置基本不变才行。
2匹配方法概念
HDevelop开发环境中提供的匹配的方法有三种即Component-Based、Gray-Value-Based、Shape-Based,分别是基于组件的匹配基于灰度值的匹配和基于形状的匹配本文所用的例程方法为基于形状的匹配。
例程详解
**模型的名字为基于形状的匹配方法
AlignmentMode : shape-based matching
* AlignmentMode : region processing区域
* AlignmentMode : rigid transformation刚性变换
*
* 初始化视图
dev_update_off ()
dev_close_window ()
dev_set_draw (margin)
gen_empty_obj (EmptyObject)
read_image (Image, metal-parts/circle_plate_01)
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 16, mono, true, false)* Part I:
*
* 初始化卡尺模型
* 定义相机参数
gen_cam_par_area_scan_division (0.0128649, -661.434, 5.30004e-006, 5.3e-006, 620.043, 497.402, Width, Height, CameraParam)
* 测量平面的位姿是通过标定板标定得到的懂标定的自然懂。
MeasurementPlane : [0.00940956,-0.00481017,0.29128,0.478648,359.65,0.785,0]
* 根据零件的高度和校准板的高度调整测量平面的位姿
CalibPlateThickness : 0.006
PartHeight : 0.005
AdjustThickness : CalibPlateThickness - PartHeight
set_origin_pose (MeasurementPlane, 0, 0, AdjustThickness, MeasurementPlaneAdjusted)
*
* 创建标定模型并准备标定测量
create_metrology_model (MetrologyHandle)
* 提前设置图像大小以加快第一次调用apply_metrology_model的速度
set_metrology_model_image_size (MetrologyHandle, Width, Height)
* 在卡尺模型里设置相机参数
set_metrology_model_param (MetrologyHandle, camera_param, CameraParam)
* 设置被测对象的位姿
set_metrology_model_param (MetrologyHandle, plane_pose, MeasurementPlaneAdjusted)
*
* Add the objects to be measured to the metrology model
*
* 添加圆的参数由上图可知有四个完整的圆行列坐标半径
CircleParam : [354,274,53]
CircleParam : [CircleParam,350,519,53]
CircleParam : [CircleParam,345,764,52]
CircleParam : [CircleParam,596,523,53]
add_metrology_object_generic (MetrologyHandle, circle, CircleParam, 20, 5, 1, 30, [], [], CircleIndices1)
*
* 添加两个残缺的圆。
CircleParam1 : [583,1010,79]
CircleParam2 : [336,1005,77]
*角度不同故写了两次
add_metrology_object_generic (MetrologyHandle, circle, CircleParam1, 20, 5, 1, 30, [start_phi,end_phi], [0,rad(185)], CircleIndices2)
add_metrology_object_generic (MetrologyHandle, circle, CircleParam2, 20, 5, 1, 30, [start_phi,end_phi], [rad(45),rad(185)], Index3)
CircleIndices2 : [CircleIndices2,Index3]
*
* 添加一个矩形
RectangleParam : [599,279,rad(90),62,51]
add_metrology_object_generic (MetrologyHandle, rectangle2, RectangleParam, 20, 5, 1, 30, [], [], RectIndices)* 添加两条线边界线
Line1 : [143,1122,709,1132]
Line2 : [151,153,136,1115]
add_metrology_object_generic (MetrologyHandle, line, [Line1,Line2], 20, 5, 1, 30, [], [], LineIndices)
* 检查已添加到计量模型中的形状
get_metrology_object_model_contour (ModelContour, MetrologyHandle, all, 1.5)
get_metrology_object_measures (MeasureContour, MetrologyHandle, all, all, Row, Column)
Message : This example shows how to measure geometric shapes using a
Message[1] : metrology model. As preparation, their roughly known
Message[2] : dimensions and tolerances are specified by the user.
show_contours (Image, ModelContour, MeasureContour, EmptyObject, WindowHandle, Message)
stop ()* Part 2:
*
* 准备匹配
*
* a) Shape-based matching
if (AlignmentMode shape-based matching)dev_set_part (-Height / 2 - 100, -Width / 2, 1.5 * Height - 100, 1.5 * Width)* * 创建用于图像中计量模型匹配的形状模型其中对象的位置和方向与用于创建模型的图像中对象的位置和方向不同。* 得到当前halcon系统的参数值get_system (border_shape_models, BorderShapeModel)set_system (border_shape_models, true)*阈值处理并截取区域threshold (Image, Region, 0, 50)dilation_rectangle1 (Region, ModelRegion, 5, 5)reduce_domain (Image, ModelRegion, ImageReduced)*创建用于匹配的模型参数Template : : 金字塔级的数量, 起始角度, 角度范围, 角度的步长优化的类型, 匹配度规, 阈值, 目标最小对比值 : ModelIDcreate_shape_model (ImageReduced, 6, 0, rad(360), auto, auto, use_polarity, auto, 20, ShapeModelID)*将模型的原点设置为输入区域的中心area_center (ModelRegion, Area, RowModel, ColumnModel)*得到形状模型的轮廓get_shape_model_contours (ShapeModelContours, ShapeModelID, 1)Message : A shape model will be used for the alignment of the metrologyMessage[1] : model. The contours of the shape model (white) and of theMessage[2] : metrology model (blue) are shown.show_contours (Image, ModelContour, EmptyObject, ShapeModelContours, WindowHandle, Message)* * 更改定义卡尺模型的参考系统使之与形状模型所使用的对应。set_metrology_model_param (MetrologyHandle, reference_system, [RowModel,ColumnModel,0])*得到卡尺模型的轮廓参数模型轮廓句柄卡尺测量对象的索引相邻两个轮廓点的距离get_metrology_object_model_contour (ModelContour, MetrologyHandle, all, 1.5)Message : To prepare the alignment, the origin of the shape modelMessage[1] : is set as the reference system of the metrology model.show_contours (Image, ModelContour, EmptyObject, ShapeModelContours, WindowHandle, Message)stop ()dev_set_part (0, 0, Height - 1, Width - 1)
endif
* *另外两种匹配模型基于区域和仿射变换。
* b) Region processing
if (AlignmentMode region processing)* Determine reference position and orientationthreshold (Image, Region, 0, 50)fill_up (Region, RegionFillUp)difference (RegionFillUp, Region, OriginalRegion)area_center (OriginalRegion, Area, RowOrig, ColumnOrig)orientation_region (OriginalRegion, AngleOrig)* Change the reference system of the metrology modelset_metrology_model_param (MetrologyHandle, reference_system, [RowOrig,ColumnOrig,AngleOrig])
endif
*
* c) Rigid transformation
if (AlignmentMode rigid transformation)* Reference points:extract_reference_points (Image, RowReference, ColumnReference)gen_cross_contour_xld (ReferencePoints, RowReference, ColumnReference, 15, 0.785398)dev_display (Image)dev_set_color (white)dev_display (ReferencePoints)Message : To prepare the alignment, reference points are extracted.disp_message (WindowHandle, Message, window, 12, 12, black, true)disp_message (WindowHandle, [1:4], image, RowReference, ColumnReference, black, true)stop ()
endif
* * 线上阶段
for I : 2 to 5 by 1read_image (CurrentImage, metal-parts/circle_plate_ I$02d)dev_set_line_width (1)dev_display (CurrentImage)* * a) Shape-based matchingif (AlignmentMode shape-based matching)* * 测量物体的位置和方向使用find_shape_model算子。* 参数测试图句柄搜索角度范围模型实例的最小分数模型数量最大重叠度亚像素精度金字塔层数* 搜索贪婪度这个值在很大程度上影响着搜索速度若为0则为启发式搜索若为1则为不安全搜索模型的行坐标列坐标角度分数find_shape_model (CurrentImage, ShapeModelID, 0, rad(360), 0.5, 1, 0, least_squares, 5, 0.9, RowAlign, ColumnAlign, AngleAlign, Score)dev_display_shape_matching_results (ShapeModelID, white, RowAlign, ColumnAlign, AngleAlign, 1, 1, 0)endif* * b) Region processingif (AlignmentMode region processing)* Determine the current position and orientationthreshold (CurrentImage, Region, 0, 50)fill_up (Region, RegionFillUp)difference (RegionFillUp, Region, CurrentRegion)area_center (CurrentRegion, Area, RowAlign, ColumnAlign)orientation_region (CurrentRegion, AngleAlign)endif* * c) Rigid transformationif (AlignmentMode rigid transformation)* Referenzpunkte:extract_reference_points (CurrentImage, RowExtracted, ColumnExtracted)gen_cross_contour_xld (ExtractedPoints, RowExtracted, ColumnExtracted, 15, 0.785398)dev_display (CurrentImage)dev_set_color (white)dev_display (ExtractedPoints)disp_message (WindowHandle, [1:4], image, RowExtracted, ColumnExtracted, black, true)vector_to_rigid (RowReference, ColumnReference, RowExtracted, ColumnExtracted, HomMat2D)hom_mat2d_to_affine_par (HomMat2D, Sx, Sy, AngleAlign, Theta, RowAlign, ColumnAlign)endif* * 使用计算的位置和方向将计量模型与当前发生的事件对齐align_metrology_model (MetrologyHandle, RowAlign, ColumnAlign, AngleAlign)* 展示匹配效果if (I 2)**展示提取的轮廓get_metrology_object_model_contour (ModelContour, MetrologyHandle, all, 1.5)dev_set_color (blue)dev_set_line_width (2)dev_display (ModelContour)Message : In each image, the object is matched and alignedMessage[1] : before the metrology measurement.disp_message (WindowHandle, Message, window, 12, 12, black, true)disp_continue_message (WindowHandle, black, true)stop ()endif* *在一次调用中对所有计量对象执行测量apply_metrology_model (CurrentImage, MetrologyHandle)* 获取测量区域以进行可视化get_metrology_object_measures (Contour, MetrologyHandle, all, all, Row, Column)* 获取用于拟合几何形状的边缘点get_metrology_object_result (MetrologyHandle, all, all, used_edges, row, UsedRow)get_metrology_object_result (MetrologyHandle, all, all, used_edges, column, UsedColumn)gen_cross_contour_xld (UsedEdges, UsedRow, UsedColumn, 10, rad(45))* * 获取测量结果* 由于设置了摄像机参数所有结果都以相对于测量平面所定义的坐标系的度量坐标给出* * 得到所有的轮廓目标get_metrology_object_result_contour (ResultContours, MetrologyHandle, all, all, 1.5)* 提取小圆的半径get_metrology_object_result (MetrologyHandle, CircleIndices1, all, result_type, radius, RadiusC1)* 提取较大的不完整圆的半径get_metrology_object_result (MetrologyHandle, CircleIndices2, all, result_type, radius, RadiusC2)* 提取矩形边的长度get_metrology_object_result (MetrologyHandle, RectIndices, all, result_type, length1, Length1R)get_metrology_object_result (MetrologyHandle, RectIndices, all, result_type, length2, Length2R)* 获取每条测量线的起点和终点get_metrology_object_result (MetrologyHandle, LineIndices[0], all, result_type, all_param, ParamLine1)get_metrology_object_result (MetrologyHandle, LineIndices[1], all, result_type, all_param, ParamLine2)* Display the resultsdev_display (CurrentImage)dev_set_line_width (1)dev_set_color (light gray)dev_display (Contour)dev_set_color (green)dev_set_line_width (2)dev_display (ResultContours)dev_set_line_width (1)dev_set_color (white)dev_display (UsedEdges)* * 显示圆心处每个圆的半径* 获取圆心的度量坐标get_metrology_object_result (MetrologyHandle, CircleIndices1, all, result_type, x, XC1)get_metrology_object_result (MetrologyHandle, CircleIndices1, all, result_type, y, YC1)* 将圆心的度量坐标投影到图像中得到圆心的图像坐标project_xy_to_image (XC1, YC1, MeasurementPlaneAdjusted, CameraParam, Row1, Column1)get_metrology_object_result (MetrologyHandle, CircleIndices2, all, result_type, x, XC2)get_metrology_object_result (MetrologyHandle, CircleIndices2, all, result_type, y, YC2)project_xy_to_image (XC2, YC2, MeasurementPlaneAdjusted, CameraParam, Row2, Column2)disp_message (WindowHandle, r (RadiusC1 * 1000)$.2f, image, Row1, Column1 - 80, black, true)disp_message (WindowHandle, r (RadiusC2 * 1000)$.2f, image, Row2, Column2 - 80, black, true)get_metrology_object_result (MetrologyHandle, RectIndices, all, result_type, x, XRectangle)get_metrology_object_result (MetrologyHandle, RectIndices, all, result_type, y, YRectangle)project_xy_to_image (XRectangle, YRectangle, MeasurementPlaneAdjusted, CameraParam, RowR, ColumnR)Area : Length1R * Length2R * 4 * 1000 * 1000disp_message (WindowHandle, area Area$.2f, image, RowR, ColumnR - 120, black, true)Message : Measured metric results after alignment (r in mm, area in mm^2):* disp_message (WindowHandle, Message, window, 12, 12, black, true)if (I 5)disp_continue_message (WindowHandle, black, true)endifstop ()endfor
if (AlignmentMode shape-based matching)set_system (border_shape_models, BorderShapeModel)
endif总结
卡尺工具在halcon中的使用比较简单基于匹配的卡尺测量分为以下几个步骤:
创建卡尺模型添加测量项信息create_metrology_model add_metrology_object_generic。创建用于形状匹配的匹配模型create_shape_model。用匹配模型与实际图像进行匹配find_shape_model展示匹配结果get_metrology_object_model_contourapply_metrology_modelget_metrology_object_measuresget_metrology_object_result。