HALCON示例程序check_blister_mixed.hedv药品胶囊缺陷检测
HALCON示例程序check_blister_mixed.hedv藥品膠囊缺陷檢測(cè)
示例程序源碼(加注釋)
- 讀入圖片與顯示相關(guān)設(shè)置
dev_close_window ()
read_image (Image, ‘blister/blister_mixed_reference’)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)
dev_update_off ()
dev_display (Image)
dev_set_draw (‘margin’) - 首先提取每個(gè)膠囊
disp_message (WindowHandle, ‘Train gmm classifier on pill types’, ‘window’, -1, -1, ‘black’, ‘true’) - 注意注意敲黑板,劃重點(diǎn)。下邊的這個(gè)函數(shù)是halcon函數(shù)的封裝,里邊代碼有好多。內(nèi)容是上一篇文章介紹過(guò),大同小異,所以不理解的話看一下上一篇例子。下邊的代碼塊是extract_pill_types里邊的內(nèi)容。
extract_pill_types (Image, Chambers, ChambersUnion, Classes, PhiRef, RowRef, ColumnRef, PillTypeCount)
NumClasses := |PillTypeCount|
-
創(chuàng)建創(chuàng)建高斯混合模型
-
輸入?yún)?shù): NumDim:幾個(gè)特征;NumClasses:樣本分類個(gè)數(shù);NumCenters:類中心的個(gè)數(shù);CovarType:
-
協(xié)方差矩陣(‘Spherical’,‘diag’,‘full’);Preprocessing:預(yù)處理是否使用,及特征向量轉(zhuǎn)換類型;
-
NumComponents:預(yù)處理參數(shù),轉(zhuǎn)換特征數(shù);RandSend:迭代次數(shù),初始化GMM;
-
輸出參數(shù):GMMHandle:高斯混合模型
create_class_gmm (3, 3, [1,5], ‘spherical’, ‘normalization’, 10, 42, GMMHandle) -
含義:增加訓(xùn)練樣本(圖片區(qū)),放入GMM 進(jìn)行訓(xùn)練數(shù)據(jù)
-
輸入?yún)?shù):Image:訓(xùn)練的圖像(多通道);ClassRegions:圖像中用于訓(xùn)練的類區(qū)域;
-
GMMHandle:高斯混合模型;Randomize:高斯噪聲標(biāo)準(zhǔn)差
add_samples_image_class_gmm (Image, Classes, GMMHandle, 0) -
含義:訓(xùn)練高斯混合模型
-
輸入?yún)?shù):GMMHandle:高斯混合模型;MixIter: 期望最大值算法中迭代最大數(shù);
-
Threshold:期望誤差閾值,超過(guò)此值,計(jì)算取消;
-
ClassPriors:類的先驗(yàn)概率類型;(‘training’,‘uniform’)'uniform’表示使用相同的權(quán)重,1/NumClasses;'training’表示類發(fā)生的概率是依據(jù)樣本中的概率推斷。
-
Regularize:調(diào)整值,為了防止計(jì)算中出現(xiàn)奇異協(xié)方差矩陣。增加到協(xié)方差矩陣的對(duì)角線上的一個(gè)很小的值
-
輸出參數(shù):Centers:每個(gè)類的中心個(gè)數(shù)
-
Iter:每個(gè)類的迭代次數(shù)
train_class_gmm (GMMHandle, 100, 0.001, ‘training’, 0.0001, Centers, Iter) -
檢測(cè)膠囊
Count := 12
for FileIndex := 1 to Count by 1- 讀入圖片
read_image (Image, ‘blister/blister_mixed_’ + FileIndex$‘02’) - 閾值分割
threshold (Image, Region, 90, 255) - 分割連通域
connection (Region, ConnectedRegions) - 面積對(duì)區(qū)域篩選
select_shape (ConnectedRegions, SelectedRegions, ‘a(chǎn)rea’, ‘a(chǎn)nd’, 5000, 9999999) - 求取最大區(qū)域邊緣
shape_trans (SelectedRegions, RegionTrans, ‘convex’) - 利用橢圓變換,得出區(qū)域角度
orientation_region (RegionTrans, Phi)
if (abs(Phi) > rad(90))
Phi := rad(180) + Phi
endif - 求取區(qū)域面積與中心坐標(biāo)
area_center (RegionTrans, Area1, Row, Column) - 創(chuàng)建平移旋轉(zhuǎn)變換矩陣
vector_angle_to_rigid (Row, Column, Phi, RowRef, ColumnRef, PhiRef, HomMat2D) - 使用仿射變換矩陣進(jìn)行任意仿射變換
affine_trans_image (Image, ImageAffinTrans, HomMat2D, ‘constant’, ‘false’) - 減少圖像定義域
reduce_domain (ImageAffinTrans, ChambersUnion, ImageReduced) - 將圖片分為rgb三通道圖像
decompose3 (ImageAffinTrans, ImageR, ImageG, ImageB) - 對(duì)每個(gè)膠囊進(jìn)行識(shí)別檢測(cè)
- 含義:使用GMM分類一個(gè)圖像
- 輸入?yún)?shù):Image:訓(xùn)練的圖像(多通道);GMMHandle:GMM模型;
- RejectionThreshold:分類拒絕閾值,如果圖像所有的像素概率低于此值將不會(huì)分類任何類。
- 輸出參數(shù):ClassRegions:分類的各個(gè)區(qū)域
classify_image_class_gmm (ImageReduced, ClassRegions, GMMHandle, 0.005) - 對(duì)ClassRegions進(jìn)行計(jì)數(shù)
count_obj (ClassRegions, Number) - 生成空區(qū)域
gen_empty_obj (FinalClasses) - 分割連通域
connection (Chambers, ChambersRemaining)
for Index := Number to 1 by -1
dev_clear_window ()- 選擇ClassRegions區(qū)域中的第Index個(gè)對(duì)象
select_obj (ClassRegions, Region, Index) - 求交集
intersection (ChambersRemaining, Region, Region) - 使用面積與寬度進(jìn)行區(qū)域篩選
select_shape (Region, PillsOfOneType, [‘a(chǎn)rea’,‘width’], ‘a(chǎn)nd’, [200,40], [3000,68]) - 求取兩個(gè)區(qū)域的差集
difference (ChambersUnion, PillsOfOneType, RegionDifference) - 分割連通域
connection (RegionDifference, ConnectedRegions) - 使用面積進(jìn)行區(qū)域篩選
select_shape (ConnectedRegions, SelectedRegions, ‘a(chǎn)rea’, ‘a(chǎn)nd’, 0, 7868) - 求取區(qū)域的最大邊緣
shape_trans (SelectedRegions, SelectedRegions, ‘convex’) - 聯(lián)合區(qū)域
union1 (SelectedRegions, SelectedRegions) - 求取區(qū)域差集
difference (ChambersRemaining, SelectedRegions, ChambersRemaining) - 聯(lián)合兩個(gè)區(qū)域
concat_obj (SelectedRegions, FinalClasses, FinalClasses)
endfor
- 選擇ClassRegions區(qū)域中的第Index個(gè)對(duì)象
- 得出結(jié)果進(jìn)行處理得出結(jié)論
gen_empty_obj (MissingPills)
gen_empty_obj (WrongPills)
gen_empty_obj (WrongNumberOfPills)
difference (ChambersUnion, FinalClasses, LeftOvers)
area_center (LeftOvers, Area, Row1, Column1)
if (Area > 0)
connection (LeftOvers, LeftOvers)
count_obj (LeftOvers, Number)
for Index := 1 to Number by 1
select_obj (LeftOvers, ObjectSelected, Index)
intensity (ObjectSelected, ImageB, Mean, Deviation)
if (Deviation > 40)
concat_obj (WrongPills, ObjectSelected, WrongPills)
else
concat_obj (MissingPills, ObjectSelected, MissingPills)
endif
endfor
endif - Compute histogram
CountFinalClass := []
for Index := 1 to NumClasses by 1
select_obj (FinalClasses, ObjectSelected, Index)
connection (ObjectSelected, ObjectSelected)
count_obj (ObjectSelected, Size)
CountFinalClass := [CountFinalClass,Size]
endfor - Display classification results and output allover statistic
display_results (ImageAffinTrans, LeftOvers, FinalClasses, WrongPills, CountFinalClass, PillTypeCount, WindowHandle)
if (FileIndex < Count)
disp_continue_message (WindowHandle, ‘black’, ‘true’)
endif
stop ()
endfor
- 讀入圖片
-
Clear classifier handle
clear_class_gmm (GMMHandle)
處理思路
此例子使用GMM高斯分類器進(jìn)行膠囊識(shí)別識(shí)別,因?yàn)橐话嫠幧嫌卸鄠€(gè)種類的藥片。
后記
大家有什么問(wèn)題可以向我提問(wèn)哈,我看到了第一時(shí)間回復(fù),希望在學(xué)習(xí)的路上多多結(jié)交良師益友。
總結(jié)
以上是生活随笔為你收集整理的HALCON示例程序check_blister_mixed.hedv药品胶囊缺陷检测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机程序丢失或损坏,电脑开机后出现wi
- 下一篇: 成田机场坐access到品川_东京旅游-