1. 程式人生 > >Halcon中OCR的實現及關鍵函式解析

Halcon中OCR的實現及關鍵函式解析

  OCR的實現共分為兩步,1是使用字元資料來訓練OCR。2是使用OCR進行字元的識別。

訓練分類器

  訓練分類器共分為4步:1是使用閾值來分割字元區域;2是呼叫append_ocr_trainf函式將字元加入訓練集;3是建立分類器;4是呼叫trainf_ocr_class_mlp函式來訓練分類器。

*對字元進行訓練得到分類器
TrainingNames := ['F','M','1','4','A','4','2']
FontName := 'F:/YM_Project/SZWX/work_x32_MFOL2/function/MFOL2'
TrainingFileName := FontName+'.trf'
*當dev_set_check的引數為'~give_error'時,這次檢測會被忽略,程式進入後面的操作。 dev_set_check ('~give_error') *刪除指定位置的檔案 delete_file (TrainingFileName) for i := 0 to |TrainingNames|-1 by 1 select_obj (FinalNumbers, CharaterRegions, i+1) *將字元CharaterRegions新增到訓練集TrainingFileName中 append_ocr_trainf (CharaterRegions, FourthDarkImage, TrainingNames[i], TrainingFileName) disp_message (WindowID, TrainingNames[i], 'image'
, MeanRow-40, Column[i]-6, 'yellow', 'false') endfor *tuple_uniq( : : Tuple : Uniq) *相鄰重疊的元組只保留一個。常用於tuple_sort( : : Tuple : Sorted)之後,tuple_sort是升序排列。 CharNames := uniq(sort(TrainingNames)) *創建mlp create_ocr_class_mlp (8, 10, 'constant', 'default', CharNames, 5, 'none', 10, 42, OCRHandle) *使用訓練集來訓練mlp trainf_ocr_class_mlp (OCRHandle, TrainingFileName, 200
, 1, 0.01, Error, ErrorLog) write_ocr_class_mlp (OCRHandle, FontName) clear_ocr_class_mlp (OCRHandle)

使用分類器進行識別

  使用分類器進行字元識別的函式有兩個:1是do_ocr_multi_class_mlp,該函式對一幅影象內的多個字元進行一次分類並輸出分類結果。2是do_ocr_single_class_mlp,該函式是對一幅影象中的單個字元進行分類。兩者的對比試驗表明,後者的分類準確度要高,因此,下文使用do_ocr_single_class_mlp運算元進行字元的分類。
  分類的實現分為4步:1是讀取分類器;2是讀取圖片;3是分割單個字元;4分類

*Step1根據分類器來分類
read_ocr_class_mlp (FontName, OCRHandle)
*Step2讀取圖片獲得每一個影象
read_image (Image, 'F:/YM_Project/SZWX/1024SZWX/SVS900_XFMT1X110_CR6030_S1_4.bmp')
*Step3分割單個字元
gen_rectangle1 (Rectangle1, 43, 2243, 707, 3675)
reduce_domain (Image, Rectangle1, ImageReduced1)
crop_domain (ImageReduced1, ImagePart)
median_image (ImagePart, ImageReduced1, 'circle', 3, 'mirrored')
threshold (ImageReduced1, Regions, 84, 255)
opening_circle (Regions, RegionOpening, 3.5)
connection (RegionOpening, ConnectedRegions)
select_shape (ConnectedRegions, Numbers, 'area', 'and', 1000, 9999)
count_obj (Numbers, CharacterNums)
ArrayConfidence := []
for IndexCharacter := 1 to CharacterNums by 1
    select_obj (Numbers, CharacterSelected, IndexCharacter)  
    *Step4分類
    do_ocr_single_class_mlp(CharacterSelected, ImagePart, OCRHandle,1, Class, Confidence)
    ArrayConfidence := [ArrayConfidence,Confidence]
endfor

關鍵函式解析

create_ocr_class_mlp( : : WidthCharacter, HeightCharacter, Interpolation, Features, Characters, NumHidden, Preprocessing, NumComponents, RandSeed : OCRHandle)

WidthCharacter:輸入被分割的字元縮放到指定的寬度
HeightCharacter:
Interpolation:設定縮放的字元的縮放模式,對於多數應用而言,Interpolation = 'constant'。請注意:轉換後的字元大小不能太大,因為分類器對較大尺寸的字元分類效果並不好。特別是,如果尺寸較大,一些小的分割誤差會較大程度上影響分類的效果,一般情況下,sizes between 6x8 and 10x14
Features:分類的特徵向量的長度
Characters:輸出層神經元的個數;也就是是需要匹配的字元查閱表中字元的個數。
NumHidden:MLP中隱藏層神經元的個數
Preprocessing:向量特徵裝換的預處理型別
NumComponents:匹配字元的數量
這兩個引數主要是對輸入的值進行預處理。

RandSeed:初始化mlp
OCRHandle:輸出OCR_mlp分類器控制代碼
trainf_ocr_class_mlp( : : OCRHandle, TrainingFile, MaxIterations, WeightTolerance, ErrorTolerance : Error, ErrorLog)
訓練一個神經網路分類器
do_ocr_multi_class_mlp(Character, Image : : OCRHandle : Class, Confidence)
使用OCR分類多個字元
Character是字元區域
Image是字元圖片
OCRHandle是分類器控制代碼
Class是輸出的類別
Confidence是輸出的分類精度

do_ocr_single_class_mlp(CharacterSelected, ImagePart, OCRHandle,1, Class, Confidence)
分類單個字元,其分類效果比上述同時分類多個字元的效果要好