Halcon 计量模型
计量模型
create_metrology_model
作用: 创建一个计量模型,用于几何形状的精确拟合(如圆、椭圆、直线等)
算子签名:create_metrology_model(MetrologyHandle)
- 输入参数:无
- 输出参数:
MetrologyHandle(输出控制):创建的计量模型的句柄
add_metrology_object_generic
作用:向计量模型中添加一个几何对象(例如圆、椭圆、矩形等)进行测量。
算子签名:add_metrology_object_generic(MetrologyHandle, Shape, ShapeParam, MeasureLength1, MeasureLength2, MeasureSigma, MeasureThreshold, GenParamName, GenParamValue : Index)
- 输入参数:
MetrologyHandle(输入控制):计量模型的句柄Shape(输入控制):几何形状的类型,可选值有:'circle','ellipse','line','rectangle'ShapeParam(输入控制):几何形状的参数,具体含义与形状相关,例如:对于圆是[Row,Column,Radius];对于椭圆是[Row,Column,Phi,Radius1,Radius2];对于矩形是[Row,Column,Phi,Length1,Length2]MeasureLength1(输入控制):卡尺高度(沿边缘方向)MeasureLength2(输入控制):卡尺宽度(垂直于边缘方向)MeasureSigma(输入控制):高斯平滑系数,用于图像预处理。建议值:0.4 ~ 1.0。MeasureThreshold(输入控制):边缘检测的阈值(梯度幅值)。只有梯度幅值大于此阈值的边缘点才会被考虑GenParamName(输入控制):通用参数名称,可以设置一些高级参数(如 'min_score' 等),可选,默认为空数组。GenParamValue(输入控制):通用参数值,与GenParamName对应,可选。
- 输出参数:
Index(输出控制):添加的几何对象在计量模型中的索引
一个计量模型可以包含多个几何对象,每个对象都可以有不同的测量参数。使用add_metrology_object_generic添加几何对象后,会返回一个索引值,表示该几何对象在计量模型中的索引。
get_metrology_object_model_contour
作用:获取计量模型中几何对象的轮廓(在模型坐标系中)
算子签名:get_metrology_object_model_contour( : Contour : MetrologyHandle, Index, Resolution)
- 输入参数:
MetrologyHandle(输入控制):计量模型的句柄Index(输入控制):几何对象在计量模型中的索引Resolution(输入控制):轮廓点密度(推荐1.0-2.0)
- 输出参数:
Contour(输出对象):生成的XLD轮廓对象
get_metrology_object_measures
作用:获取卡尺法的检测轮廓范围
算子签名:get_metrology_object_measures(:Contours :MetrologyHandle, Index, Transition : Row, Column)
- 输入参数:
MetrologyHandle(输入控制):计量模型的句柄Index(输入控制):几何对象在计量模型中的索引Transition(输入控制):边缘极性('all', 'positive', 'negative')
- 输出参数:
Contours(输出对象):测量点组成的XLD轮廓对象Row(输出对象):测量点的行坐标Column(输出对象):测量点的列坐标
apply_metrology_model
作用:将计量模型应用到图像执行拟合
算子签名:apply_metrology_model(Image : : MetrologyHandle : )
- 输入参数:
Image(输入对象):待拟合图像
- 输入控制:
MetrologyHandle(输入控制):计量模型的句柄
get_metrology_object_result
作用:获取计量模型中几何对象的拟合结果
算子签名:get_metrology_object_result(::MetrologyHandle, Index, Instance, ResultType : Parameter)
- 输入参数:
MetrologyHandle(输入控制):计量模型的句柄Index(输入控制):几何对象在计量模型中的索引Instance(输入控制):实例索引(从0开始 或“all”)ResultType(输入控制):结果类型,可选值有:'center','radius','phi','length1','length2','score'
- 输出参数:
Parameter(输出对象):拟合结果
get_metrology_object_result_contour
作用:获取计量模型中几何对象的拟合轮廓(在搜索图像坐标系中)
算子签名:get_metrology_object_result_contour( : Contour : MetrologyHandle, Index, Instance, Resolution)
- 输入参数:无
- 输出参数:
Contour(输出对象):生成的XLD轮廓对象- 输入控制:
MetrologyHandle(输入控制):计量模型的句柄Index(输入控制):几何对象在计量模型中的索引Instance(输入控制):实例索引(从0开始 或“all”)Resolution(输入控制):轮廓点密度(推荐1.0-2.0)
clear_metrology_model
作用:清除计量模型释放资源
算子签名:clear_metrology_model(MetrologyHandle)
- 输入参数:
MetrologyHandle(输入控制):计量模型的句柄
案例展示
HTuple MetrologyHandle;
MetrologyHandle = HTuple(); // 初始化为空
try {
// 获取当前模型的圆参数
auto& baseParams = m_Match->m_FitCircleMap[m_CurrentModelName];
auto circleParams = static_cast<CircleFitParams*>(&baseParams);
// 检查是否有初始圆数据
bool hasValidCircle = (circleParams->initCircle.radius > 0);
// 选择处理图像通道
const HObject& hoProcessimage = selectProcessImage();
// 判断图像是否为空
bool hasValidImage = isImageNull(hoProcessimage);
if (hasValidCircle && hasValidImage) {
CreateMetrologyModel(&MetrologyHandle);
// 设置计量模型参数
HTuple inRuleH = circleParams->HeightRect;
HTuple inRuleW = circleParams->WidthRect;
HTuple inSigma = circleParams->Sigma;
HTuple inThresh = circleParams->Threshold; // 边缘阈值
HTuple inPointType = circleParams->PointType; // 选择的第几个点
// 添加计量对象(圆形)
HTuple ShapeParam;
ShapeParam.Append(circleParams->initCircle.center.y);
ShapeParam.Append(circleParams->initCircle.center.x);
ShapeParam.Append(circleParams->initCircle.radius);
HTuple Index; // 添加几何对象索引
AddMetrologyObjectGeneric(MetrologyHandle, "circle", ShapeParam,
inRuleH, inRuleW, inSigma, inThresh,
HTuple(), HTuple(), &Index);
// 获取卡尺法的检测轮廓范围
HObject processContour;
GetMetrologyObjectMeasures(&processContour, MetrologyHandle, Index, "all", nullptr, nullptr);
// 应用计量模型到当前图像
ApplyMetrologyModel(hoProcessimage, MetrologyHandle); // 假设m_Image是当前图像
// 获取拟合结果
HTuple Parameter;
GetMetrologyObjectResult(MetrologyHandle, Index, "all", "result_type",
HTuple("row").Append("column").Append("radius"),
&Parameter);
if (Parameter.Length() == 3) {
// 更新圆参数
CircleRow = Parameter[0];
CircleCol = Parameter[1];
CircleRadius = Parameter[2];
// 更新存储的初始圆数据
circleParams->fittedCircle.setParameter(CircleCol.D(),
CircleRow.D(),
CircleRadius.D());
}
// 生成拟合圆轮廓
HObject resContour;
GetMetrologyObjectResultContour(&resContour, MetrologyHandle, Index, inPointType , 1.5);
// 生成圆心十字标识
HObject ho_Cross;
GenCrossContourXld(&ho_Cross, CircleRow, CircleCol, CircleRadius * 0.3, 0.785398);
// 合并结果
HObject& ho_Result = circleParams->FitedXld;
GenEmptyObj(&ho_Result);
ConcatObj(ho_Result, resContour, &ho_Result);
ConcatObj(ho_Result, ho_Cross, &ho_Result);
}
}
catch (const HalconCpp::HException& e) {
// 专门处理 Halcon 异常
if (MetrologyHandle.Length() > 0) {
ClearMetrologyModel(MetrologyHandle);
MetrologyHandle = HTuple();
}
}

浙公网安备 33010602011771号