• segment_object_model_3d


    * ***********************************************************************

    * This example program shows how to use the operator

    * segment_object_model_3d in HALCON. First, the 2.5D

    * input image is segmented. Additionally, with the same

    * operator, a fitting is performed. The result of the

    * 3D segmentation is converted to a region and is

    * displayed. Finally, the values of the fitted radii

    * for the cylinders and spheres are visualized.

    * 首先,分割2.5D输入图像,转化为适当的3D Model,

    * 并分割成sub Models(segment_object_model_3d),sub Models转化为区域并显示。

    * 最终,圆柱形和球形标示半径并图形化显示。

    * ***********************************************************************

    dev_update_off ()

    dev_close_window ()

    * Input: 2.5D image

    * 读取:2.5D图像

    read_image (XYZ, '3d_machine_vision/segmentation/3d_primitives_xyz_01.tif')

    dev_open_window_fit_image (XYZ, 0, 0, -1, -1, WindowHandle)

    set_display_font (WindowHandle, 16, 'mono', 'true', 'false')

    * Access to (x-, y-, z-)coordinates

    * 读取(X,Y,Z)坐标通道数据

    access_channel (XYZ, X, 1)

    access_channel (XYZ, Y, 2)

    access_channel (XYZ, Z, 3)

    *

    Message := 'Generate a 3D object model from an'

    Message[1] := 'XYZ image and segment primitives'

    Message[2] := '(spheres, cylinders, planes) in it:'

    dev_display (Z)

    disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')

    disp_continue_message (WindowHandle, 'black', 'true')

    stop ()

    * Prepare the segmentation

    * 准备分割

    xyz_to_object_model_3d (X, Y, Z, ObjectModel3DID)

    prepare_object_model_3d (ObjectModel3DID, 'segmentation', 'false', 'max_area_holes', 100)

    ParSegmentation := ['max_orientation_diff','max_curvature_diff','output_xyz_mapping','min_area']

    ValSegmentation := [0.13,0.11,'true',150]

    ParFitting := ['primitive_type','fitting_algorithm']

    ValFitting := ['all','least_squares_huber']

    * Segmentation and fitting is done in one step,

    * because the parameter 'fitting' is set to 'true' by default

    * 分割和适应性一步完成

    * 因为参数'fitting' 默认设置为'true'

    segment_object_model_3d (ObjectModel3DID, [ParSegmentation,ParFitting],

                             [ValSegmentation,ValFitting], ObjectModel3DOutID)

    * Clear the object model that is no longer used.

    clear_object_model_3d (ObjectModel3DID)

    * Show the result of the segmentation

    * 显示分割结果

    dev_set_colored (12)

    for Index := 0 to |ObjectModel3DOutID| - 1 by 1

        object_model_3d_to_xyz (XTmp, YTmp, ZTmp, ObjectModel3DOutID[Index], 'from_xyz_map', [], [])

        get_domain (ZTmp, DomainTmp)

        if (Index == 0)

            copy_obj (DomainTmp, Domain, 1, 1)

        else

            concat_obj (Domain, DomainTmp, Domain)

        endif

    endfor

    dev_display (Domain)

    disp_message (WindowHandle, '3D Segmentation', 'window', 12, 12, 'black', 'true')

    disp_message (WindowHandle, 'Segmented objects: ' + |ObjectModel3DOutID|, 'window', 40, 12, 'black', 'true')

    disp_continue_message (WindowHandle, 'black', 'true')

    stop ()

     

    * Show the result of the fitting

    dev_clear_window ()

     

    * 外部函数

    #dev_display_fitting_results (RegionCylinder, RegionSphere, RegionPlane, RegionNone,

    #                            ObjectModel3DOutID, WindowHandle, [])

    * This procedure displays the results of a fitting operation.

    * Additionally to the primitive regions, the radius of

    * cylinders and spheres is displayed.

    * The colors can be specified with the parameter Colors

    * in the following manner:

    * Color[0] is used for objects which could not be fitted

    * Color[1] is used for cylinders

    * Color[2] is used for spheres

    * Color[3] is used for planes

    *

    Colors := ['dim gray','forest green','red','slate blue']

     

    NumNone := 0

    NumCylinders := 0

    NumSpheres := 0

    NumPlanes := 0

    for Index := 0 to |ObjectModel3DOutID| - 1 by 1

        object_model_3d_to_xyz (XTmp, YTmp, ZTmp, ObjectModel3DOutID[Index], 'from_xyz_map', [], [])

        get_domain (XTmp, DomainTmp)

        get_object_model_3d_params(ObjectModel3DOutID[Index], 'has_primitive_data', ParamValue)

        if (ParamValue == 'true')

            get_object_model_3d_params(ObjectModel3DOutID[Index], 'primitive_parameter', GenParamValuesP)

            get_object_model_3d_params(ObjectModel3DOutID[Index], 'primitive_type', ParamValue)

            if (ParamValue == 'cylinder')

                if (NumCylinders == 0)

                    copy_obj (DomainTmp, RegionCylinder, 1, -1)

                    RadiusCylinder := GenParamValuesP[6]

                else

                    concat_obj (RegionCylinder, DomainTmp, RegionCylinder)

                    RadiusCylinder := [RadiusCylinder,GenParamValuesP[6]]

                endif

                NumCylinders := NumCylinders + 1

            elseif (ParamValue == 'sphere')

                if (NumSpheres == 0)

                    copy_obj (DomainTmp, RegionSphere, 1, -1)

                    RadiusSphere := GenParamValuesP[3]

                else

                    concat_obj (RegionSphere, DomainTmp, RegionSphere)

                    RadiusSphere := [RadiusSphere,GenParamValuesP[3]]

                endif

                NumSpheres := NumSpheres + 1

            else

                if (NumPlanes == 0)

                    copy_obj (DomainTmp, RegionPlane, 1, -1)

                else

                    concat_obj (RegionPlane, DomainTmp, RegionPlane)

                endif

                NumPlanes := NumPlanes + 1

            endif

        else

            if (NumNone == 0)

                copy_obj (DomainTmp, RegionNone, 1, -1)

            else

                concat_obj (RegionNone, DomainTmp, RegionNone)

            endif

            NumNone := NumNone + 1

        endif

    endfor

    *

    NumColors := |Colors|

    if (NumNone > 0)

        dev_set_color (Colors[0 % NumColors])

        dev_display (RegionNone)

    endif

    if (NumCylinders > 0)

        dev_set_color (Colors[1 % NumColors])

        dev_display (RegionCylinder)

    endif

    if (NumSpheres > 0)

        dev_set_color (Colors[2 % NumColors])

        dev_display (RegionSphere)

    endif

    if (NumPlanes > 0)

        dev_set_color (Colors[3 % NumColors])

        dev_display (RegionPlane)

    endif

    disp_message (WindowHandle, '3D Fitting', 'window', -1, -1, 'black', 'true')

    Message := 'Cylinders: ' + NumCylinders

    Message[1] := 'Spheres: ' + NumSpheres

    Message[2] := 'Planes: ' + NumPlanes

    Message[3] := 'Undefined: ' + NumNone

    disp_message (WindowHandle, Message, 'window', 40, 12, 'black', 'true')

    if (NumCylinders > 0)

        * Display radius for each cylinder

        area_center (RegionCylinder, Area, Row, Column)

        for Index := 0 to NumCylinders - 1 by 1

            Radius := int(RadiusCylinder[Index] * 1000)

            disp_message (WindowHandle, 'Cylinder r = ' + Radius + ' mm', 'image', Row[Index], Column[Index], 'white', 'false')

        endfor

    endif

    if (NumSpheres > 0)

        * Display radius for each cylinder sphere

        area_center (RegionSphere, Area, Row, Column)

        for Index := 0 to NumSpheres - 1 by 1

            Radius := int(RadiusSphere[Index] * 1000)

            disp_message (WindowHandle, 'Sphere r = ' + Radius + ' mm', 'image', Row[Index], Column[Index], 'white', 'false')

        endfor

    endif

        

     

    * Example code, if further inspections should be made:

    *

    * Store only the data of the primitive to save memory

    for Index := 0 to |ObjectModel3DOutID| - 1 by 1

        * Copy only the data of the primitive

        copy_object_model_3d (ObjectModel3DOutID[Index], 'primitives_all', CopiedObjectModel3DID)

        * Clear the object model that is no longer used.

        clear_object_model_3d (ObjectModel3DOutID[Index])

        * Further inspections

        * .....

        * .....

        * Clear the copied model after applying further inspections

        clear_object_model_3d (CopiedObjectModel3DID)

    endfor

    dev_update_on ()

  • 相关阅读:
    【模块汇总】
    【葵花宝典@2020Python面试】
    【数据库汇总】
    【Python初阶汇总】
    【葵花宝典@职场动物园】
    【2020Python修炼记】web框架之Django实战-BBS-高仿版博客园
    【2020Python修炼记】web框架之 权限管理+Auth模块
    Java SE基础2:Class类与反射 反射破坏了封装吗?
    Java SE基础1:面向对象三大基本特性
    11.堆与堆的应用
  • 原文地址:https://www.cnblogs.com/touch-skyer/p/8126199.html
Copyright © 2020-2023  润新知