上一篇文章中,我们实现了卡尺的边缘定位,卡尺会根据灰度值变化提取准确的位置。通常卡尺中的边缘点有多个,而实际应用中只需要一个。对应于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,增加了抽样点个数、迭代次数、内点距离等控制参数,保证均方误差最小或者内点个数最多,下面的图是拟合效果图。