一、引言
与矩形相垂直的直线边缘对
-
几何关系:这里的“垂直”指的是直线边缘对与矩形的长轴方向垂直。例如,若矩形长轴为水平方向,那么与之垂直的直线边缘对就是竖直方向的。这些直线边缘对通常出现在矩形的边缘位置,比如矩形的左右两侧边缘附近。
-
边缘对特征:边缘对由两条直线边缘组成,这两条边缘在灰度过渡类型上相反,比如一条是从亮到暗的边缘,另一条则是从暗到亮的边缘,且它们在空间位置上相互对应,共同构成一个边缘对。在Halcon中,通过
measure_pairs算子可以提取这样的边缘对,该算子会在测量区域内生成等距的轮廓线,垂直于矩形长轴方向,对轮廓线灰度值进行高斯滤波后,计算一阶导数以定位边缘候选点,再根据灰度过渡类型和幅值阈值进行配对,从而得到符合要求的直线边缘对。
二、检测矩形框的边缘对
*提取与矩形或圆环弧(环形弧)相垂直的直线边缘对
read_image (Image, 'D:/Desktop/pic4.jpg')
get_image_size (Image, Width, Height)
dev_get_window (WindowHandle)
draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2)
gen_rectangle2_contour_xld (Rectangle, Row, Column, Phi, Length1, Length2)
gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, 'nearest_neighbor', MeasureHandle)
* 1:高斯平滑(Gaussian smoothing)中的西格玛(Sigma) Sigma越大-高斯函数曲线更宽-计算每个像素点的新值时会考虑更大邻域内的像素
* 产生更强的平滑效果,去除图像中较大的噪声,也可能导致图像边缘模糊; 需要保留图像中一些重要边缘信息的同时去除少量噪声时,就会选择较小的Sigma值。
* Default: 1.0 Value range: 0.4 ≤ Sigma ≤ 100 (lin) Suggested values: 0.4, 0.6, 0.8, 1.0, 1.5, 2.0, 3.0, 4.0, 5.0, 7.0, 10.0
* 50:阈值(最重要的参数) 最小边缘幅度,灰度值 相差超过该值就会被检索!
* ‘all’:极性 亮区-暗区上升沿/暗区-亮区上升沿 List of values: 'all', 'negative', 'positive' negative(只检测亮-暗) 'all_strongest', 'negative_strongest', 'positive_strongest'
* 'all':端点的选择 List of values: 'all', 'first', 'last'
* RowEdgeFirst:是一个点的集合,有多少个边缘对,就会有几个点
* AmplitudeFirst:第一个边缘的边缘振幅(带符号)
IntraDistance:一个边缘对中两个边缘之间的距离,本例子中会输出两段距离。
InterDistance:相邻边缘对之间的距离。
measure_pairs (Image, MeasureHandle, 1, 50, 'all', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
*dev_clear_window ()
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
for Index := 0 to 1 by 1
dev_disp_text (Index+'起始点', 'image', RowEdgeFirst[Index]-35, ColumnEdgeFirst[Index], 'green', ['box'], ['false'])
gen_cross_contour_xld (Cross2, RowEdgeFirst[Index], ColumnEdgeFirst[Index], 15, rad(45))
dev_disp_text (Index+'终止点', 'image', RowEdgeSecond[Index], ColumnEdgeSecond[Index], 'yellow', ['box'], ['false'])
gen_cross_contour_xld (Cross1, RowEdgeSecond[Index], ColumnEdgeSecond[Index], 15, rad(45))
endfor
*两种方法测量边缘对之间的记录,measure_pos会生成三组距离:边缘对1宽度、中间距离、边缘对2宽度;distance_pp方法测量的是直接两点的距离
measure_pos(Image, MeasureHandle, 1, 30, 'all', 'all', RowEdge, ColumnEdge, Amplitude, Distance)
distance_pp (RowEdgeFirst[0], ColumnEdgeFirst[0], RowEdgeSecond[0], ColumnEdgeSecond[0], Distance1)
最终效果为:

1万+

被折叠的 条评论
为什么被折叠?



