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();}
}