Halcon 颜色检测

文章目录

算子

decompose3 - 将三通道图像转换为三个图R,G,B图像

decompose3(MultiChannelImage : Image1, Image2, Image3 : : )
MultiChannelImage:输入三色图像
Image1:输出Red 图像
Image2:输出Green图像
Image3:输出Blue图像

 
 

    trans_from_rgb 将图像转换为HSV 图像

    trans_from_rgb(ImageRed, ImageGreen, ImageBlue : ImageResult1, ImageResult2, ImageResult3 : ColorSpace : ) 
    ImageRed, ImageGreen, ImageBlue   输入图像红色通道,输入图像绿色通道,输入图像蓝色通道
    ImageResult1, ImageResult2, ImageResult3   输出图像通道1,通道2,通道3
    ColorSpace    颜色空间
    
     
     

      create_color_trans_lut — 创建RGB颜色空间到任意颜色空间的图像转换查找表
      参数

      create_color_trans_lut( : : ColorSpace, TransDirection, NumBits : ColorTransLUTHandle)
      ColorSpace(输入控制) string → (字符串)
      输出图像的颜色空间。
      默认值:'hsv'
      值列表:'argyb''cielab''cielchab''cielchuv''cieluv''ciexyz''ciexyz3''ciexyz4''ciexyz4''hls''hls''hsi''hsv''i1i2i3''ihs''lms''yiq''yuv'
      TransDirection(输入控制) string → (字符串)
      颜色空间转换的方向。
      默认值:'from_rgb'
      值列表:'from_rgb''to_rgb'
      NumBits(输入控制) integer → (整数)
      输入图像的位数。
      默认值:8
      值列表:8
      ColorTransLUTHandle(输出控制) color_trans_lut → (整数)
      颜色空间转换查找表的句柄。
      
       
       

        apply_color_trans_lut — 使用预生成的查找表进行颜色空间转换。

        apply_color_trans_lut(Image1, Image2, Image3 : ImageResult1, ImageResult2, ImageResult3 : ColorTransLUTHandle : )
        参数
        Image1(输入对象) singlechannelimage(-array) → 对象(字节)
        输入图像(通道2)。
        Image2(输入对象) singlechannelimage(-array) → 对象(字节)
        输入图像(通道2)。
        Image3(输入对象) singlechannelimage(-array) → 对象(字节)
        输入图像(通道3)。
        ImageResult1(输出对象) singlechannelimage(-array) → 对象(字节)
        颜色转换后的输出图像(通道1)。
        ImageResult2(输出对象) singlechannelimage(-array) → 对象(字节)
        颜色转换后的输出图像(通道2)。
        ImageResult3(输出对象) singlechannelimage(-array) → 对象(字节)
        颜色转换后的输出图像(通道3)。
        ColorTransLUTHandle(输入控制) color_trans_lut → (整数)
        颜色空间转换查找表的句柄。
        
         
         

          copy_obj 图像图层复制

          copy_obj(Objects : ObjectsSelected : Index, NumObj : )
          这些参数用于控制 copy_obj 函数的操作,具体如下:
          
          Objects(输入对象):待复制的对象或对象数组。
          ObjectsSelected(输出对象):复制后的对象或对象数组。
          Index(输入控制):要复制的对象的起始索引。
              默认值为 <span class="token number">1</span>,建议的取值范围包括 <span class="token number">1</span>、<span class="token number">2</span>、<span class="token number">3</span> 等。
              典型取值范围为大于等于<span class="token number">1</span>的整数。
          NumObj(输入控制):要复制的对象数量,或者设为 <span class="token operator">-</span><span class="token number">1</span> 表示复制所有对象。
              默认值为 <span class="token number">1</span>,建议的取值范围包括 <span class="token operator">-</span><span class="token number">1</span>、<span class="token number">1</span>、<span class="token number">2</span>、<span class="token number">3</span> 等。
              典型取值范围为不小于 <span class="token operator">-</span><span class="token number">1</span> 的整数,当设为 <span class="token operator">-</span><span class="token number">1</span> 时表示复制从索引 Index 开始的所有对象。
          

            人工智能算子

            create_class_mlp 创建用于分类或回归的多层感知器。

            create_class_mlp( : : NumInput, NumHidden, NumOutput, OutputFunction, Preprocessing, NumComponents, RandSeed : MLPHandle)
            参数解释如下:
            
            NumInput(输入控制):MLP的输入变量(特征)数量。
            NumHidden(输入控制):MLP的隐藏单元数量。
            NumOutput(输入控制):MLP的输出变量(类别)数量。
            OutputFunction(输入控制):MLP输出层激活函数的类型。
            Preprocessing(输入控制):用于转换特征向量的预处理类型。
            NumComponents(输入控制):预处理参数,转换特征的数量(对于某些预处理类型)。
            RandSeed(输入控制):用于初始化MLP随机值的随机数生成器种子值。
            MLPHandle(输出控制):MLP句柄,用于引用创建的多层感知器。
            

              add_samples_image_class_mlp 将图像中的训练样本添加到多层感知器的训练数据中。

              add_samples_image_class_mlp(Image, ClassRegions : : MLPHandle : )
              参数解释如下:
                  Image(输入对象):训练图像,可以是多通道图像。
                  ClassRegions(输入对象):要进行训练的类别区域。
                  MLPHandle(输入控制,状态被修改):MLP句柄,用于指定要使用的多层感知器模型。
              
               
               

                train_class_mlp 训练多层感知器

                train_class_mlp( : : MLPHandle, MaxIterations, WeightTolerance, ErrorTolerance : Error, ErrorLog)
                这些参数用于控制多层感知器(MLP)模型的训练过程,具体如下:
                    MLPHandle(输入控制,状态被修改):MLP句柄,指定要使用的多层感知器模型。
                    MaxIterations(输入控制):优化算法的最大迭代次数。
                    WeightTolerance(输入控制):权重变化阈值,用于控制优化算法在两次迭代之间权重的差异。
                    ErrorTolerance(输入控制):误差变化阈值,用于控制优化算法在两次迭代之间训练数据上的平均误差的差异。
                    Error(输出控制):MLP在训练数据上的平均误差。
                    ErrorLog(输出控制):MLP在训练数据上的平均误差随着优化算法迭代次数的变化情况。
                
                 
                 

                  classify_image_class_mlp 使用多层感知器对图像进行分类。

                  classify_image_class_mlp(Image : ClassRegions : MLPHandle, RejectionThreshold : )
                  这些参数用于进行图像分类和分割,具体如下:
                  
                  Image(输入对象):输入图像,可以是多通道图像。
                  ClassRegions(输出对象):分类后的类别区域。
                  MLPHandle(输入控制):MLP句柄,指定要使用的多层感知器模型。
                  RejectionThreshold(输入控制):分类拒绝阈值,用于确定是否拒绝对某个像素进行分类。
                      默认值为<span class="token number">0.5</span>,建议的取值范围为<span class="token number">0.0</span>到<span class="token number">1.0</span>之间。
                      若RejectionThreshold设置为<span class="token number">0.5</span>,则类别概率小于<span class="token number">0.5</span>的像素将被拒绝分类。
                  

                    clear_class_mlp 分类器清楚

                    clear_class_mlp( : : MLPHandle : )
                    MLPHandle 句柄
                    
                     
                     

                      高斯混合模型算子

                      create_class_gmm 创建高斯混合分类器

                      create_class_gmm( : : NumDim, NumClasses, NumCenters, CovarType, Preprocessing, NumComponents, RandSeed : GMMHandle)
                      这些参数是用于控制 GMM(高斯混合模型)的创建与初始化的,具体如下:
                          NumDim(输入控制):特征空间的维数。
                              默认值为 3,建议的取值范围包括 1234 等。
                              取值范围为不小于 1 的整数。
                          NumClasses(输入控制):GMM 的类别数量。
                              默认值为 5,建议的取值范围包括 1234 等。
                              取值范围为不小于 1 的整数。
                          NumCenters(输入控制):每个类别的中心数量。
                              默认值为 1,建议的取值范围包括 1234 等。
                              取值范围为不小于 1 的整数。
                          CovarType(输入控制):协方差矩阵的类型。
                              默认值为 'spherical',可选择 'diag''full''spherical'。
                          Preprocessing(输入控制):用于转换特征向量的预处理类型。
                              默认值为 'normalization',可选择 'canonical_variates''none''normalization''principal_components'。
                          NumComponents(输入控制):预处理参数,转换后的特征数量(仅在 Preprocessing = 'canonical_variates''normalization' 时有效)。
                              默认值为 10,建议的取值范围包括 1234 等。
                              取值范围为不小于 1 的整数。
                          RandSeed(输入控制):用于初始化 GMM 随机值的随机数生成器的种子值。
                              默认值为 42。
                          GMMHandle(输出控制):GMM 的句柄。
                      

                        add_samples_image_class_gmm 添加样本

                        add_samples_image_class_gmm(Image, ClassRegions : : GMMHandle, Randomize : )
                        这些参数用于训练 GMM 模型的过程,具体如下:
                        
                        Image(输入对象):训练图像,可以是多通道图像。
                        ClassRegions(输入对象):待训练类别的区域。这里采用区域数组来表示不同类别的区域。
                        GMMHandle(输入控制,状态被修改):GMM 模型的句柄,用于指定训练的模型。
                        Randomize(输入控制):添加到训练数据中的高斯噪声的标准差。
                            默认值为 <span class="token number">0.0</span>。
                            建议的取值范围为 <span class="token number">0.0</span>、<span class="token number">1.5</span>、<span class="token number">2.0</span> 等。
                            Randomize 的取值应不小于 <span class="token number">0.0</span>。
                        

                          train_class_gmm 训练

                          train_class_gmm( : : GMMHandle, MaxIter, Threshold, ClassPriors, Regularize : Centers, Iter)
                          这些参数用于控制 GMM 的训练和迭代过程,具体如下:
                          
                          GMMHandle(输入控制,状态被修改):GMM 模型的句柄,用于指定训练的模型。
                          MaxIter(输入控制):期望最大化算法的最大迭代次数。
                              默认值为 <span class="token number">100</span>。
                              建议的取值范围包括 <span class="token number">10</span>、<span class="token number">20</span>、<span class="token number">30</span>、<span class="token number">50</span>、<span class="token number">100</span>、<span class="token number">200</span> 等。
                          Threshold(输入控制):确定期望最大化算法终止的误差相对变化阈值。
                              默认值为 <span class="token number">0.001</span>。
                              建议的取值范围包括 <span class="token number">0.001</span>、<span class="token number">0.0001</span> 等。
                              Threshold 的取值范围为大于等于 <span class="token number">0.0</span> 且小于等于 <span class="token number">1.0</span>。
                          ClassPriors(输入控制):确定类别的先验概率的模式。
                              默认值为 <span class="token char">'training'</span>,表示使用训练数据中的类别先验概率。
                              可选值为 <span class="token char">'training'</span> 和 <span class="token char">'uniform'</span>。
                          Regularize(输入控制):防止协方差矩阵奇异性的正则化值。
                              默认值为 <span class="token number">0.0001</span>。
                              Regularize 的取值范围为大于等于 <span class="token number">0.0</span> 且小于 <span class="token number">1.0</span>。
                          Centers(输出控制):每个类别找到的中心数量。
                          Iter(输出控制):每个类别执行的迭代次数。
                          

                            clear_class_gmm 清除句柄

                            clear_class_gmm( : : GMMHandle : )
                            
                             
                             

                              create_class_lut_gmm 使用高斯混合模型创建查找表,对字节图像进行分类。

                              create_class_lut_gmm( : : GMMHandle, GenParamName, GenParamValue : ClassLUTHandle)
                              这些参数用于控制 LUT(查找表)分类器的创建过程,具体如下:
                                  GMMHandle(输入控制):GMM 模型的句柄,用于指定要创建 LUT 分类器的模型。
                                  GenParamName(输入控制):可以调整用于创建 LUT 分类器的通用参数的名称数组。
                                      默认值为 [],表示没有通用参数需要调整。
                                      建议的取值范围包括 'bit_depth''class_selection''rejection_threshold' 等。
                                  GenParamValue(输入控制):可以调整用于创建 LUT 分类器的通用参数的值数组。
                                      默认值为 [],表示没有通用参数需要调整。
                                      建议的取值范围包括整数、实数或字符串,如 876'fast''best' 等。
                                  ClassLUTHandle(输出控制):LUT 分类器的句柄,用于指定创建的 LUT 分类器。
                              
                               
                               

                                classify_image_class_lut 颜色分类表

                                classify_image_class_lut(Image : ClassRegions : ClassLUTHandle : )
                                这些参数用于执行基于 LUT(查找表)分类器的图像分类操作,具体如下:
                                
                                Image(输入对象):输入的多通道图像,通常为字节类型。这是需要进行分类的图像数据。
                                ClassRegions(输出对象):分割后的类别区域数组对象,用于存储分类结果。每个类别将对应一个区域。
                                ClassLUTHandle(输入控制):LUT 分类器的句柄,用于指定要应用的 LUT 分类器。
                                

                                  clear_class_lut 清除句柄

                                  clear_class_lut( : : ClassLUTHandle : )
                                  ClassLUTHandle  句柄
                                  
                                   
                                   

                                    Halcon 示例1 通过色调和饱和度识别颜色

                                    在这里插入图片描述

                                    * color_simple.hdev: segment yellow cable in HSV color space
                                    dev_close_window ()
                                    dev_open_window (0, 0, 640, 480, 'black', WindowHandle)
                                    for i := 1 to 2 by 1
                                        read_image (Image, 'cable' + i)
                                        * 获取rgb图像
                                        decompose3 (Image, Red, Green, Blue)
                                        * 将rgb 图像转换为 HSI图像
                                        trans_from_rgb (Red, Green, Blue, Hue, Saturation, Intensity, 'hsv')
                                        threshold (Saturation, HighSaturation, 100, 255)
                                        reduce_domain (Hue, HighSaturation, HueHighSaturation)
                                        threshold (HueHighSaturation, Yellow, 20, 50)
                                        connection (Yellow, ConnectedRegions)
                                        select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 0)
                                        closing_circle (SelectedRegions, Yellow, 3.5)
                                        reduce_domain (Image, Yellow, ImageReduced)
                                        dev_display (HueHighSaturation)
                                        dev_display (ImageReduced)
                                        stop ()
                                    endfor
                                    
                                     
                                     

                                      在这里插入图片描述

                                      Halcon 示例2通过饱和度和色调进行颜色检测

                                      在这里插入图片描述

                                      * color_fuses.hdev: classify fuses by color
                                      dev_update_window ('off')
                                      * ****
                                      * step: set up fuse properties and hue ranges
                                      * ****
                                      FuseColors := ['Orange','Red','Blue','Yellow','Green']
                                      FuseTypes := [5,10,15,20,30]
                                      * HueRanges: Orange 10-30, Red 0-10...
                                      HueRanges := [10,30,0,10,125,162,30,64,96,128]
                                      Count := 0
                                      dev_close_window ()
                                      dev_open_window (0, 0, 800, 600, 'black', WH)
                                      while (Count <= 4)
                                          * ****
                                          * step: acquire image
                                          * ****
                                          read_image (Image, 'color/color_fuses_0' + Count)
                                          dev_display (Image)
                                          set_tposition (WH, 12, 512)
                                          write_string (WH, 'color/color_fuses0' + Count + '.png')
                                          * ****
                                          * step: extract saturated hues
                                          * ****
                                          * 1.提取饱和度和色调
                                          decompose3 (Image, Red, Green, Blue)
                                          trans_from_rgb (Red, Green, Blue, Hue, Saturation, Intensity, 'hsv')
                                          threshold (Saturation, Saturated, 60, 255)
                                          reduce_domain (Hue, Saturated, HueSaturated)
                                          for Fuse := 0 to |FuseTypes| - 1 by 1
                                              * ****
                                              * step: classify specific fuse
                                              * ****
                                              * 颜色分类
                                              threshold (HueSaturated, CurrentFuse, HueRanges[Fuse * 2], HueRanges[Fuse * 2 + 1])
                                              connection (CurrentFuse, CurrentFuseConn)
                                              fill_up (CurrentFuseConn, CurrentFuseFill)
                                              select_shape (CurrentFuseFill, CurrentFuseSel, 'area', 'and', 6000, 20000)
                                              area_center (CurrentFuseSel, FuseArea, Row1, Column1)
                                              dev_set_color ('magenta')
                                              for i := 0 to |FuseArea| - 1 by 1
                                                  set_tposition (WH, Row1[i], Column1[i])
                                                  write_string (WH, FuseColors[Fuse] + ' ' + FuseTypes[Fuse] + ' Ampere')
                                              endfor
                                              set_tposition (WH, 24 * (Fuse + 1), 12)
                                              dev_set_color ('slate blue')
                                              write_string (WH, FuseColors[Fuse] + ' Fuses: ' + |FuseArea|)
                                          endfor
                                          stop ()
                                          Count := Count + 1
                                      endwhile
                                      dev_update_window ('on')
                                      
                                       
                                       

                                        在这里插入图片描述

                                        Halcon 使用颜色分类表进行颜色分类

                                        在这里插入图片描述

                                        * color_fuses_lut_trans.hdev: classify fuses by color
                                        dev_update_off ()
                                        * ****
                                        * step: set up fuse properties and hue ranges
                                        * ****
                                        FuseColors := ['Orange','Red','Blue','Yellow','Green']
                                        DisplayColors := ['coral','red','blue','goldenrod','forest green']
                                        FuseTypes := [5,10,15,20,30]
                                        * HueRanges: Orange 10-30, Red 0-10...
                                        HueRanges := [10,30,0,10,125,162,30,64,96,128]
                                        dev_close_window ()
                                        read_image (Image, 'color/color_fuses_00')
                                        dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
                                        set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
                                        * ****
                                        * step: create look-up-table for color space transformation
                                        * ****
                                        *  *1.创建颜色查找表
                                        create_color_trans_lut ('hsv', 'from_rgb', 8, ColorTransLUTHandle)
                                        for Count := 0 to 4 by 1
                                            * ****
                                            * step: acquire image
                                            * ****
                                            read_image (Image, 'color/color_fuses_0' + Count)
                                            dev_display (Image)
                                            disp_message (WindowHandle, 'color/color_fuses0' + Count + '.png', 'window', 12, 512, 'black', 'true')
                                            * ****
                                            * step: extract saturated hues
                                            * ****
                                            *将图片转换为R,G,B三张图片
                                            decompose3 (Image, Red, Green, Blue)
                                            * 2.使用预生成的查找表进行颜色空间转换
                                            apply_color_trans_lut (Red, Green, Blue, Hue, Saturation, Intensity, ColorTransLUTHandle)
                                            * 阈值处理
                                            threshold (Saturation, Saturated, 60, 255)
                                            * 图片裁剪
                                            reduce_domain (Hue, Saturated, HueSaturated)
                                            Output := []
                                            for Fuse := 0 to |FuseTypes| - 1 by 1
                                                * ****
                                                * step: classify specific fuse
                                                * ****
                                                * 进行分类
                                                threshold (HueSaturated, CurrentFuse, HueRanges[Fuse * 2], HueRanges[Fuse * 2 + 1])
                                                * 形成单独的连通域
                                                connection (CurrentFuse, CurrentFuseConn)
                                                *填充
                                                fill_up (CurrentFuseConn, CurrentFuseFill)
                                                *筛选面积
                                                select_shape (CurrentFuseFill, CurrentFuseSel, 'area', 'and', 6000, 20000)
                                                * 获取中心点的面积和行列坐标
                                                area_center (CurrentFuseSel, FuseArea, Row1, Column1)
                                                * 设置显示颜色为品红色
                                                dev_set_color ('magenta')
                                                disp_message (WindowHandle, FuseColors[Fuse] + ' ' + FuseTypes[Fuse] + ' Ampere', 'image', Row1 + 40, Column1 - 100, DisplayColors[Fuse], 'white')
                                                Output := [Output,FuseColors[Fuse] + ' Fuses: ' + |FuseArea|]
                                            endfor
                                            disp_message (WindowHandle, Output, 'window', 12, 12, DisplayColors, 'true')
                                            disp_continue_message (WindowHandle, 'black', 'true')
                                            stop ()
                                        endfor
                                        dev_update_on ()
                                        dev_close_window ()
                                        clear_color_trans_lut (ColorTransLUTHandle)
                                        
                                         
                                         

                                          在这里插入图片描述

                                          Halcon 训练的方法识别颜色

                                          * This example demonstrates a completeness check of colored game
                                          * pieces using MLP classification. The training and application
                                          * of the classifier is first shown on colored images and then on
                                          * gray images.
                                          * 
                                          dev_update_off ()
                                          dev_close_window ()
                                          dev_open_window (0, 0, 557, 416, 'black', WindowHandle)
                                          set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
                                          dev_set_draw ('margin')
                                          * 
                                          * Initialization
                                          ImageRootName := 'color/color_pieces_0'
                                          Regions := ['yellow','pink','blue','background']
                                          Highlight := ['goldenrod','magenta','cyan']
                                          gen_empty_obj (Classes)
                                          * 
                                          * Train and apply the MLP classifier
                                          for Mode := 0 to 1 by 1
                                              dev_set_color ('black')
                                              read_image (Image, ImageRootName + '0')
                                              * 
                                              * Simulate gray image
                                              * 灰度图像进行识别
                                              if (Mode == 1)
                                                  rgb1_to_gray (Image, GrayImage)
                                                  compose3 (GrayImage, GrayImage, GrayImage, Image)
                                                  dev_display (Image)
                                                  disp_message (WindowHandle, 'Train and apply the classes again on gray images', 'window', 12, 12, 'black', 'false')
                                                  disp_continue_message (WindowHandle, 'black', 'true')
                                                  stop ()
                                              endif
                                              * 
                                              * Colored images
                                              if (Mode == 0)
                                                  * 
                                                  * Specify color classes
                                                  * 没有模型
                                                  for I := 1 to 4 by 1
                                                      dev_display (Image)
                                                      dev_display (Classes)
                                                      disp_message (WindowHandle, ['Drag rectangle inside ' + Regions[I - 1] + ' color','Click right mouse button to confirm'], 'window', 24, 12, 'black', 'false')
                                                      * 绘制矩形
                                                      draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
                                                      gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
                                                      * 将图像进行合并,仅存储对应图像和区域的引用,而不分配新的内存
                                                      concat_obj (Classes, Rectangle, Classes)
                                                  endfor
                                              endif
                                              * 
                                              * Train the specified color classes
                                              * 
                                              * 创建分类器
                                              create_class_mlp (3, 7, 4, 'softmax', 'normalization', 3, 42, MLPHandle)
                                              * 添加训练样本
                                              add_samples_image_class_mlp (Image, Classes, MLPHandle)
                                              disp_message (WindowHandle, 'Training...', 'window', 100, 12, 'black', 'false')
                                              *训练
                                              train_class_mlp (MLPHandle, 400, 0.5, 0.01, Error, ErrorLog)
                                              * 
                                              * Use the trained MLP classifier to test if each image
                                              * contains four game pieces of each color
                                              for J := 0 to 3 by 1
                                                  read_image (Image, ImageRootName + J)
                                                  if (Mode == 1)
                                                      rgb1_to_gray (Image, GrayImage)
                                                      compose3 (GrayImage, GrayImage, GrayImage, Image)
                                                  endif
                                                  * 
                                                  * Apply the trained classes
                                                  * 分类
                                                  classify_image_class_mlp (Image, ClassRegions, MLPHandle, 0.5)
                                                  dev_display (Image)
                                                  disp_message (WindowHandle, 'Looking for 4 game pieces of each color ...', 'window', 24, 12, 'black', 'false')
                                                  dev_set_line_width (2)
                                                  * 
                                                  * Count the number of game pieces for each color class
                                                  for Figure := 1 to 3 by 1
                                                      * 复制图层
                                                      copy_obj (ClassRegions, ObjectsSelected, Figure, 1)
                                                      * 联合成单个连通域
                                                      connection (ObjectsSelected, ConnectedRegions)
                                                      select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 400, 99999)
                                                      * 计算连通域的数量
                                                      count_obj (SelectedRegions, Number)
                                                      dev_set_color (Highlight[Figure - 1])
                                                      dev_display (SelectedRegions)
                                                      OutString := Regions[Figure - 1] + ': ' + Number + '   '
                                                      dev_set_color ('green')
                                                      disp_message (WindowHandle, OutString, 'window', 24 + 30 * Figure, 12, 'black', 'false')
                                                      if (Number != 4)
                                                          disp_message (WindowHandle, 'Not OK', 'window', 24 + 30 * Figure, 120, 'red', 'false')
                                                      else
                                                          disp_message (WindowHandle, 'OK', 'window', 24 + 30 * Figure, 120, 'green', 'false')
                                                      endif
                                                  endfor
                                                  if (J < 3 or Mode == 0)
                                                      disp_continue_message (WindowHandle, 'black', 'true')
                                                      stop ()
                                                  endif
                                              endfor
                                              clear_class_mlp (MLPHandle)
                                          endfor
                                          dev_clear_window ()
                                          dev_display (Image)
                                          Message := 'The game pieces cannot be classified reliable on'
                                          Message[1] := 'gray images because the gray values of the'
                                          Message[2] := 'game pieces cannot always be distinguished from'
                                          Message[3] := 'the gray values of the background.'
                                          disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
                                          
                                           
                                           

                                            在这里插入图片描述

                                            Halcon 使用高斯分类器

                                            在这里插入图片描述

                                            * In this example five different color fuses are segmented with
                                            * a look-up table classifier (LUT) based on a Gaussian Mixture
                                            * Model (GMM).
                                            * 
                                            dev_update_off ()
                                            dev_close_window ()
                                            dev_open_window (0, 0, 800, 600, 'white', WindowHandle)
                                            dev_set_draw ('margin')
                                            ImageRootName := 'color/color_fuses_0'
                                            FuseTypes := [5,10,15,20,30]
                                            FuseColors := ['Orange','Red','Blue','Yellow','Green']
                                            FuseHighlight := ['orange','red','blue','goldenrod','forest green']
                                            DisplayTextShift := [85,65,75,85,85]
                                            dev_set_color ('white')
                                            dev_set_line_width (2)
                                            read_image (Image, ImageRootName + '0')
                                            dev_display (Image)
                                            * 
                                            * Define ROIs for the training data of the classifier
                                            set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
                                            gen_rectangle1 (FuseOrange, 195, 90, 230, 120)
                                            dev_display (FuseOrange)
                                            disp_message (WindowHandle, 'Orange Fuse', 'image', 160, 90 - 65, 'black', 'true')
                                            gen_rectangle1 (FuseRed, 191, 280, 226, 310)
                                            dev_display (FuseRed)
                                            disp_message (WindowHandle, 'Red Fuse', 'image', 160, 280 - 55, 'black', 'true')
                                            gen_rectangle1 (FuseBlue, 190, 470, 225, 500)
                                            dev_display (FuseBlue)
                                            disp_message (WindowHandle, 'Blue Fuse', 'image', 160, 470 - 60, 'black', 'true')
                                            gen_rectangle1 (FuseYellow, 192, 672, 227, 702)
                                            dev_display (FuseYellow)
                                            disp_message (WindowHandle, 'Yellow Fuse', 'image', 160, 672 - 70, 'black', 'true')
                                            gen_rectangle1 (FuseGreen, 197, 880, 232, 910)
                                            dev_display (FuseGreen)
                                            disp_message (WindowHandle, 'Green Fuse', 'image', 160, 880 - 65, 'black', 'true')
                                            gen_empty_obj (Classes)
                                            concat_obj (FuseOrange, FuseRed, Classes)
                                            concat_obj (Classes, FuseBlue, Classes)
                                            concat_obj (Classes, FuseYellow, Classes)
                                            concat_obj (Classes, FuseGreen, Classes)
                                            disp_message (WindowHandle, 'ROIs for the training data', 'window', 12, 12, 'black', 'true')
                                            disp_continue_message (WindowHandle, 'black', 'true')
                                            stop ()
                                            * 
                                            * Create the GMM classifier, add the samples, and train it
                                            * 创建分类器
                                            create_class_gmm (3, 5, 1, 'full', 'none', 3, 42, GMMHandle)
                                            * 添加模板
                                            add_samples_image_class_gmm (Image, Classes, GMMHandle, 0)
                                            disp_message (WindowHandle, 'Training GMM classifier...', 'window', 48, 12, 'black', 'true')
                                            *训练分类器
                                            train_class_gmm (GMMHandle, 100, 0.001, 'training', 0.001, Centers, Iter)
                                            * 
                                            * Create the GMM-based LUT classifier
                                            disp_message (WindowHandle, 'Creating LUT classifier...', 'window', 84, 12, 'black', 'true')
                                            * 创建颜色识别表
                                            create_class_lut_gmm (GMMHandle, ['bit_depth','rejection_threshold'], [6,0.03], ClassLUTHandle)
                                            clear_class_gmm (GMMHandle)
                                            * 
                                            * Segment images with LUT classifier
                                            for Img := 0 to 3 by 1
                                                read_image (Image, ImageRootName + Img)
                                                count_seconds (T1)
                                                *颜色分类
                                                classify_image_class_lut (Image, ClassRegions, ClassLUTHandle)
                                                count_seconds (T2)
                                                TimeToClassify := (T2 - T1) * 1000
                                                dev_display (Image)
                                                dev_set_line_width (3)
                                                for Fuse := 1 to 5 by 1
                                                    * 
                                                    * Perform post-processing on returned classes
                                                    copy_obj (ClassRegions, ObjectsSelected, Fuse, 1)
                                                    closing_circle (ObjectsSelected, RegionClosing, 3.5)
                                                    connection (RegionClosing, ConnectedRegions)
                                                    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 2500, 99999)
                                                    fill_up (SelectedRegions, RegionFillUp)
                                                    area_center (RegionFillUp, Area, Row, Column)
                                                    shape_trans (RegionFillUp, RegionTrans, 'convex')
                                                    dev_set_color (FuseHighlight[Fuse - 1])
                                                    dev_display (RegionTrans)
                                                    * 
                                                    disp_message (WindowHandle, FuseColors[Fuse - 1] + ' ' + FuseTypes[Fuse - 1] + ' A', 'image', Row - 10, Column - DisplayTextShift[Fuse - 1], FuseHighlight[Fuse - 1], 'white')
                                                endfor
                                                disp_message (WindowHandle, TimeToClassify$'.1f' + ' ms', 'window', 12, 12, 'black', 'true')
                                                if (Img < 3)
                                                    disp_continue_message (WindowHandle, 'black', 'true')
                                                    stop ()
                                                endif
                                            endfor
                                            * 
                                            clear_class_lut (ClassLUTHandle)
                                            disp_message (WindowHandle, 'No more lines to execute', 'window', 50, 12, 'black', 'true')
                                            
                                             
                                             

                                              在这里插入图片描述

                                              转载自:https://blog.csdn.net/weixin_45672157/article/details/136510392
                                              • 0
                                                点赞
                                              • 0
                                                收藏
                                                觉得还不错? 一键收藏
                                              • 0
                                                评论
                                              评论
                                              添加红包

                                              请填写红包祝福语或标题

                                              红包个数最小为10个

                                              红包金额最低5元

                                              当前余额3.43前往充值 >
                                              需支付:10.00
                                              成就一亿技术人!
                                              领取后你会自动成为博主和红包主的粉丝 规则
                                              hope_wisdom
                                              发出的红包
                                              实付
                                              使用余额支付
                                              点击重新获取
                                              扫码支付
                                              钱包余额 0

                                              抵扣说明:

                                              1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
                                              2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

                                              余额充值