天天看点

HALCON示例程序classify_halogen_bulbs.hdev使用SVM分类器检测卤素灯泡的好坏HALCON示例程序classify_halogen_bulbs.hdev使用SVM分类器检测卤素灯泡的好坏

HALCON示例程序classify_halogen_bulbs.hdev使用SVM分类器检测卤素灯泡的好坏

示例程序源码(加注释)

  • 得到halcon默认图片存储路径

    get_system (‘image_dir’, HalconImages)

  • 获得操作系统类型

    get_system (‘operating_system’, OS)

  • OS{0:2}的意思是只选取OS里边的0,1,2三个字符

    if (OS{0:2} == ‘Win’)

    • 将字符串分割为预定义分隔符之间的子字符串。如果为windows就用;如果不是win系统就用:
    • 有一字符串为theboy:themen;thechild用 ';'分割分割为theboy:themen、thechild用 ':'分割分割为theboy、themen;thechild

      tuple_split (HalconImages, ‘;’, HalconImages)

      else

      tuple_split (HalconImages, ‘:’, HalconImages)

      endif

      ReadOK := false

  • 得到系统是否禁止错误对话框显示

    dev_get_preferences (‘suppress_handled_exceptions_dlg’, SaveMode)

  • 设置禁止错误对话框显示由try、catch捕获错误

    dev_set_preferences (‘suppress_handled_exceptions_dlg’, ‘true’)

  • 按照路径读取图片,如果读取不成功catch错误,显示读取图片出错

    for k := 0 to |HalconImages| - 1 by 1

    try

    read_image (Image, HalconImages[k] + ‘/halogen_bulb/halogen_bulb_01.png’)

    ReadPath := HalconImages[k] + ‘/halogen_bulb/’

    ReadOK := true

    break

    catch (Exception)

    endtry

    endfor

    if (not ReadOK)

    disp_message (WindowHandle, ‘Could not find the images in $HALCONIMAGES’, ‘window’, -1, -1, ‘black’, ‘true’)

    stop ()

    endif

  • 再将错误对话框显示恢复为默认模式

    dev_set_preferences (‘suppress_handled_exceptions_dlg’, SaveMode)

  • 读入图片

    read_image (Image, ‘halogen_bulb/halogen_bulb_01.png’)

  • 得到指向图片第一个通道的指针get_image_pointer1 (输入图像, 指针, 图片类型, 宽, 高)

    get_image_pointer1 (Image, Pointer, Type, Width, Height)

  • 开窗口与显示

    dev_close_window ()

    dev_open_window (0, 0, Width / 2, Height / 2, ‘black’, WindowHandle)

    set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)

  • 定义类名

    ClassNames := [‘good’,‘bad’,‘none’]

  • 定义颜色数组,用于显示不同类别

    Colors := [‘forest green’,‘red’,‘red’]

    Nu := 0.05

    KernelParam := 0.02

  • 创建一个svm分类器
  • create_class_svm (特征数,内核函数, 向量对其周围环境的影响量, 错误率,类数量, ‘模式’, ‘预处理’, 样本数量, SVM分类器句柄)

    create_class_svm (7, ‘rbf’, KernelParam, Nu, |ClassNames|, ‘one-versus-one’, ‘principal_components’, 5, SVMHandle)

  • 为SVM分类器添加样本,自定义函数

    add_samples_to_svm (ClassNames, SVMHandle, WindowHandle, ReadPath)

    for ClassNumber := 0 to |ClassNames| - 1 by 1

    list_files (ReadPath + ClassNames[ClassNumber], ‘files’, Files)

    从Files中选择图片格式为png的图片

    Selection := regexp_select(Files,’.*[.]png’)

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

    read_image (Image, Selection[Index])

    dev_display (Image)

    threshold (Image, Region, 0, 40)

    自定义函数

    calculate_features (Region, Features)

    求取region中心
        area_center (Region, Area, Row, Column)
        区域紧凑度
        compactness (Region, Compactness)
        计算区域二维不变矩
        moments_region_central_invar (Region, PSI1, PSI2, PSI3, PSI4)
        计算区域的凸度
        convexity (Region, Convexity)
        real将元组转换为浮点数的元组。
        Features := real([Area,Compactness,PSI1,PSI2,PSI3,PSI4,Convexity])
        return ()
               

    为svm分类器添加样本

    add_sample_class_svm(:: SVM句柄,特征向量,训练类别 ?

    add_sample_class_svm (SVMHandle, Features, ClassNumber)

    endfor

    endfor

    return ()

    dev_clear_window ()

  • 训练SVM分类器

    disp_message (WindowHandle, ‘Training…’, ‘window’, -1, -1, ‘black’, ‘true’)

  • 训练svn分类器train_class_svm (SVM分类器句柄, 梯度阈值, 训练模式)

    train_class_svm (SVMHandle, 0.001, ‘default’)

    disp_message (WindowHandle, ‘Training completed’, ‘window’, -1, -1, ‘black’, ‘true’)

    disp_continue_message (WindowHandle, ‘black’, ‘true’)

    stop ()

  • 自定义函数使用svm分类器进行识别

    classify_regions_with_svm (SVMHandle, Colors, ClassNames, ReadPath)

    list_files (ReadPath, [‘files’,‘recursive’], Files)

    Selection := regexp_select(Files,’.*[.]png’)

    read_image (Image, Selection[0])

    dev_close_window ()

    get_image_size (Image, Width, Height)

    dev_open_window (0, 0, Width / 2, Height / 2, ‘black’, WindowHandle)

    set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)

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

    read_image (Image, Selection[Index])

    threshold (Image, Region, 0, 40)

    自定义函数和上边做训练的是一个函数

    calculate_features (Region, Features)

    使用SVM分类器进行分类classify_class_svm(:: 分类器句柄,特征向量,最佳类数:识别结果)

    classify_class_svm (SVMHandle, Features, 1, Class)

    dev_display (Image)

    dev_set_color (Colors[Class])

    dev_display (Region)

    disp_message (WindowHandle, ‘Classified as:’ + ClassNames[Class], ‘window’, -1, -1, ‘black’, ‘true’)

    disp_continue_message (WindowHandle, ‘black’, ‘true’)

    stop ()

    endfor

    dev_display (Image)

    return ()

  • 清除SVM分类器,释放内存

    clear_class_svm (SVMHandle)

处理思路

这个例子介绍了create_class_svm 、add_sample_class_svm、train_class_svm、classify_class_svm 的使用方法,使用SVM分类器对元素的凸度与不变的结构向量进行分类。完成了对卤素灯泡的完整性的检测。

后记

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

继续阅读