Halcon计量模型如何应用于分析?

摘要:计量模型 create_metrology_model 作用: 创建一个计量模型,用于几何形状的精确拟合(如圆、椭圆、直线等) 算子签名:create_metrology_model(MetrologyHandle) 输入参数:无 输出参数
计量模型 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(); } }