卡尺工具:实现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

### Halcon 中的直线取方法 在 Halcon 中,直线取可以通过多种方式实现。其中一种常用的方法是利用最小二乘法来进行直线拟合[^1]。尽管该方法对于噪声和异常值较为敏感,但在经过适当预处理的情况下仍然能取得良好的效果。 另一种更为鲁棒的方式是采用卡尺方法进行直线检测[^3]。此方法不仅适用于缘检测,还能沿特定方向执行搜索策略,从而确保更高的精度。具体来说,在代码层面,可以调用一系列 Halcon 提供的功能函数完成整个过程——从图像加载至最终的结果展示。 #### 使用 `least_squares` 进行简单的直线拟合 当面对相对干净的数据集时,可以直接运用最基础的形式之一即最小二乘法来获取最佳拟合直线: ```cpp // 假设已存在一些坐标点 (x, y),存储于 X 和 Y 数组中 gen_contour_polygon_xld(Contour, Row, Column); fit_line_contour_xld(Contour,'tukey',-1,0.2,5,0.9,StartRow, StartCol, EndRow, EndCol, \ MeanDistance, DistanceSigma, Angle, LineLength, PointOrder) disp_cross(WindowHandle, StartRow, StartCol, 8, 'color'='green') disp_cross(WindowHandle, EndRow, EndCol, 8, 'color'='red') ``` 这段代码展示了如何创建一个多形轮廓并对其进行直线拟合,同时标记出所得到直线上两个端点的位置。 #### 利用 rake 卡尺工具捕捉复杂场景下的直线特征 为了应对更复杂的环境条件,比如背景杂乱或者目标物体表面不平整等情况,则推荐使用专门设计用于此类情况下的 **Rake** 工具[^4]。它允许用户指定感兴趣区域内的多个平行线作为探测器,并返回这些线条上的显著变化位置,进而帮助定位潜在的目标界。 下面是一个具体的例子说明怎样配置 Rake 并提取所需的信息: ```hdevelop * 定义输入参数 rake := create_rake_model() set_rake_param(rake, 'angle_start', -pi/4) set_rake_param(rake, 'angle_end', pi/4) set_rake_param(rake, 'step_size', 0.1) * 应用模型到当前图像 apply_rake(Image, RegionResult, Response, rake) * 处理响应结果以获得确切的直线段落 select_shape_regions(RegionResult, SelectedRegions, 'area', 'and', MinArea, MaxArea) get_region_points(SelectedRegions, RowPoints, ColPoints) * 对选定区域内所有点再次尝试做一次更加精细的直线拟合 gen_contour_polygon_xld(PolygonContours, RowPoints, ColPoints) fit_line_contour_xld(PolygonContours,...) % 继续上述类似的拟合操作 ``` 通过这种方式,即使是在充满挑战性的条件下也能够有效地识别出所需的直线结构。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值