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分类器对元素的凸度与不变的结构向量进行分类。完成了对卤素灯泡的完整性的检测。
后记
大家有什么问题可以向我提问哈,我看到了第一时间回复,希望在学习的路上多多结交良师益友。