本程序源码来自 halcon学习教程,只为记录下来,后续翻阅,
柠檬和橘子两种类型,以面积和圆度作为主要特征来区分,个人猜想,若是找个相似的物体代替应该也有混淆
read_image (Image, 'color/citrus_fruits_01')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'white', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_line_width (2)
dev_display (Image)
******初始化特征面积 圆度变量/类名称
*定义特征面积
FeaturesArea:=[]
*定义特征圆度
FeaturesCircularity:=[]
*定义分类名称
ClassName:=['橘子','柠檬']
*创建高斯混合模型 两个类,两个特征
create_class_gmm (2, 2 ,1, 'spherical', 'normalization', 10, 42, GMMHandle)
for i:=1 to 4 by 1
read_image (Image, 'color/citrus_fruits_'+ i$'.2d')
*分割三个通道
decompose3 (Image, ImageRed, ImageGreen, ImageBlue)
dev_display (ImageRed)
dev_set_color ('black')
*获得红色通道的图像的亮部分
threshold (ImageRed, Region, 50, 255)
*填充整个区域
fill_up (Region, RegionFillUp)
*计算连通区域
connection (RegionFillUp, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 50, 999999)
*显示水果区域
dev_display (SelectedRegions)
*计算区域个数
count_obj (SelectedRegions, NumberObjects)
*针对每个区域计算区域的特征 圆度
for j:=1 to NumberObjects by 1
dev_set_color ('red')
select_obj (SelectedRegions, ObjectSelected, j)
*计算区域圆度
circularity (ObjectSelected, Circularity)
*计算区域中心,面积
area_center (ObjectSelected, Area, Row, Column)
*特征面积组合在一个数组中
FeaturesArea := [FeaturesArea,Area]
*特征圆度组合在一个数组中
FeaturesCircularity:=[FeaturesCircularity,Circularity]
*特征圆度面积转化成 实数特征
FeatureVector := real([Circularity,Area])
****特征向量分别增加到不同类训练样本,提前已知前两张图片是橘子的后面的是柠檬的
if(i<=2)
*橘子的面积和圆度特征增加到橘子的类别中
add_sample_class_gmm (GMMHandle, FeatureVector, 0, 0)
*显示已增加特征
disp_message (WindowHandle, 'Add to Class:'+ClassName[0], 'window', Row, Column-100, 'black', 'true')
else
*柠檬的面积和圆度特征增加到柠檬的类别中
add_sample_class_gmm(GMMHandle,FeatureVector,1,0)
*显示已增加特征
disp_message (WindowHandle, 'Add to Class:'+ClassName[1], 'window', Row, Column-100, 'black', 'true')
endif
endfor
disp_continue_message (WindowHandle, 'black', 'true')
stop()
endfor
dev_clear_window ()
*训练分类器
train_class_gmm (GMMHandle, 100, 0.001, 'training', 0.0001, Centers, Iter)
****以下读取新图像;提取新图像特征使用已经训练过的分类器进行分类
for i:=1 to 15 by 1
*读取图像
read_image (Image, 'color/citrus_fruits_'+ i$'.2d')
*分割图像为三个通道
decompose3 (Image, ImageRed, ImageGreen, ImageBlue)
*显示图像
dev_display (Image)
dev_set_color ('black')
*获得红色通道图像亮的区域
threshold (ImageRed, Region, 50, 255)
*填充区域
fill_up (Region, RegionFillUp)
*计算连通区域
connection (RegionFillUp, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 50, 999999)
*显示选择得到的区域
dev_display (SelectedRegions)
*计算区域个数
count_obj (SelectedRegions, NumberObjects)
*循环对各区域特征进行识别分类
for j:=1 to NumberObjects by 1
*选择第J个区域
select_obj (SelectedRegions, ObjectSelected, j)
*计算区域圆度
circularity (ObjectSelected, Circularity)
*计算区域中心,面积
area_center (ObjectSelected, Area, Row, Column)
*面积特征合并在一个数组中
FeaturesArea:=[FeaturesArea,Area]
*圆度特征合并在一个数组中
FeaturesCircularity:=[FeaturesCircularity,Circularity]
*特征转换成实数
FeatureVector := real([Circularity,Area])
*使用分类器进行分类
classify_class_gmm (GMMHandle, FeatureVector, 1, ClassID, ClassProb, Density, KSigmaProb)
*分类后显示类目名称,以所属类概念456
disp_message (WindowHandle, 'Class:'+ClassName[ClassID], 'window', Row, Column-100, 'black', 'true')
disp_message (WindowHandle, 'KSigmaProb:'+KSigmaProb, 'window', Row+30, Column-100, 'black', 'true')
endfor
stop()
endfor
**清除分类器,释放内容
clear_class_gmm (GMMHandle)