计量模型
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();}
}