HALCON示例程序color_pieces.hdev通过MLP训练器对彩色棋子进行分类识别

本文介绍了一个使用HALCON的MLP分类器对彩色棋子进行分类识别的示例程序。通过对比彩色图像和灰度图像下的分类效果,展示了彩色图像在棋子分类任务中的优势。

HALCON示例程序color_pieces.hdev通过MLP训练器对彩色棋子进行分类识别;分别在彩色图像下与灰度图像下进行,从而产生对比。

示例程序源码(加注释)

  • 关于显示类函数解释
    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’)
  • 初始化
    ImageRootName := ‘color/color_pieces_0’
    Regions := [‘yellow’,‘pink’,‘blue’,‘background’]
    Highlight := [‘goldenrod’,‘magenta’,‘cyan’]
    gen_empty_obj (Classes)
    for Mode := 0 to 1 by 1
    dev_set_color (‘black’)
    read_image (Image, ImageRootName + ‘0’)
    • 生成灰度三通道图像
      if (Mode == 1)
      • rgb1_to_gray - 将RGB图像转换为灰度图像。
      • rgb1_to_gray(RGB图:灰度图 ::);转换公式:灰色= 0.299 *R+ 0.587 *G+ 0.114 *B。
        rgb1_to_gray (Image, GrayImage)
      • compose3 - 将3个图像转换为三通道图像。
      • compose3(图1,图2,图3:多通道图像 ::)
        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
        if (Mode == 0)
      • 指定颜色类
        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解释的贴子注意和union1的区别
        concat_obj (Classes, Rectangle, Classes)
        endfor
        endif
    • 创建MLP分类器并添加训练样本;关于MLP分类器解释的例子
      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)
      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
      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)
      for Figure := 1 to 3 by 1
      * copy_obj - 复制HALCON数据库中的图标对象。
      * copy_obj(要复制对象:复制出的对象,开始索引号,对象数量:)
      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)
      disp_continue_message (WindowHandle, ‘black’, ‘true’)
      stop ()
      endif
      endfor
      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’)

处理思路

这个例子是将三通道的RGB图像使用MLP分类器进行分类,分别对灰度图像与彩色图像进行了训练与识别,对比发现还是彩色图像分类较为准确,因为灰度图像不能很好地分割出棋子与背景。

后记

大家有什么问题可以向我提问哈,我看到了第一时间回复,希望在学习的路上多多结交良师益友。

<think>我们正在处理关于Halcon字符识别训练的问题。用户询问的是训练文件、教程和示例。根据提供的引用内容,我们可以总结出以下关键点:1.引用[1]提到了训练OCR分类器的步骤:使用`trainf_ocr_class_mlp`算子训练,并且提到了训练数据集(TrainingData)包含训练图像和标签。2.引用[2]详细描述了训练字符的步骤:-建立数组存放要训练的字符(trainingname)-创建训练文件(trf文件)-对字符区域进行排序(sortregion)-使用`shape_trans`建立外接形状-使用`area_center`确定字符位置-循环训练:选择目标(select_obj),使用`append_ocr_trainf`向训练文件中添加字符-显示字符(disp_message)-创建OCR分类器(create_ocr_class_mlp)-训练分类器(trainf_ocr_class_mlp)-将分类器写入文件(write_ocr_class_mlp)3.引用[3]提到了`trainf_ocr_class_mlp`算子的参数。因此,我们可以为用户提供一个简明的训练流程,并指出训练文件(通常是.trf文件)的生成和使用方法。由于用户要求教程和示例,我们可以给出一个示例代码框架,并说明每一步的作用。注意:我们使用中文回答,并且按照要求处理数学公式(虽然这个问题可能不涉及数学公式,但如果有公式我们会用$...$或$$...$$)。另外,在回答末尾生成相关问题。下面开始组织回答:</think>### Halcon字符识别训练文件与教程指南 Halcon字符识别训练涉及创建训练文件(.trf)、训练OCR分类器(多层感知机模型)和应用识别算子。以下是关键步骤和示例: #### 训练流程详解 1. **准备训练数据** - 创建字符数组:`trainingname := ['A','B','C','1','2','3']` - 指定训练文件路径:`TrainingFile := 'char_train.trf'` 2. **预处理字符区域** ```halcon * 分割字符区域并排序 segment_characters (Image, Characters) sort_region (Characters, SortedCharacters, 'character', 'true', 'row') ``` 3. **提取特征并创建训练文件** ```halcon * 计算位置特征 area_center (SortedCharacters, Area, Row, Column) * 循环添加训练样本 for Index := 1 to |SortedCharacters| by 1 select_obj (SortedCharacters, SingleChar, Index) append_ocr_trainf (SingleChar, Image, trainingname[Index-1], TrainingFile) endfor ``` 4. **创建并训练OCR分类器** ```halcon * 创建多层感知机模型 create_ocr_class_mlp (8, 10, 'constant', 'default', trainingname, 80, 'none', 10, 42, OCRHandle) * 训练模型(引用[3]) trainf_ocr_class_mlp (OCRHandle, TrainingFile, 200, 0.01, 0.01, Error, ErrorLog) ``` 5. **保存与使用模型** ```halcon write_ocr_class_mlp (OCRHandle, 'trained_ocr.mlp') do_ocr_multi_class_mlp (Characters, Image, OCRHandle, Class, Confidence) * 多通路识别(引用[2]) ``` #### 关键训练文件 1. **字符定义文件**:文本文件列出待识别字符 2. **训练文件(.trf)**:存储字符样本与标签的二进制文件 3. **模型文件(.mlp)**:训练后生成的分类器文件 #### 教程资源 1. **官方文档**:Halcon安装目录下的`ocr`示例文件夹(路径:`examples/hdevelop/OCR/`) 2. **视频教程**:[Halcon OCR训练完整流程](https://www.mvtec.com/services/videos)(MVTec官网) 3. **示例项目**:`ocr_train_mlp.hdev`(包含完整训练代码) > 训练要点:字符区域需精确分割;样本需覆盖实际场景中的字体变化;推荐每个字符提供≥20个样本[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值