卡尺工具:实现halcon中的fit_line_contour_xld

本文介绍了如何在Halcon中使用fit_line_contour_xld函数来实现直线拟合,特别是在卡尺测量应用中的具体步骤。通过创建多个卡尺,选择边缘点,并结合霍夫变换、最小二乘法等方法,有效地剔除异常点干扰,确保直线拟合的准确性。同时,探讨了fit_line_contour_xld的加权最小二乘法及权重函数,并展示了拟合效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        上一篇文章中,我们实现了卡尺的边缘定位,卡尺会根据灰度值变化提取准确的位置。通常卡尺中的边缘点有多个,而实际应用中只需要一个。对应于halcon中measure_pos的Transition、Select参数,我添加了first、first+、first-、last、last+、last-、best这些选项用于选择边缘点(其中first表示第一个,last表示最后一个,+表示从黑到白,-表示从白到黑)。

        有了上面的准备之后,我们可以创建多个卡尺,选择自己想要的边缘点,进而找到圆或者直线。下面主要讲如何找到直线:

        第一步,创建多个卡尺,指定起始点、卡尺长宽、卡尺个数。

        第二步,提取每个卡尺的边缘点,构成点集。

        第三步,对点集进行直线拟合。

        这里重点讲一下直线拟合,常用的方法比较多,例如霍夫变换、最小二乘法、ransac、加权最小二乘法等。halcon中的fit_line_contour_xld拟合效果是比较好的,可以有效剔除异常点的干扰,从参数Algorithm可以看出它使用的是加权最小二乘法,huber、tukey、drop、gauss表示不同的权重函数,权重函数的输入是一个距离(即点到直线的距离),距离越大权重越小,距离越小权重越大。我也使用了此方法同时配合ransac,增加了抽样点个数、迭代次数、内点距离等控制参数,保证均方误差最小或者内点个数最多,下面的图是拟合效果图。

575a0d32f670422986bc6bd1b87ba20b.png

d239d37486e34c1cb318fa20e2e1a9ba.png

f3ae3aba0db646ca82a1842c1f259acf.png

24e77350541b490cb0ed9b8a4fb39f87.png

290a9075ccea4fa6bc9e20fb3605771b.png

862856f5254f405aa918cc2a232d4949.png

<think>我们正在讨论Halcon中的卡尺工具,特别是用于检测圆柱缘。根据引用[2]和引用[3],Halcon提供了卡尺工具(CaliperTool)用于精确测量,并且可以应用于缘检测。圆柱缘检测通常可以分解为检测圆弧或圆,因为圆柱在图像中可能呈现为两个平行的圆弧(上下缘)或者一个完整的圆(端面)。在Halcon中,检测圆柱缘的常用方法:1.如果圆柱是水平放置,我们可能看到两个平行的直线缘(圆柱的母线)和两个半圆弧(端面)。但通常,我们更关注圆柱的轮廓缘,即圆弧部分。2.使用卡尺工具(通常指测量卡尺)来检测这些圆弧缘。卡尺工具可以沿着指定的路径(例如圆弧路径)放置多个测量矩形(或称为卡尺),在每个矩形内进行缘检测,然后将这些缘点拟合成圆或圆弧。具体步骤(参考引用[3]中关于测量模型的使用):a)创建测量模型:使用`create_metrology_model`创建。b)添加测量对象:对于圆柱,我们通常需要添加一个圆形测量对象(使用`add_metrology_object_circle_measure`)或者两个圆弧(如果圆柱端面只有部分可见)。但注意,卡尺工具通常用于直线或圆形的缘测量。c)设置卡尺参数:在添加测量对象时,需要指定卡尺的数量、卡尺的大小(长度和宽度)、搜索方向等。d)应用测量模型:将测量模型对齐到图像中的大致位置(使用`align_metrology_model`),然后应用测量模型(使用`apply_metrology_model`)进行缘检测。e)获取测量结果:使用`get_metrology_object_result`获取检测到的缘点,然后可以拟合圆。参数设置要点:-卡尺的数量:沿着圆弧路径放置的卡尺数量,数量越多,拟合越精确,但计算量越大。-卡尺的大小:每个卡尺矩形的大小(长度和宽度)。宽度决定了在法线方向上搜索缘的范围,长度则决定了沿着路径方向上的积分范围(用于平滑)。-搜索方向:对于圆柱缘,由于缘是明暗变化,需要根据实际情况设置搜索方向(从亮到暗或从暗到亮)。-缘阈值:用于确定缘点的对比度阈值。示例代码框架(Halcon):```cpp*创建测量模型create_metrology_model(MetrologyHandle)*设置图像大小(可选,如果已知图像大小,可以设置)set_metrology_model_image_size(MetrologyHandle,Width,Height)*添加一个圆形测量对象*参数:模型句柄,圆心初始行坐标,圆心初始列坐标,初始半径add_metrology_object_circle_measure(MetrologyHandle,Row,Column,Radius,MeasureLength,MeasureWidth,MeasureThreshold,GenParamName,GenParamValue,Index)*设置其他参数(可选)*例如:设置最小分数(缘点质量)和最小缘数量set_metrology_object_param(MetrologyHandle,Index,'min_score',0.5)set_metrology_object_param(MetrologyHandle,Index,'num_instances',1)*应用测量模型apply_metrology_model(Image,MetrologyHandle)*获取结果get_metrology_object_result(MetrologyHandle,Index,'all','result_type','all_param',CircleResult)*获取用于拟合圆的缘点get_metrology_object_result_contour(Contour,MetrologyHandle,Index,'all',1.5)get_metrology_object_measures(Contour,MetrologyHandle,'all',Row,Column)*拟合圆(可选,因为测量模型已经拟合了圆,但也可以自己拟合)*如果使用测量模型的结果,可以直接获取圆的参数get_metrology_object_result(MetrologyHandle,Index,'all','row',CircleRow)get_metrology_object_result(MetrologyHandle,Index,'all','column',CircleColumn)get_metrology_object_result(MetrologyHandle,Index,'all','radius',CircleRadius)*销毁模型clear_metrology_model(MetrologyHandle)```注意事项:-初始参数(圆心和半径)需要大致设定,以便卡尺工具在正确的位置进行搜索。可以通过ROI或者初步的缘检测来估计。-如果圆柱缘不完整(例如被遮挡),可以考虑使用圆弧测量对象(`add_metrology_object_arc`)或者使用部分圆拟合。另外,引用[2]中提到“工具”和“圆弧缘缺陷检测”,说明在2D算法中,圆和圆弧的检测是常见的。因此,使用卡尺工具检测圆柱缘(即圆弧)是一种标准方法。如果圆柱是竖直放置(即端面朝向相机),则可以直接检测整个圆。如果是水平放置,则可能需要检测两个圆弧(圆柱的两端)或者检测两条直线(圆柱的侧面)和两个圆弧。具体方法取决于应用场景。对于圆柱的侧面(直线缘),可以使用直线卡尺(`add_metrology_object_line_measure`)来检测。因此,根据圆柱在图像中的姿态,选择检测圆/圆弧或直线。总结:使用Halcon的测量模型(MetrologyModel)中的圆形测量对象或圆弧测量对象,结合卡尺工具,通过设置合适的卡尺参数(数量、大小、方向、阈值)来检测圆柱缘。</think>### 在Halcon中使用卡尺工具检测圆柱缘的方法 在Halcon中检测圆柱缘的核心思路是:**将圆柱缘视为圆弧或圆形轮廓,通过卡尺工具提取离散缘点,再拟合为几何形状**。以下是具体步骤和关键参数设置: --- #### **一、操作步骤** 1. **创建测量模型** ```cpp create_metrology_model(MetrologyHandle) // 创建测量模型句柄 ``` 2. **添加圆形测量对象** ```cpp add_metrology_object_circle_measure( MetrologyHandle, // 模型句柄 InitialRow, // 初始圆心行坐标(估算值) InitialColumn, // 初始圆心列坐标 InitialRadius, // 初始半径(估算值) MeasureLength, // 卡尺长度(推荐15-30像素) MeasureWidth, // 卡尺宽度(推荐5-10像素) MeasureThreshold, // 缘对比度阈值(通常30-50) GenParamNames, // 参数名(如'num_measures') GenParamValues, // 参数值(如卡尺数量) Index // 对象索引 ) ``` **关键参数说明**: - `MeasureLength`/`MeasureWidth`:卡尺尺寸,需覆盖缘过渡区 - `num_measures`:卡尺数量(圆柱推荐≥12个,均匀分布) - `measure_transition`:缘方向(`'positive'`/`'negative'`/`'all'`,圆柱通常选`'all'`) 3. **应用测量模型** ```cpp apply_metrology_model(Image, MetrologyHandle) // 在图像上执行测量 ``` 4. **获取缘点并拟合** ```cpp get_metrology_object_result_contour(Contour, MetrologyHandle, Index, 'all', 1.5) fit_circle_contour_xld( Contour, // 提取的轮廓 'algebraic', // 拟合算法 -1, 0, 0, // 排除参数(-1表示自动) 3, 2, // 最大迭代次数和容差 FinalRow, FinalColumn, FinalRadius // 输出圆心和半径 ) ``` --- #### **二、参数优化技巧** 1. **卡尺方向设置** - 圆柱外缘:设置`measure_transition='positive'`(从暗到亮) - 圆柱内缘:设置`measure_transition='negative'`(从亮到暗) - 不确定时:用`'all'`检测双向缘 2. **抗干扰参数** ```cpp set_metrology_object_param(MetrologyHandle, Index, 'min_score', 0.4) // 缘质量阈值 set_metrology_object_param(MetrologyHandle, Index, 'max_num_iterations', 10) // 最大迭代次数 ``` 3. **处理遮挡/噪声** ```cpp set_metrology_object_param(MetrologyHandle, Index, 'complete_edges', 'false') // 允许部分缘缺失 ``` --- #### **三、完整示例代码** ```cpp * 读取图像并预处理 read_image(Image, 'cylinder.png') get_image_size(Image, Width, Height) * 创建测量模型 create_metrology_model(MetrologyHandle) set_metrology_model_image_size(MetrologyHandle, Width, Height) * 添加圆形测量对象(初始参数需估算) add_metrology_object_circle_measure(MetrologyHandle, 300, 400, 150, 20, 8, 40, ['num_measures','measure_transition'], [12,'positive'], 0) * 设置抗干扰参数 set_metrology_object_param(MetrologyHandle, 0, 'min_score', 0.3) * 执行测量 apply_metrology_model(Image, MetrologyHandle) * 获取结果 get_metrology_object_result_contour(Contour, MetrologyHandle, 0, 'all', 1.5) fit_circle_contour_xld(Contour, 'algebraic', -1, 0, 0, 3, 2, CircleRow, CircleCol, CircleRadius) * 可视化 dev_display(Image) dev_display(Contour) disp_circle(CircleRow, CircleCol, CircleRadius) ``` --- #### **四、常见问题解决** 1. **拟合失败**: - 检查初始圆心/半径是否偏离过大(可先用`edges_sub_pix`粗略定位) - 增加卡尺数量或调整`min_score`降低缘质量要求 2. **缘断裂**: - 增大`MeasureLength`扩展采样范围 - 使用`union_adjacent_contours_xld`连接断裂轮廓 3. **多圆柱检测**: - 循环添加多个测量对象(每个圆柱一个索引) - 用`gen_measure_arc`生成弧形卡尺路径[^2] > 注:实际应用中需根据图像分辨率调整参数,建议通过`measure_pos`交互工具调试参数[^1]。 --- ### 相关问题 1. 如何优化卡尺工具在低对比度图像中的缘检测效果? 2. Halcon中如何处理非完整圆柱(部分遮挡)的缘检测? 3. 卡尺工具与`edges_sub_pix`在缘检测中的性能差异是什么? 4. 如何将圆柱缘检测结果用于3D姿态估计? [^1]: Halcon卡尺工具基础教程 [^2]: 2D算法中的圆弧测量方法 [^3]: 测量模型拟合技术细节
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值