Halcon学习之测量、拟合、卡尺

一、一维测量
基本流程:
1.采集图像
2.产生测量矩形或弧形
gen_measure_rectangle();
gen_measure_arc();
3.测量:
measure_pos();边缘测量
measure_pairs();测量对
4.关闭测量:close_measure();

常用算子参数说明:
gen_measure_rectangle2 (Row, Column, Angle, Length1, Length2, Width, Height, ‘bilinear’, MeasureHandle)
参数1:矩形中心的行坐标
参数2:矩形中心的列坐标
参数3:角度
参数4:矩形的半宽
参数5:矩形的半高
参数6:图像的宽
参数7:图像的高
参数8:插值算法
参数9:测量句柄

gen_measure_arc( : : CenterRow, CenterCol, Radius, AngleStart, AngleExtent, AnnulusRadius, Width, Height, Interpolation : MeasureHandle)
参数1:圆弧中心的行坐标
参数2:圆弧中心的列坐标
参数3:半径
参数4:起始角度
参数5:角度范围
参数6:环形带的半径(宽度的一半)
参数7:图像的宽度
参数8:图像的高
参数9:插值方式
参数10:测量对象句柄

measure_pairs(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
参数1:图像
参数2:测量句柄
参数3:平滑系数
参数4:阈值(用于提取边缘)
参数5:角度范围极性(边缘对第一个边缘的极性,两个边缘的极性相反)。取值范围:
‘all’, ‘all_strongest’, ‘negative’, ‘negative_strongest’, ‘positive’, ‘positive_stronge
st’,缺省值:‘all’。
参数6:选择边缘点。取值范围:‘all’(选择所有边缘对),‘first’(第一个边缘
对),‘last’(最后一个边缘对)。
参数7:边缘点对的第一个边缘的中心 行 坐标。
参数8:边缘点对的第一个边缘的中心 列 坐标。
参数9:边缘点对的第一个边缘的幅度(带符号)。
参数10:边缘点对的最后一个边缘的中心 行 坐标。
参数11:边缘点对的最后一个边缘的中心 列 坐标。
参数12:边缘点对的第二个边缘的幅度(带符号)
参数13:边缘对中两个边缘间的距离。
参数14:相邻边缘对之间的距离

measure_pos(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdge, ColumnEdge, Amplitude, Distance)
参数1:图像
参数2:测量句柄
参数3:高斯平滑参数。值越大越平滑,缺省值:1。
参数4:最小边缘幅度(灰度值)。值越小,获取的边缘线越多。
参数5:极性(白到黑,或黑到白)。取值范围:‘all’(所有极性), ‘positive’
(正极性,黑到白),‘negative’(负极性)。
参数6:选择边缘点。取值范围:‘all’(选择所有边缘对),‘first’(第一个边缘
对),‘last’(最后一个边缘对)。
参数7:边缘中心的 行 坐标。
参数8:边缘中心的 列 坐标。
参数9:边缘幅度(灰度值,边缘微分波形振幅,带符号)。
参数10:相邻边缘之间的距离。

二、二维测量和拟合
实现基本流程
1.采集图像
2.预处理(ROI、拉开对比度、去噪、仿射变换)
3.边缘提取(边缘幅度、一阶倒数)
4.边缘轮廓的筛选、分割、联合
5.拟合(最小二乘法)
6.标定计算
7.显示

2.1边缘提取的方式
方式1:edges_sub_pix(Image : Edges : Filter, Alpha, Low, High : )
提取图像精确边缘 (精确边缘就是亚像素边缘)
Image: 输入图像
Edges: 输出边缘轮廓
Filter: 边缘提取算法的名称 (canny,lanser1,'sobel_fast’等算法 )
Alpha: 平滑系数,越小越平滑(除canny外,其越大越平滑)
Low: 低阈值
High: 高阈值
注意canny算法求导方式:
1.高斯平滑滤波(加权均值滤波)在正态分布,离中心越近其权重越大
2.Sobel求梯度(向量,函数上升最快方向)
3.非极大值抑制(极大值为局部最大值,相当与导数处)
4.高低阈值,双阈值处理【20,60】,低于低阈值就去掉,高于高阈值就提取,中间阈值看领域,领域有提取点才接受。

方式2:shape_trans_xld(XLD : XLDTrans : Type : )

方式3:threshold_sub_pix(Image : Border : Threshold : )

2.2分割轮廓
segment_contours_xld(Contours : ContoursSplit : Mode, SmoothCont, MaxLineDist1, MaxLineDist2 : )
参数说明:
Contours 需要进行分割的轮廓。
ContoursSplit 分割后的轮廓tuple。
Mode 分割轮廓的方式,可以选择’lines’(使用直线段分割), ‘lines_circles’(使用直线段和圆(弧)分割), ‘lines_ellipses’(使用直线段和椭圆弧分割)。
SmoothCont 轮廓平滑的参数,可以抑制在折线逼近过程中过短的线段,能更加鲁棒的逼近圆和椭圆。
MaxLineDist1 第一次用Ramer算法(即用直线段递进逼近轮廓)时的MaxLineDist,在逼近完成之后,再用圆弧或椭圆弧对相邻分割线段进行拟合,如果拟合圆弧到轮廓的距离小于逼近线段到轮廓的距离,就用圆弧替代逼近线段,这个过程一致迭代直到所有的线段拟合完毕。
MaxLineDist2 第二次逼近轮廓时的MaxLineDist,只有当MaxLineDist2
这种两步逼近算法效率较高,因为在第一次逼近过程中,递进逼近的直线段较少,因此较大直径的圆弧能够被高效的分割出来。在第二次逼近过程中,能够被小直径圆弧逼近的轮廓被找到,同时大直径圆弧的末端被重新定义。

Remark:
分割得到的轮廓是直线段、圆(圆弧)或者椭圆弧可以通过分割后轮廓的全局属性’cont_approx’参数的值来确定(参考get_contour_global_attrib_xld)。
如果’cont_approx’=-1,这一部分轮廓最适合被拟合为直线段。
如果’cont_approx’=0,这一部分轮廓最适合被拟合为椭圆弧。
如果’cont_approx’=1,这一部分轮廓最适合被拟合为圆弧。

2.3筛选轮廓
方式1:select_shape_xld(XLD:SelectedXLD:Features,Operation,Min,Max:)
XLD:要提取的XLD
SelectedXLD:提取到的XLD
Features:提取XLD的特征依据
Operation:特征之间的逻辑关系(and or)
Min,Max:特征值的要求范围

方式2:select_Contours_xld(Contours:SelectedContours:Features,Min,Max,Min2,Max2:)
作用:选择多种特征要求的XLD轮廓 (如长度 开闭 方向 等特征,不支持多边形)
Contours:要提取的XLD轮廓
SelectedContours:提取到的XLD轮廓
Features:提取XLD轮廓的依据(筛选)
Min,Max,Min2,Max2:特征值的范围

2.4拟合
常用拟合算子:
fit_line_contour_xld:拟合直线
fit_circle_contour_xld:拟合圆
fit_ellipse_contour_xld:拟合椭圆
fit_retangle2_contour_xld:拟合矩形

算子详解:
1.fit_circle_contour_xld(Contours:: Algorithm, MaxNumPoints, MaxClosureDist,ClippingEndPoints, Iterations, ClippingFactor : Row, Column, Radius, StartPhi, EndPhi,PointOrder)

参数:
Contours 【in】:输入 XLD 轮廓。
Algorithm 【 in 】 : 拟 合 圆 的 算 法 。 取 值 范 围 :
‘ahuber’, ‘algebraic’, ‘atukey’, ‘geohuber’, ‘geometric’, ‘geotukey’ ,
‘algebraic’:这种方法使轮廓点和拟合得到的圆之间的代数距离最小。
‘geometric’:这种方法使轮廓点和拟合得到的圆之间的几何距离最
小,耗时多。
MaxNumPoints【in】:拟合圆计算的最大轮廓点数。缺省值:-1,表示使用所有点。
MaxClosureDist【in】:轮廓端点之间的最大距离。当轮廓点之间的距离小于该值时,认为
轮廓时闭合的。
ClippingEndPoints【in】:拟合时忽略的起始轮廓点和终止轮廓点的数量。
Iterations【in】:加权拟合的最大迭代次数。缺省值:3。
ClippingFactor 【in】:消除异常点的裁剪因子。控制抑制异常点的数量:值越小,检测
的异常点越多,(典型值:Huber 设置为 1.0,Tukey 设置为 2.0)。
Row【out】:圆心 Y 坐标。
Column【out】:圆心 X 坐标。
Radius【out】:圆的半径。
StartPhi【out】:起始角度。(单位:弧度)
EndPhi【out】:终止角度。(单位:弧度)
PointOrder【out】:边界点顺序。取值范围:‘positive’(顺时针),‘negative’(逆
时针)。

.fit_line_contour_xld(Contours : : Algorithm, MaxNumPoints, Clippin
gEndPoints, Iterations,ClippingFactor : RowBeg
in, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
功能:根据 XLD 拟合直线段。
参数:
Contours 【in】:输入轮廓。
Algorithm【in】:拟合直线算法选择。取值范围: ‘drop’, ‘gauss’, ‘huber’, ‘regression’, ‘tukey’,
缺省值:‘tukey’。
MaxNumPoints【in】:拟合直线计算的最大轮廓点数。缺省值:-1,表示使用所有点。
ClippingEndPoints【in】:拟合时忽略的起始点轮廓点和终止轮廓点的数量。
Iterations【in】:加权拟合的最大迭代次数。缺省值:5。
ClippingFactor 【in】:消除异常点的裁剪因子。控制抑制异常点的数量:值越小,检测
的异常点越多,(典型值:Huber 设置为 1.0,Tukey 设置为 2.0)。
RowBegin【out】:直线段起点 Y 坐标。
ColBegin【out】:直线段起点 X 坐标。
RowEnd【out】:直线段终点 Y 坐标。
ColEnd【out】:直线段终点 X 坐标。
Nr【out】:直线参数:法向量 Y 坐标。
Nc【out】:直线参数:法向量 X 坐标。
Dist【out】:直线参数:原点到直线的距离。

XLD的合并操作算子:
union_collinear_contours_xld:合并在同一直线的XLD
union_cocircular_contours_xld:合并在同圆的XLD
union_adjacent_contours_xld:合并邻近的XLD

轮廓特征计算:
(1).计算长度:length_xld(XLD : : : Length)
(2).计算xld的面积和中心位置:area_center_xld(XLD:::Area,Row,Column,PointOrder)
(3).计算xld的面积和重心位置area_center_points_xld(XLD : : : Area, Row, Column)

生成XLD算子:
(1).gen_contour_region_xld(Regions : Contours : Mode : )
功能:根据区域创建 XLD 轮廓。
(2).gen_contour_polygon_xld( : Contour : Row, Col : )
功能:生成一个多边形轮廓。
(3).gen_circle_contour_xld( : ContCircle : Row, Column, Radius, StartPhi, EndPhi, PointOrder,Resolution : )
功能:生成圆弧或圆 XLD 轮廓。
(4).gen_cross_contour_xld( : Cross : Row, Col, Size, Angle : )
功能:在指定点生成一个十字状轮廓。
(5).union_adjacent_contours_xld(Contours : UnionContours : MaxDistAbs,
MaxDistRel, Mode : )
功能:黏合最邻近的轮廓。
(6).union_cocircular_contours_xld(Contours : UnionContours : MaxArcAng
leDiff, MaxArcOverlap,MaxTangentAngle, MaxDist, MaxRadiusDiff
, MaxCenterDist, MergeSmallContours, Iterations : )
功能:黏合圆。
(7).union_collinear_contours_xld(Contours : UnionContours : MaxDistAbs, MaxDistRel, MaxShift,MaxAngle, Mode : )
功能:黏合直线。
(8).sort_contours_xld(Contours : SortedContours : SortMode, Order, RowOrCol : )
功能:根据轮廓的相对位置,对轮廓进行排序。

三、卡尺
实现基本流程:

*1.创建卡尺模型
create_metrology_model (MetrologyHandle)
*2.设置图像宽高
set_metrology_model_image_size (MetrologyHandle, Width, Height)
*3.添加卡尺(类型:直线、矩形,圆形、椭圆)
add_metrology_object_line_measure (MetrologyHandle, RowBegins, ColumsBegins, RowEnds, ColumsEnds, 20, 10, 1, 40, [], [], Index1)
*4设置参考位置
set_metrology_model_param(MetrologyHandle, ‘reference_system’, [Rows[0],Columns[0],0])
*5.定位(算子内做仿射变换)
align_metrology_model (MetrologyHandle, Rows1[0], Columns1[0], 0)
*6.测量
apply_metrology_model (Image, MetrologyHandle)
*7.获取中间结果
get_metrology_object_result (MetrologyHandle, ‘all’, ‘all’, ‘result_type’, ‘all_param’, Parameter)
*获取结果轮廓
get_metrology_object_result_contour (Contour, MetrologyHandle, ‘all’, ‘all’, 1.5) //1.5为相邻两点的距离
*获得测量矩形和点
get_metrology_object_measures (Contours, MetrologyHandle, ‘all’, ‘all’, Row, Column)
*清除卡尺模型句柄
clear_metrology_model (MetrologyHandle)

  • 31
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值