工控编程吧

标题: halcon segment_contour_attrib_xld函数介绍 [打印本页]

作者: qq263946146    时间: 2019-5-22 12:43
标题: halcon segment_contour_attrib_xld函数介绍
segment_contour_attrib_xld(Contour : ContourPart : Attribute, Operation, Min, Max : )
函数分析轮廓Contour 为子轮廓,保存到ContourPart 。
轮廓线的分割依赖于它的attributes属性的值(参见下面attribute的可能值)。
操作符检查哪些属性值位于给定的限制(Min、Max)内,
并返回相应的轮廓段及其在ContourPart中的属性。

如果Operation被设置为'and',
则每个给定的属性都必须位于限制范围内。
如果Operation被设置为'or',
则至少有一个属性必须在限制范围内。
处理属性的顺序与属性中给出的顺序相同。
如果只使用一个属性,则忽略Operation的值。


注意,并非所有属性都在每个默认值的所有轮廓中定义。
为轮廓定义哪些属性取决于轮廓是如何实例化的,
以及以前是否对轮廓执行过某些操作。
例如,只有在使用lines_gauss操作符创建轮廓时,
才定义属性'width_right'和'width_left'。
同样,只有到其他轮廓线的距离,
事先调用distance_contours_xld或apply_distance_transform_xld计算时,
才能使用属性“distance”。


halcon自带例程


*例程演示通过计算轮廓间逐点距离,实现手机外壳的摄像头外框好坏检测。
*使用函数distance_contours_xld计算摄像头内外轮廓间距,
*使用函数egment_contour_attrib_xld提取其缺陷。
* 判断好坏的公差值设置
MinWidth := 30
MaxWidth := 35
SmoothnessTolerance := .2
file:='plastic_parts/phone_camera_frame_02'
Colors := ['white','green','yellow','orange','red']
dev_update_off ()
dev_close_window ()
read_image (Image, file)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_display (Image)
*提取边框图像
threshold (Image, Region, 100, 255)
dilation_rectangle1 (Region, RegionDilation, 15, 15)
reduce_domain (Image, RegionDilation, ImageReduced)
*提取边框图像的边缘
edges_sub_pix (ImageReduced, Edges, 'canny', 0.7, 10, 60)
union_adjacent_contours_xld (Edges, UnionContours, 7, 7, 'attr_keep')
select_shape_xld (UnionContours, SelectedContours, 'contlength', 'and', 700, 99999)
*选择最内,最外轮廓   
length_xld (SelectedContours, Length)
tuple_sort_index (Length, Indices)
select_obj (SelectedContours, InnerContour, Indices[0] + 1)
select_obj (SelectedContours, OuterContour, Indices[3] + 1)
*计算内外轮廓的距离,距离信息保存到OuterContourWithWidth,且轮廓和InnerContour一样
distance_contours_xld (InnerContour, OuterContour, OuterContourWithWidth, 'point_to_segment')
*获取超出上公差,下公差的部分轮廓
segment_contour_attrib_xld (OuterContourWithWidth, OuterContourPartToNarrow, 'distance', 'or', 0, MinWidth)
segment_contour_attrib_xld (OuterContourWithWidth, OuterContourPartToWide, 'distance', 'or', MaxWidth, 10000)
*将轮廓进行平滑处理,检查平滑前后两轮廓间距离是否在公差范围内
smooth_contours_xld (OuterContour, OuterContourSmooth, 11)
smooth_contours_xld (InnerContour, InnerContourSmooth, 11)
distance_contours_xld (OuterContour, OuterContourSmooth, OuterContourWithDistance, 'point_to_segment')
distance_contours_xld (InnerContour, InnerContourSmooth, InnerContourWithDistance, 'point_to_segment')
segment_contour_attrib_xld (OuterContourWithDistance, OuterContourDefect, 'distance', 'or', SmoothnessTolerance, 100)
segment_contour_attrib_xld (InnerContourWithDistance, InnerContourDefect, 'distance', 'or', SmoothnessTolerance, 100)
*显示结果
    dev_display (Image)
    count_obj (OuterContourPartToNarrow, NumTooNarrow)
    count_obj (OuterContourPartToWide, NumTooWide)
    count_obj (OuterContourDefect, NumInnerDefects)
    count_obj (InnerContourDefect, NumOuterDefects)
    if (NumTooNarrow + NumTooWide + NumInnerDefects + NumOuterDefects == 0)
        OK := 1
        disp_message (WindowHandle, 'Frame OK', 'window', 50, 12, 'forest green', 'true')
    else
        OK := 0
        disp_message (WindowHandle, 'Frame not OK', 'window', 50, 12, 'red', 'true')
    endif
    dev_set_line_width (1)
    dev_set_color (Colors[1])
    dev_display (OuterContour)
    dev_display (InnerContour)
    dev_set_line_width (5)
    dev_set_color (Colors[2])
    dev_display (OuterContourPartToNarrow)
    dev_set_color (Colors[3])
    dev_display (OuterContourPartToWide)
    dev_set_color (Colors[4])
    dev_display (OuterContourDefect)
    dev_set_color (Colors[4])
    dev_display (InnerContourDefect)

[halcon]1[/halcon]






欢迎光临 工控编程吧 (https://www.gkbc8.com/) Powered by Discuz! X3.4