HALCON示例程序classify_citrus_fruits.hdev應用常規gmm分類器進行水果分類
示例程序源碼(加注釋)
-
讀入圖片、顯示與顯示相關設置
read_image (Image, ‘color/citrus_fruits_01’)
get_image_pointer1 (Image, Pointer, Type, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, ‘white’, WindowHandle)
set_display_font (WindowHandle, 12, ‘mono’, ‘true’, ‘false’)
dev_set_draw (‘margin’)
dev_set_line_width (2)
dev_display (Image)
dev_update_window (‘off’)
dev_update_pc (‘off’)
dev_update_var (‘off’) -
定義變量數組
FeaturesArea := []
FeaturesCircularity := []
ClassName := [‘orange’,‘lemon’] -
創建一個GMM分類器,這個函數之前的帖子介紹過
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’)
dev_display (Image)- 自定義函數
get_regions (Image, SelectedRegions)
將彩色圖像分割成RGB三個通道,并使用簡單bolo方法進行分析
decompose3 (Image, ImageRed, ImageGreen, ImageBlue)
dev_set_color (‘white’)
threshold (ImageRed, Region, 50, 255)
fill_up (Region, RegionFillUp)
connection (RegionFillUp, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 50, 999999)
return () - 顯示SelectedRegions區域
dev_display (SelectedRegions) - 對區域SelectedRegions進行計數
count_obj (SelectedRegions, NumberObjects)
for j := 1 to NumberObjects by 1- 選取數組當中的指定元素
select_obj (SelectedRegions, ObjectSelected, j) - 自定義函數
get_features (ObjectSelected, WindowHandle, Circularity, Area, RowRegionCenter, ColumnRegionCenter)
得到ObjectSelected區域的圓度值
circularity (ObjectSelected, Circularity)
求取ObjectSelected的面積與中心坐標
area_center (ObjectSelected, Area, Row, Column)
dev_set_color (‘white’)
return ()
FeaturesArea := [FeaturesArea,Area]
FeaturesCircularity := [FeaturesCircularity,Circularity] - real將輸入數組元素轉換為浮點數形式
FeatureVector := real([Circularity,Area])
if (i <= 2)- add_sample_class_gmm - 將訓練樣本添加到高斯混合模型的訓練數據中
- add_sample_class_gmm(:: GMM句柄,樣本要素向量,類別ID,隨機噪聲:)
add_sample_class_gmm (GMMHandle, FeatureVector, 0, 0) - 顯示信息
disp_message (WindowHandle, ‘Add to Class:’ + ClassName[0], ‘window’, RowRegionCenter, ColumnRegionCenter - 100, ‘black’, ‘true’)
else
add_sample_class_gmm (GMMHandle, FeatureVector, 1, 0)
disp_message (WindowHandle, ‘Add to Class:’ + ClassName[1], ‘window’, RowRegionCenter, ColumnRegionCenter - 100, ‘black’, ‘true’)
endif
endfor
- 選取數組當中的指定元素
- 顯示按F5繼續
disp_continue_message (WindowHandle, ‘black’, ‘true’)
stop ()
endfor
dev_clear_window ()
- 自定義函數
-
構建可視化空間,即二維坐標系
visualize_2D_feature_space (Cross, Height, Width, WindowHandle, FeaturesArea[0:5], FeaturesCircularity[0:5], ‘dim gray’, 18)
dev_set_color (‘black’)
OriginOfGraph := [Height - 0.1 * Height,0.1 * Width]
畫箭頭
disp_arrow (WindowID, OriginOfGraph[0], OriginOfGraph[1], OriginOfGraph[0], Width - 0.2 * Width, 2)
disp_arrow (WindowID, OriginOfGraph[0], OriginOfGraph[1], 0.1 * Height, OriginOfGraph[1], 2)
顯示橫縱坐標的名稱
set_tposition (WindowID, OriginOfGraph[0], Width - 0.2 * Width)
write_string (WindowID, ‘Area’)
set_tposition (WindowID, 0.07 * Height, OriginOfGraph[1])
write_string (WindowID, ‘Circularity’)
dev_set_color (ColorFeatureVector)
ExtentOfGraph := Height - 0.3 * Height
RangeC := 0.5
RangeA := 24000
ScaleC := ExtentOfGraph / RangeC
ScaleA := ExtentOfGraph / RangeA
MinC := 0.5
MinA := 20000
NumberFeatureVectors := |FeaturesA|
for i := 0 to NumberFeatureVectors - 1 by 1
DiffC := ScaleC * (FeaturesC[i] - MinC)
DiffA := ScaleA * (FeaturesA[i] - MinA)
RowFeature := OriginOfGraph[0] - DiffC
ColumnFeature := OriginOfGraph[1] + DiffA
畫X號
gen_cross_contour_xld (Cross, RowFeature, ColumnFeature, CrossSize, 0.785398)
dev_display (Cross)
endfor
return () -
檸檬的自定義函數
visualize_2D_feature_space (Cross, Height, Width, WindowHandle, FeaturesArea[6:11], FeaturesCircularity[6:11], ‘light gray’, 18)
disp_continue_message (WindowHandle, ‘black’, ‘true’)
stop () -
訓練分類器train_class_gmm(:: 分類器句柄,最大迭代次數,閾值,計算方法,規范單一協方差矩陣:類中心數量,每個類的迭代次數)
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’)
dev_display (Image)- 和上文get_regions含義一致
get_regions (Image, SelectedRegions)
dev_display (SelectedRegions)
count_obj (SelectedRegions, NumberObjects)
for j := 1 to NumberObjects by 1
select_obj (SelectedRegions, ObjectSelected, j)
get_features (ObjectSelected, WindowHandle, Circularity, Area, RowRegionCenter, ColumnRegionCenter)
FeaturesArea := [FeaturesArea,Area]
FeaturesCircularity := [FeaturesCircularity,Circularity]
FeatureVector := real([Circularity,Area])- classify_class_gmm - 通過高斯混合模型計算特征向量的類。
- 函數原型classify_class_gmm(:: 分類器句柄,特征向量,確定的最佳類數:分類結果,類的后驗概率,概率密度,歸一化概率)
classify_class_gmm (GMMHandle, FeatureVector, 1, ClassID, ClassProb, Density, KSigmaProb) - 顯示
disp_message (WindowHandle, 'Class: ’ + ClassName[ClassID], ‘window’, RowRegionCenter, ColumnRegionCenter - 100, ‘black’, ‘true’)
disp_message (WindowHandle, 'KSigmaProb: ’ + KSigmaProb, ‘window’, RowRegionCenter + 30, ColumnRegionCenter - 100, ‘black’, ‘true’)
endfor
if (i != 15)
disp_continue_message (WindowHandle, ‘black’, ‘true’)
endif
stop ()
endfor
- 和上文get_regions含義一致
-
清除訓練句柄
clear_class_gmm (GMMHandle)
處理思路
這個例子介紹了GMM分類器的使用方法,步驟是create_class_gmm 、add_sample_class_gmm、train_class_gmm、classify_class_gmm 先創建分類器,為分類器添加樣本,訓練分類器,使用分類器對進行分類。一個全面介紹GMM分類器使用的一個例子。通過GMM分類器實現了橙子和檸檬 的分類。
后記
大家有什么問題可以向我提問哈,我看到了第一時間回復,希望在學習的路上多多結交良師益友。