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();
   }
}
posted @ 2025-09-03 14:04  一楼二栋  阅读(17)  评论(0)    收藏  举报