ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Halcon测量模型核心模块p_do_metrology_model深度解析与工程实践

Halcon测量模型核心模块p_do_metrology_model深度解析与工程实践 1. 项目概述深入Halcon测量核心如果你在工业视觉领域摸爬滚打过一阵子尤其是处理过精密尺寸测量、位置度评价这类活那你对Halcon的metrology_model测量模型一定不陌生。它几乎是Halcon里做高精度、可重复性测量的“瑞士军刀”。今天我们不聊那些泛泛的教程而是聚焦于一个非常具体、但往往被忽略的环节p_do_metrology_model这个函数模块。这个模块通常藏在Halcon自带的示例程序explore_halcon.hdev里名字看起来平平无奇甚至有点“内部工具”的感觉。但恰恰是这种不起眼的模块封装了测量模型从创建、设置到执行、结果获取这一整套流程中最核心、最易出错的逻辑。很多新手照着官方例子跑通了测量一旦要自己封装成函数、或者应对复杂多变的现场情况就发现无从下手代码写得又长又乱维护起来头疼。p_do_metrology_model模块就是一个官方给出的、高度工程化的最佳实践样板。拆解它不仅能让你彻底搞懂测量模型怎么用更能学到Halcon工程化编程的思维。无论你是刚接触Halcon测量还是想优化自己的测量代码结构这个模块都值得你花时间深挖一遍。2. 测量模型与p_do_metrology_model模块定位2.1 Halcon测量模型Metrology Model核心价值在深入模块之前我们必须先统一对metrology_model的理解。它不是简单的“画条线测个距离”。你可以把它想象成一个虚拟的、高度可配置的“测量夹具”或“检具”。传统测量你可能需要找边缘-拟合直线/圆-计算距离/直径-评估。每一步都涉及算子调用、参数传递和临时变量。而测量模型的做法是你首先创建一个“模型句柄”create_metrology_model这个句柄就是一个空的测量夹具。然后你向这个夹具里添加具体的“测量实例”add_metrology_object_generic比如“我要测量这个圆孔的内径”你会指定一个初始的近似圆Row, Column, Radius以及一系列参数如边缘幅度阈值、边缘极性、是否忽略干扰区域等。最后调用apply_metrology_modelHalcon会基于你提供的图像和模型中的所有设置一次性执行所有测量实例的查找、拟合和计算。它的核心优势在于参数集中管理所有测量相关的参数如卡尺工具参数、拟合算法参数都绑定在模型句柄上修改和调试非常方便。执行与结果分离apply只是执行测量你可以对同一个模型应用不同的图像而get_metrology_object_result才是获取具体结果如圆心、半径、距离。这种设计支持批量处理和结果后分析。鲁棒性强内置了亚像素边缘提取、边缘点筛选、几何拟合最小二乘法、Tukey权重法等等一系列算法比手动组合算子更稳定。结果丰富不仅能得到拟合后的几何参数如直线方程、圆参数还能得到每个参与拟合的边缘点坐标、质量分数等信息便于做测量结果的可信度评估和SPC分析。2.2p_do_metrology_model模块的角色解析那么p_do_metrology_model在这个体系中扮演什么角色它不是一个Halcon内置算子而是一个用Halcon脚本HDevelop编写的过程Procedure你可以理解为一种自定义函数或宏。它的存在是为了将创建、配置、执行、获取结果这一整套操作流程化、模块化和参数化。官方示例explore_halcon.hdev里可能有很多测量相关的演示p_do_metrology_model往往是那个被反复调用的“干活”的核心模块。它的典型输入包括待测图像、测量类型如‘circle’ ‘line’、测量实例的初始参数、以及各种测量控制参数。它的输出则是测量结果如圆心、半径和可能的质量标志。分析这个模块我们不只是学几个算子调用更是学习如何设计一个健壮、易用、可复用的视觉测量功能单元。这是从“会用算子”到“会做工程”的关键一步。3. 模块内部逻辑与关键步骤拆解虽然我们无法看到explore_halcon.hdev的原始代码但基于Halcon测量模型的固定流程和最佳实践我们可以完全重构并深入剖析一个典型的p_do_metrology_model模块应有的内部逻辑。一个工业级的实现通常会包含以下几个关键阶段每个阶段都有其设计考量和避坑点。3.1 阶段一输入参数校验与模型初始化这是所有健壮程序的起点。模块接收外部传入的参数第一步不是急着用而是先“验货”。核心操作参数存在性检查使用tuple_length或直接判断变量是否被定义检查必备参数如图像Image、测量类型ObjectType、初始位置参数如圆的Row, Column, Radius等。缺少关键参数应通过throw或返回错误码立即终止。参数有效性校验例如初始半径是否为正数提供的ROI区域是否在图像范围内GenParamName和GenParamValue这两个用于传递扩展参数的元组长度是否一致这里常用assert或条件判断。测量模型创建与清空使用create_metrology_model创建一个新的模型句柄MetrologyHandle。这里有个重要技巧在模块开头创建而不是依赖外部传入。这样做保证了模块的独立性避免外部残留的模型状态影响本次测量。同时配合clear_metrology_model如果句柄有效是一个好习惯确保起点干净。实操心得在参数校验时对于GenParamName和GenParamValue我习惯写一个小的循环来检查是否有不支持或拼写错误的参数名。虽然Halcon在add_metrology_object_generic时会报错但提前在模块内拦截并给出更友好的提示如“不支持的参数‘max_iteration’ 您是否指的是‘max_iterations’”能极大提升调试效率。另外对于图像除了检查变量存在最好用get_image_type或get_image_size快速验证一下是否是单通道灰度图测量模型通常需要灰度图避免因传入彩色图导致的意外错误。3.2 阶段二测量对象实例添加与参数化配置这是模块的核心配置环节将用户的测量意图转化为模型能理解的指令。核心操作调用add_metrology_object_generic这是最关键的一步。你需要根据ObjectType‘circle’ ‘line’ ‘ellipse’ ‘rectangle2’来组织参数。对于圆ObjectType设为‘circle’ObjectInit是一个元组[Row, Column, Radius]。对于直线ObjectType设为‘line’ObjectInit是[Row1, Column1, Row2, Column2]。GenParamName和GenParamValue用于传递一整套测量参数。这部分是灵活性和复杂性的来源。关键通用参数详解measure_length1/measure_length2定义卡尺工具测量矩形的长度。这决定了在垂直于测量对象的方向上搜索边缘的范围有多大。太小可能抓不到边缘太大容易引入干扰。measure_width卡尺工具的宽度。即沿着测量对象方向每个测量截面的宽度。通常设置得比预期边缘略宽即可。measure_distance连续两个测量截面中心点之间的距离。决定了沿测量对象采集多少个边缘点。距离越小点越密拟合越精确但计算量也越大。measure_transition边缘极性。‘uniform’由亮到暗或由暗到亮、‘positive’由暗到亮、‘negative’由亮到暗。正确设置能显著提升搜索成功率。measure_threshold边缘梯度幅度的阈值。低于此值的点不被认为是有效边缘。这是调节灵敏度的关键参数。min_score边缘点的最低质量分数。用于筛选边缘点剔除质量差的点。num_instances期望找到的实例数量。通常设为1。如果你测量的是一个图案中有多个相同特征如多个焊点可以设为大于1的数模型会尝试找到多个。instances_outside_measure_regions如何处理测量区域外的实例。对于精确定位通常设为‘false’。设计考量为什么要把这么多参数通过GenParamName/Value传递而不是写成固定值这就是模块化的精髓。它允许调用者根据不同的应用场景如高对比度VS低对比度 大特征VS小特征动态调整参数而无需修改模块内部代码。模块就像一个黑盒提供了标准化的输入输出接口。3.3 阶段三模型执行与结果提取配置完成后就是执行测量并拿到我们想要的数据。核心操作应用模型到图像apply_metrology_model(Image, MetrologyHandle)。这一步Halcon会内部完成所有测量区域的生成、边缘点提取、筛选和几何拟合。获取测量结果使用get_metrology_object_result。这里需要特别注意ResultType参数的选择‘all’获取所有结果返回一个复杂结构通常需要进一步解析。‘result_type’获取特定类型的结果。对于圆最常用的是‘circle’ 它会直接返回拟合后的[Row, Column, Radius]元组。对于直线常用‘line’ 返回[Row1, Column1, Row2, Column2]。其他有用的ResultType包括‘used_edges’用于拟合的边缘点‘mean_error’拟合平均误差等用于评估测量质量。获取测量轮廓有时我们不仅需要数字结果还需要将拟合的图形显示出来。get_metrology_object_contour可以获取测量对象的轮廓如圆的边界get_metrology_object_measures可以获取每个测量截面的位置和找到的边缘点用于可视化调试。注意事项apply_metrology_model可能会失败例如没有找到足够的边缘点来拟合。一个健壮的模块绝不能假设apply一定成功。在调用get_metrology_object_result之前应该先使用get_metrology_object_num_instances来检查找到的实例数量。如果数量为0则意味着测量失败此时应返回一个错误状态或默认值而不是让程序因为访问空结果而崩溃。这是实际项目中最常见的疏忽之一。3.4 阶段四资源清理与结果返回这是收尾工作体现编程的严谨性。核心操作清理模型句柄使用clear_metrology_model(MetrologyHandle)释放该句柄占用的所有资源。务必执行特别是在循环中调用本模块时否则会导致内存泄漏。组织输出将需要的结果如拟合参数Row Column Radius、质量状态成功/失败、拟合误差、使用的边缘点等打包成输出元组或结构体返回给调用者。清晰的输出接口能让模块更容易被集成。模块接口设计示例一个设计良好的p_do_metrology_model过程函数的接口可能看起来像这样* 过程头 procedure p_do_metrology_model ( Image, // 输入图像 ObjectType, // 对象类型如 circle InitParam, // 初始参数如 [Row, Column, Radius] GenParamName, // 通用参数名如 [measure_length1, measure_threshold] GenParamValue, // 通用参数值如 [20, 30] : ResultParam, // 输出结果参数如 [Row, Column, Radius] : ResultStatus // 输出状态如 success 或 fail )这种设计将输入图像、意图、配置和输出结果、状态明确分离符合高内聚、低耦合的软件设计原则。4. 核心参数调优与实战经验知道流程只是第一步能让测量模型在实际项目中稳定工作关键在参数调优。p_do_metrology_model模块的强大很大程度上体现在它通过GenParamName/Value暴露出的参数调节能力上。这里分享一些从大量实战中总结出的调优心得。4.1 测量工具卡尺参数设置黄金法则measure_length1,measure_length2,measure_width,measure_distance这四个参数共同定义了一个“测量矩形阵列”它们需要根据被测物特征和图像分辨率进行精细调整。measure_length1/2搜索长度这是最重要的参数之一。它决定了在垂直于边缘的方向上你给算法多大的搜索空间。设置原则起点通常设置为预期边缘位置可能波动的最大范围的1.5到2倍。例如你预计圆心在像素坐标(500,500)但可能因机械振动有±15像素的偏差那么measure_length1和measure_length2可以都设为30即每边15像素。权衡设置过小边缘稍微跑出范围就找不到了鲁棒性差。设置过大会覆盖更多图像区域增加引入干扰边缘如纹理、划痕的风险同时增加计算量。在保证覆盖位置波动的前提下尽可能小。非对称设置对于某些边缘两侧的对比度或背景不同。例如测量一个深色物体上的亮边可能亮边一侧物体内部背景干净另一侧外部背景复杂。这时可以设置measure_length1和measure_length2不等在背景复杂的一侧减少搜索长度降低干扰。measure_width卡尺宽度这个宽度是沿着边缘切线方向的。它应该略大于你预期边缘的物理宽度以像素计。如果边缘很清晰、陡峭3-5个像素通常足够。如果边缘模糊、渐变可能需要增加到7-10个像素以便算法能捕捉到完整的边缘过渡带。太宽会平均化附近像素可能使边缘定位不准太窄可能无法完整覆盖边缘信号。measure_distance测量点间距这个参数控制着沿边缘采集多少个横截面进行测量。对于长直线或大圆可以设置较大的距离如20-50像素以提高速度。对于短边或小圆或者需要高精度拟合时必须设置较小的距离如5-10像素以确保有足够多的点参与拟合。经验公式对于圆至少需要3个点才能拟合但为了稳定通常希望有10个以上的点。你可以用圆的初始周长除以期望的点数来估算measure_distance。例如初始半径R100像素周长约628像素若想要约30个点则measure_distance可设为~21。4.2 边缘提取与筛选参数精讲measure_transition,measure_threshold,min_score这三个参数直接决定了哪些像素点会被认为是“合格”的边缘点。measure_transition边缘极性务必与实际情况匹配。这是导致“找不到边缘”的最常见原因之一。拿一张图用inspect_shape_model或gen_measure_rectangle2配合measure_pos先手动看一下边缘的灰度剖面图。如果是从暗区域到亮区域就是‘positive’反之为‘negative’如果两种情况都有比如一个亮背景上的暗圆环就用‘uniform’。选错了极性算法会在完全错误的方向上搜索必然失败。measure_threshold幅度阈值这个值不是随便设的。它应该基于图像的实际梯度。方法在预期的边缘位置附近用sobel_amp或edges_image算子计算一下梯度幅值图像然后观察有效边缘区域的梯度值大致在什么范围。将阈值设在这个范围的下限附近。例如观察发现好的边缘梯度值都在50以上那么阈值可以设为30-40。动态调整在光照可能变化的场景下可以考虑使用相对阈值比如根据图像整体或局部对比度自动计算一个阈值。p_do_metrology_model模块可以扩展输入接收一个自动计算出的阈值而不是固定值。min_score最小分数Halcon给每个找到的边缘点会计算一个分数0-1之间反映该点与理想边缘模型的匹配程度。min_score用于过滤掉低质量的点。通常从0.3开始尝试。如果图像质量很好边缘清晰可以提高到0.5甚至0.7让拟合只使用最可靠的点。如果图像噪声大边缘不清晰可以降低到0.2但要注意这可能让一些噪声点混入。配合使用measure_threshold做初筛min_score做精筛。两者结合可以很好地平衡灵敏度和抗噪性。4.3 “元参数”与高级控制除了上述直接控制测量的参数还有一些影响模型行为的“元参数”。num_instances与score_threshold当寻找多个相同特征时如多个螺丝孔num_instances设为期望数量。score_threshold则用于判断找到的实例是否足够好。低于此分数的实例会被丢弃。这在多目标检测中非常有用。rand_seed如果使用了RANSAC之类的鲁棒拟合方法通过fitting_algorithm参数设置rand_seed可以控制随机数种子确保每次运行的结果是可重复的这对调试和验证至关重要。fitting_algorithm拟合算法选择。默认是‘least_squares’最小二乘法它对异常点敏感。‘tukey’Tukey权重法是一种鲁棒拟合算法能降低异常点的影响在存在局部干扰如污点、划痕时表现更好但计算量稍大。根据现场情况选择。避坑指南参数设置的顺序与依赖调参不是胡乱尝试。我建议遵循一个顺序先几何后灰度。几何参数优先首先在一幅“好”的图像上确保measure_length1/2足够覆盖特征measure_distance能采集到足够多的点。你可以通过get_metrology_object_measures获取测量截面的位置并用gen_measure_rectangle2和measure_pos可视化这些截面确保它们都准确地“架”在了预期的边缘位置上。这是测量能成功的物理基础。灰度参数微调几何参数没问题后再调整measure_threshold和measure_transition。可以在不同光照、不同对比度的图像上测试找到一个稳定的阈值范围。质量参数收尾最后通过观察get_metrology_object_result返回的‘used_edges’和‘mean_error’来调整min_score确保用于拟合的点都是高质量的且拟合误差在可接受范围内。 记住measure_length1/2设错了后面所有参数调得再好都没用。这个顺序能帮你快速定位问题根源。5. 模块的工程化扩展与封装思路原版的p_do_metrology_model可能只是一个教学示例。但在实际工业项目中我们需要对它进行工程化改造使其更强大、更易用。5.1 增强错误处理与状态反馈基础的模块可能只返回测量结果。工程化版本需要丰富的状态信息。定义明确的状态码不只是‘success’/‘fail’。可以细分为0: 成功1: 错误 - 输入图像无效2: 错误 - 初始参数超出图像范围3: 警告 - 找到的实例数少于预期num_instances4: 警告 - 拟合误差超限5: 错误 - 应用测量模型失败无边缘点返回诊断信息在状态非成功时除了返回错误码还可以返回一些辅助诊断的信息例如实际找到的边缘点数量通过get_metrology_object_result的‘used_edges’的tuple_length计算。拟合的平均误差‘mean_error’。失败区域的坐标可以返回失败的测量截面位置。提供调试可视化开关增加一个输入参数如DebugMode。当设置为‘true’时模块内部可以绘制出测量矩形、找到的边缘点、拟合后的图形等并显示在图形窗口。这在现场调试和参数优化时是无价之宝。5.2 支持多测量对象与批量处理一个复杂的视觉测量任务往往不止测一个圆或一条线。模块可以扩展为支持一次性添加多个不同类型的测量对象。输入结构 redesign可以将输入参数改为列表或数组。例如ObjectTypeList [‘circle’ ‘line’]InitParamList [[圆参数] [直线参数]]GenParamList [[圆参数组] [直线参数组]]。内部循环处理在模块内部循环遍历这些列表依次调用add_metrology_object_generic将多个对象添加到同一个测量模型中。统一执行与结果收集最后调用一次apply_metrology_model然后循环获取每个对象的结果。这样做的好处是只需一次图像遍历和模型应用效率远高于对每个特征单独创建和执行一个模型。结果关联返回的结果需要与输入的对象列表顺序对应并可以打包成一个结构化的结果数组。5.3 参数模板与自适应策略对于固定的产品型号其测量参数往往是固定的。我们可以引入“参数模板”的概念。创建参数模板库将不同产品、不同特征类型如“M3螺丝孔”、“LCD屏边缘”的最佳参数组合保存为配置文件如JSON、INI或Halcon字典。模块集成模板查询模块增加一个输入参数TemplateName。内部根据模板名称加载对应的GenParamName和GenParamValue。这样上层调用者只需关心“测什么”而不必记忆复杂的参数。自适应参数微调更进一步模块可以集成简单的自适应逻辑。例如在正式测量前先对图像进行一个快速分析计算全局对比度或局部灰度方差然后基于此动态微调measure_threshold。这可以提升模块在光照变化环境下的适应性。一个工程化模块的调用示例* 使用模板和调试模式 TemplateName : ‘product_A_hole_circle’ InitCircle : [300.5, 400.2, 25.0] Debug : ‘true’ p_do_metrology_model_adv (Image, ‘circle’, InitCircle, TemplateName, Debug, \ ResultCircle, StatusCode, StatusMessage, DebugWindowHandle) if (StatusCode ! 0) * 记录日志并根据StatusCode进行不同处理 log_message (‘测量失败: ‘ StatusMessage) endif这样的模块已经从一个小工具升级为一个可靠的、可维护的视觉测量功能组件。6. 常见问题排查与性能优化实录即使理解了原理和参数在实际部署中还是会遇到各种问题。下面是我在多年项目中遇到的典型问题及解决方法很多都是官方手册里不会写的“坑”。6.1 测量失败典型原因与排查流程当p_do_metrology_model或你调用测量模型返回失败或结果异常时不要盲目调参按照以下流程排查问题现象可能原因排查步骤与解决方法完全找不到边缘(get_metrology_object_num_instances返回 0)1.极性错误(measure_transition)2.阈值过高(measure_threshold)3.搜索区域未覆盖边缘(measure_length1/2太小或位置不对)4.图像本身对比度极低1.可视化测量区域用get_metrology_object_measures获取测量截面并用gen_measure_rectangle2和measure_pos手动在该位置测一下看边缘剖面图。这是最有效的调试手段。2.检查极性对照剖面图确认measure_transition设置是否正确。3.降低阈值将measure_threshold暂时设为很低的值如5或10看是否能找到边缘。如果能再逐步提高。4.检查初始位置确认你提供的初始位置Row Column是否在图像内且大致对准了特征。5.检查图像用disp_image和inspect_image看看图像是否正常有没有过曝、欠曝、模糊。找到边缘但拟合结果离谱(圆心跑到天涯海角半径极大/极小)1.干扰边缘搜索区域内存在比目标边缘更强的干扰边缘。2.有效边缘点太少measure_distance太大或measure_length1/2太小导致采集点不足。3.边缘点质量参差不齐且未有效筛选。1.显示使用的边缘点获取‘used_edges’结果将这些点画在图像上。你会发现它们可能分布在干扰物上。2.调整搜索区域缩小measure_length1/2或使用set_metrology_object_param设置measure_region手动绘制一个ROI来限制搜索范围排除干扰。3.增加采样点减小measure_distance。4.提高质量门槛增加min_score。5.改用鲁棒拟合将fitting_algorithm参数设置为‘tukey’。测量结果不稳定(同一位置多次测量结果跳动大)1.边缘本身模糊亚像素定位精度自然下降。2.光照或噪声波动。3.参与拟合的边缘点集每次略有不同。1.评估图像质量检查光源稳定性、镜头焦距是否对准。硬件问题是软件无法根本解决的。2.图像预处理在调用测量模块前对图像进行平滑滤波如gauss_filter或形态学操作抑制噪声。但注意不要过度模糊边缘。3.平均多次测量对于非实时性要求极高的场合可以连续采集多帧测量后对结果取平均。4.固定随机种子如果使用了RANSAC类算法设置rand_seed为固定值。执行速度慢1.测量对象太多或measure_distance太小导致测量截面数量激增。2.搜索区域measure_length1/2设置过大。3.图像分辨率过高。1.性能分析使用count_seconds对模块各部分计时找到瓶颈。通常是apply_metrology_model这一步。2.优化参数在满足精度要求的前提下增大measure_distance减小measure_length1/2。3.降低图像分辨率如果精度允许先对图像进行缩放zoom_image_factor。4.分区处理如果图像很大但测量区域很小可以先裁剪crop_part出ROI区域再测量。6.2 性能优化实战技巧在高速检测线上每一毫秒都至关重要。针对测量模型的优化我总结了几条立竿见影的技巧精确限定测量区域这是最有效的优化。不要在整个图像上创建测量模型。先用定位、Blob分析或其他方法粗略找到特征的大致区域一个矩形或旋转矩形。然后在调用add_metrology_object_generic时使用set_metrology_object_param配合‘measure_region’参数将测量严格限制在这个小区域内。这能直接减少算法需要处理的像素数量效果显著。分级测量策略对于非常复杂的测量如几十个尺寸可以将其分为“关键尺寸”和“次要尺寸”。在核心循环中只测量关键尺寸以确保速度。次要尺寸可以在空闲周期或另一个低优先级的线程中进行测量。或者先以低精度大measure_distance快速测量所有尺寸只有发现异常时再在对应区域进行高精度复测。模型复用如果你需要对一系列图像进行完全相同的测量如检测同一产品不要在每张图都重复create_metrology_model和add_metrology_object_generic。可以这样做* 初始化阶段只执行一次 create_metrology_model (MetrologyHandle) add_metrology_object_generic (...) * ... * 在循环中对每张图像 for i : 1 to ImageCount by 1 read_image (Image, ‘path’ i) * 只需清除上次结果无需重建模型 clear_metrology_model (MetrologyHandle) * 注意这里clear的是模型内容不是句柄 * 重新应用模型到新图像 apply_metrology_model (Image, MetrologyHandle) get_metrology_object_result (...) endfor * 最终退出时再清空句柄 clear_metrology_model (MetrologyHandle)注意这里的clear_metrology_model是清除模型内的测量结果和临时数据但保留模型结构如添加的测量对象及其参数从而省去了重复添加对象的开销。并行化考量Halcon本身支持部分算子的多线程。确保在set_system中开启了多线程‘parallelize_operators’设为 ‘true’。对于多个完全独立的测量任务如果硬件资源充足可以尝试用多个线程分别创建和执行自己的测量模型但这需要仔细设计以避免资源竞争。6.3 一个容易被忽略的“坑”亚像素坐标与像素坐标这是新手和老手都可能踩的坑。metrology_model返回的坐标和半径值如圆的Row Column Radius通常是亚像素精度的即可能是像312.45这样的浮点数。问题如果你直接用这些浮点数坐标去访问图像像素例如用get_grayval或者用disp_circle等显示算子时Halcon会自动处理。但如果你需要将它们与某些基于像素索引的操作结合就可能出错。比如你想根据圆心坐标从一个大数组中索引数据数组下标必须是整数。解决方案明确你在每一步需要的是亚像素精度还是像素索引。需要高精度计算如计算距离、公差时保持使用亚像素值。需要像素索引如访问图像区域、模板匹配时使用round或int函数将其转换为最接近的整数但要明白这会引入最多0.5像素的舍入误差。一个常见的做法是测量时用亚像素得到结果后根据需求决定是否转换。在p_do_metrology_model模块的输出文档中应该明确注明返回值的精度。最后分享一个我个人的习惯对于任何一个重要的测量模块我都会编写一个与之配套的“可视化调试函数”。这个函数接收测量模型句柄和图像然后绘制出所有测量矩形、找到的边缘点、拟合的图形并用不同颜色标出成功/失败的测量实例。在开发调试阶段将这个函数的调用开关打开所有问题几乎都一目了然。这比单纯看数字结果要直观十倍也是快速传授给现场工程师的利器。把复杂的视觉算法变成眼睛能看到的东西是解决现场问题最快的方式。
返回列表