工控编程吧
标题:
halcon dist_rectangle2_contour_points_xld函数介绍
[打印本页]
作者:
qq263946146
时间:
2019-5-24 14:01
标题:
halcon dist_rectangle2_contour_points_xld函数介绍
dist_rectangle2_contour_points_xld(Contour : : ClippingEndPoints, Row, Column, Phi, Length1, Length2 : Distances)
dist_rectangle2_contour_points_xld确定
Contour
轮廓点与一个
任意方向的矩形之间的欧氏距离。
矩形由中心(
Row, Column
)、方向Phi,半边长度Length1和Length2指定。
角度单位,表示水平轴与
Length1,
沿数学上正方向(逆时针方向)
的夹角。
根据用于创建轮廓
Contour
的处理方法,轮廓的起点和终点可能包含位置错误。
在这种情况下,通常调用操作符fit_rectangle2_contour_xld,
并将参数clippingendpoint设置为大于零的值,以便从计算中排除轮廓开始和结束的点。
为了计算拟合过程中使用的同一组点的距离,
clippingendpoint应该设置为与fit_rectangle2_contour_xld中相同的值。
应用实例
*例程用fit_rectangle2_contour_xld检测小金属部件上冲孔的制造缺陷。
*缺陷呈现为金属孔洞内的微小凸出,可以通过将孔洞拟合成矩形稳定检测(例如使用离群值抑制)。
*再使用dist_rectangle2_contour_points_xld计算轮廓边缘到矩形边的距离。
*孔四个顶角稍微成圆弧,一些额外的处理必须执行,以忽略在检查时,受矩形4个角影响。
dev_update_off ()
read_image (Image, 'punched_holes')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
*由于金属部分是背光的,通过构造一个ROI来实现尽可能小的亚像素精确边缘提取,
*可以显著提高处理速度。这很容易通过阈值和形态学来实现。
fast_threshold (Image, Region, 128, 255, 10)
boundary (Region, Border, 'inner')
dilation_rectangle1 (Border, EdgeROI, 7, 7)
reduce_domain (Image, EdgeROI, ImageReduced)
edges_sub_pix (ImageReduced, Edges, 'canny', 1.7, 40, 120)
select_shape_xld (Edges, RectangleEdges, 'contlength', 'and', 500, 100000)
* 使用Tukey的离群值抑制将矩形匹配到孔的边缘。
fit_rectangle2_contour_xld (RectangleEdges, 'tukey', -1, 0, 0, 3, 2, Row, Column, Phi, Length1, Length2, PointOrder)
gen_rectangle2_contour_xld (Rectangles, Row, Column, Phi, Length1, Length2)
dev_set_line_width (3)
dev_set_color ('red')
dev_display (Image)
dev_display (Rectangles)
* 检测金属孔是否正常
count_obj (RectangleEdges, Number)
for I := 0 to Number - 1 by 1
select_obj (RectangleEdges, RectangleEdge, I + 1)
* 获取轮廓点坐标
get_contour_xld (RectangleEdge, Rows, Cols)
* 用拟合矩形计算出的参数生成矩形
gen_rectangle2_contour_xld (Rect, Row[I], Column[I], Phi[I], Length1[I], Length2[I])
get_contour_xld (Rect, RowC, ColC)
*计算所有轮廓线点到矩形四角的距离。
D1 := sqrt((Rows - RowC[0]) * (Rows - RowC[0]) + (Cols - ColC[0]) * (Cols - ColC[0]))
D2 := sqrt((Rows - RowC[1]) * (Rows - RowC[1]) + (Cols - ColC[1]) * (Cols - ColC[1]))
D3 := sqrt((Rows - RowC[2]) * (Rows - RowC[2]) + (Cols - ColC[2]) * (Cols - ColC[2]))
D4 := sqrt((Rows - RowC[3]) * (Rows - RowC[3]) + (Cols - ColC[3]) * (Cols - ColC[3]))
*轮廓线点到矩形顶点的距离通过四个距离的最小值给出。这个距离用来排除和顶点太近的轮廓点
DistCorner := min2(min2(D1,D2),min2(D3,D4))
* 计算矩形轮廓点的距离
dist_rectangle2_contour_points_xld (RectangleEdge, 0, Row[I], Column[I], Phi[I], Length1[I], Length2[I], Dist)
*通过检查轮廓点到矩形的距离来检查冲孔是否OK
*如果离矩形四个角距离大于7个像素的轮廓点,距拟合矩形的距离小于1个像素侧OK
*
Row[I], Column[I], Phi[I], Length1[I], Length2[I]为调用
fit_rectangle2_contour_xld
生成的矩形参数
*所以可以执行下面代码进行判断
* RectangleOK := true
* for J := 0 to |Dist| - 1 by 1
* if (DistCorner[J] > 7.0 and Dist[J] > 1.0)
* RectangleOK := false
* break
* endif
* endfor
*一种计算更快的方法是使用掩码来处理,1表示参与计算,0相反。
*最小距离减去7,结果与0对比选大值,用sgn函数处理结果,生成掩码
Mask := sgn(max2(DistCorner - 7.0,0.0))
*用掩码乘以距离来查检是否在允许范围内
RectangleOK := max(Dist * Mask) <= 1.0
* Display whether the hole is OK.
if (RectangleOK)
dev_set_color ('green')
get_string_extents (WindowHandle, 'OK', Ascent, Descent, Width, Height)
set_tposition (WindowHandle, Row[I] - Height / 2, Column[I] - Width / 2)
write_string (WindowHandle, 'OK')
else
dev_set_color ('red')
get_string_extents (WindowHandle, 'Not OK', Ascent, Descent, Width, Height)
set_tposition (WindowHandle, Row[I] - Height / 2, Column[I] - Width / 2)
write_string (WindowHandle, 'Not OK')
endif
endfor
[halcon]1[/halcon]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4