基于halcon的保险丝颜色识别(GMM)

it2023-07-24  72

GMM分类器颜色识别

原图(1)训练图(2)颜色分类目标图 代码结果

原图

(1)训练图

(2)颜色分类目标图

代码

dev_close_window () read_image (Image, 'color_fuses_00.png') dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) *颜色类型数组 FuseColors := ['Orange','Red','Blue','Yellow','Green'] *颜色类型所对应使用的画笔颜色 FuseHighlight := ['orange','red','blue','goldenrod','forest green'] *设置字体 set_display_font (WindowHandle, 12, 'mono', 'true', 'false') dev_set_draw ('margin') dev_set_color ('white') dev_set_line_width (2) dev_display (Image) *生成对应颜色的矩形位置 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') stop () *把颜色位置区域加载到空对象中 gen_empty_obj (ClassObject) concat_obj (ClassObject, FuseOrange, ClassObject) concat_obj (ClassObject, FuseRed, ClassObject) concat_obj (ClassObject, FuseBlue, ClassObject) concat_obj (ClassObject, FuseYellow, ClassObject) concat_obj (ClassObject, FuseGreen, ClassObject) * creat_class_gmm(); *含义:创建高斯混合模型; *输入参数: * NumDim:几个特征; * NumClasses:样本分类个数; * NumCenters:类中心的个数; * CovarType:协方差矩阵('Spherical','diag','full'* Preprocessing:预处理是否使用,及特征向量转换类型; * NumComponents:预处理参数,转换特征数; * RandSend:随机种子,初始化GMM; *输出参数: * GMMHandle:高斯混合模型 *1、创建GMM分类器 create_class_gmm (3, 5, 1, 'full', 'none', 3, 42, GMMHandle) *add_samples_image_class_gmm * Image:训练的图像(多通道) * ClassRegions:图像中用于训练的类区域 * GMMHandle:高斯混合模型 * Randomize:高斯噪声标准差 *2、增加训练样本(图片区),放入GMM 进行训练数据 add_samples_image_class_gmm (Image, ClassObject, GMMHandle, 0) *train_class_gmm **含义:训练高斯混合模型 *输入参数: **GMMHandle:高斯混合模型 **MixIter: 期望最大值算法中迭代最大数 **Threshold:期望误差阈值,超过此值,计算取消。 **ClassPriors:类的先验概率类型('training','uniform''uniform'表示使用相同的权重,1/NumClasses;'training'表示类发生的概率是依据样本中的概率推断。 **Regularize:调整值,为了防止计算中出现奇异协方差矩阵。增加到协方差矩阵的对角线上的一个很小的值 *输出参数: **Centers:每个类的中心个数 **Iter:每个类的迭代次数 *3、训练GMM模型 train_class_gmm (GMMHandle, 100, 0.001, 'training', 0.0001, Centers, Iter) *4、创建一个查找表,关联高斯混合模型查找类级(创建定位对象) create_class_lut_gmm (GMMHandle, ['rejection_threshold','bit_depth'], [0.05,6], ClassLUTHandle) *******对目标图像颜色分类******** Imagepath := 'color_fuses_0' for i := 0 to 3 by 1 read_image (Image, Imagepath+i) *5、使用查找表在图像中搜索相关的类级,输出所有查找到的类级区域 classify_image_class_lut (Image, ClassRegions, ClassLUTHandle) dev_display (Image) dev_set_line_width (3) for j := 1 to |Centers| by 1 copy_obj (ClassRegions, ObjectsSelected, j, 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') smallest_rectangle2 (RegionTrans, Row1, Column1, Phi, Length1, Length2) dev_set_color (FuseHighlight[j-1]) dev_display (RegionTrans) for k :=0 to |Row1|-1 by 1 set_tposition (WindowHandle, Row1[k] , Column1[k]-0.5*Length2[k]) write_string (WindowHandle, FuseColors[j-1]+' '+(k+1)) endfor endfor disp_message (WindowHandle, '保险丝颜色识别结果_'+(i+1)+':', 'window', 10, 10, 'black', 'false') dump_window (WindowHandle, 'png', '保险丝颜色识别结果_'+(i+1)) stop () endfor

结果

最新回复(0)