样本训练程序
*训练样本
*创建一个进行分类或回归多层感知器
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)
程序
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 (Image, GrayImage)
*将3个图像转换为一个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', 'true')
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')
*画矩形是使用鼠标画,下一句代码是在生成一个和鼠标画出来的一样的矩形,然后将矩形与空Classes连接起来,将矩形放在Classes里面
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
*连接2个对象元组
concat_obj (Classes, Rectangle, Classes)
endfor
endif
*训练样本
*创建一个进行分类或回归多层感知器
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
*复制HALCON数据库中的一个标志性对象。
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')