勇哥之前发表的一篇文章《Halcon学习(27-2)halcon测量技术:找线》
这个文章介绍的找线方式是使用算子measure_pos来工作的,因此这种方式适合halcon及以上版本。
勇哥另外几篇贴子里介绍了适合halcon17及以上版本的找线方法:
听说,这些高阶的功能其实也是对halcon10原来的算子的一些封装。
因此,对于工业视觉中常见的找线功能来说,我们必须了解核心的measure_pos算子。
在找线的时候,先使用gen_measure_rectangle2设置测量的矩形句柄,然后再执行measure_pos算子,如下面的代码所示:
gen_measure_rectangle2 (row[i], col[i], Phi, Length1, roiWidth, Width, Height, 'nearest_neighbor', MeasureHandle1) measure_pos (Image, MeasureHandle1, sigma, thresold, transition, select, RowEdge, ColumnEdge, Amplitude, Distance)
下面我们详细来研究下上面两个算子。
(1)gen_measure_rectangle2
创建查找边缘的操作句柄
定义如下:
gen_measure_rectangle2( : : Row, Column, Phi, Length1, Length2, Width, Height, Interpolation : MeasureHandle)
产生测量矩形句柄,控制输入为测量矩形范围的坐标中心,矩形长轴和水平方向夹角范围的弧度,矩形边长的一半,测量图片的宽和高度,输出为测量句柄。
Row, Column是矩形的中心
Length1, Length2是矩形区域的长和宽的一半,关于区域的宽度,尽量在包住边缘的同时设置的越大越好,因为设置的太小噪声太大
Phi是Rectangle旋转的角度,当为正时表示逆时针旋转,当为负时表示顺时针旋转
如果想看ROI是否合适可以利用gen_rectangle1查看
Interpolation表示插值的方法,因为当ROI不是垂直或者水平的话,那么他的Projection(下图中短的等距线)经过的就不是一个完整的像素,因为要计算它的平均值给Profile。它的值就需要插值。
(2)measure_pos
找寻你设定检测区域内的边缘
定义为:
measure_pos(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdge, ColumnEdge, Amplitude, Distance)
算子中的参数Threshold和Amplitude 都涉及到边缘的幅度值
以前 我理解边缘幅度值边缘处渐变的灰度差值,但现在看来这个理解是不准确的,应该是边缘灰度值变化的趋势,因为由黑到白(小变大)和由白到黑(大变小) 在图形中反映出幅度为负和正;因此可以理解这个幅度值是有正负的;
Sigma表示高斯滤波的参数,高斯滤波的是对Profile形成的曲线
Threshold是对他的一阶导数设置的阈值。这个理解比较不容易,可以暂时理解为你选取的幅度阈值下限。
另有一种可信的官方说法是:提取边缘轮廓的最小梯度幅度
Transition = ‘negative’时表示由像素值高转到低像素值的边缘放在RowEdgeFirst中,这里有一个参考方向,就是Rectangle旋转角度为0时,从左到右的方向。另一解释:沿主轴方向dark-to-light定义为第一类边缘,反之为第二类边缘。
或者参考下面的理解:
Transition=‘positive’ 代表找寻所有正边缘 :所谓正边缘即为在查找方向上从黑到白过渡变化的边缘;
Transition=‘negative’ 代表找寻所有负边缘 :所谓负边缘即为在查找方向上从白到黑过渡变化的边缘;
Transition=‘all’ 代表找寻所有边缘 ;
RowEdge:边的中心行坐标
ColumnEdge :边的中心列坐标
Distance: 表示的是边缘组之间的距离
Amplitude 获取的是你提取到的边缘处的幅度大小
1.构造测量对象——建立测量区域
2.剖面线计算——做灰度值平均投影
3.剖面线光滑——消除噪声
4.剖面线求导
5.局部极值/边缘
勇哥以几个实例来说明一下measure_pos及其Sigma和Threshold的实际效果。
(例1)
在这里,我们看到底边突出来的部分,由于其点数相对于总点数150较少,所以最终拟合线条时被舍弃掉那部分点。
thresold := 40 sigma := 1 roiWidth := 60 transition := 'negative' select := 'first' p_number :=150 level := 3
(例2)
参数没有变,勇哥让底边突出部分超过150个点的一大半。
可以看到由于它占的比率大,所以最后拟合的线条是突出来的那部分。
thresold := 40 sigma := 1 roiWidth := 60 transition := 'negative' select := 'first' p_number :=150 level := 3
(例3)
thresold := 40 sigma := 1 roiWidth := 60 transition := 'negative' select := 'first' p_number :=150 level := 3
sigma := 30
Sigma表示高斯滤波的参数,高斯滤波的是对Profile形成的曲线。
我们通过实验,眼睛看到参数sigma影响的是点吃进去边缘像素的程度。
至于threshold来说,用起来容易理解。
如果边缘与背景越难区分,其值要越小。反之,其值需要越大。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

