【Halcon學(xué)習(xí)筆記】09.字符檢測
1.概述
? ? ? ? 光學(xué)字符識別(OCR)是在圖像中識別字符的過程。它包含兩個任務(wù):將圖像中單個字符分割出來以及將分割得到的字符進行分類,即分割得到一個區(qū)域后分配一個符號標記。
????????字符分割涉及圖像預(yù)處理、圖像分割、形態(tài)學(xué)運算、區(qū)域特征等知識(本節(jié)不重點闡述)。字符分類具體含義是將一個目標字符根據(jù)某種特征劃到某個類別中去,即為分類器。Halcon提供了不同的分類器,其中比較重要的分類器有:基于神經(jīng)網(wǎng)絡(luò)的MLP分類器、基于支持向量機的SVM分類器、基于高斯混合模型的GMM分類器、基于k臨近的k-NN分類器。其中MLP分類器在字符識別中較為常用。

2.相關(guān)算子
2.1 創(chuàng)建、添加(將字符添加到.trf訓(xùn)練文件中)
????????append_ocr_trainf()? ??
????????Character:字符Region
????????Image:字符Image
????????Class:字符文本
????????TrainingFile:OCR訓(xùn)練的.trf文件路徑(路徑文件不存在時自動創(chuàng)建)
2.2 查詢(查詢.trf訓(xùn)練文件中存儲有哪些字符,以及每個字符在訓(xùn)練器中的數(shù)量)
????????read_ocr_trainf_names()? ?
????????TrainingFile:OCR訓(xùn)練的.trf文件路徑
????????CharacterNames:所讀取的字符文本
????????CharacterCoun:字符文本的數(shù)量
2.3 創(chuàng)建(創(chuàng)建mlp類型的OCR分類器)
????????create_ocr_class_mlp()? ?
????????WidthCharacter:字符寬度
????????HeightCharacter:字符高度
????????Interpolation:字符縮放樣式
????????Features:用于分類的特征
????????Characters:要讀取的字符集的所有字符
????????NumHidden:對MLP隱藏單元數(shù)
????????Preprocessing:用于轉(zhuǎn)換特征向量的預(yù)處理類型
????????NumComponents:變換特征的個數(shù)
????????RandSeed:隨機數(shù)生成器的種子值
????????OCRHandle:OCR分類器句柄
2.4 訓(xùn)練(用訓(xùn)練樣本訓(xùn)練OCR分類器)
????????trainf_ocr_class_mlp()? ??
????????OCRHandle:OCR分類器句柄
????????TrainingFile:OCR訓(xùn)練的.trf文件路徑
????????MaxIterations:優(yōu)化算法的最大迭代次數(shù)
????????WeightTolerance:優(yōu)化算法兩次迭代中MLP權(quán)重差的閾值
????????ErrorTolerance:優(yōu)化算法兩次迭代訓(xùn)練數(shù)據(jù)上MLP平均誤差的閾值
????????Error:訓(xùn)練數(shù)據(jù)中MLP的平均誤差
????????ErrorLog:訓(xùn)練數(shù)據(jù)上的MLP的平均誤差作為優(yōu)化算法迭代次數(shù)的函數(shù)
2.5 保存(保存OCR的.omc分類器到本地)
????????write_ocr_class_mlp()? ??
????????OCRHandle:OCR分類器句柄
????????FileName:OCR分類器.omc文件路徑
2.6 讀?。◤谋镜芈窂街凶x取OCR的.omc分類器)
????????read_ocr_class_mlp? ? ? ?
????????FileName:OCR分類器.omc文件路徑
????????OCRHandle:OCR分類器句柄
2.7 識別(識別出最符合的字符)
????????do_ocr_multi_class_mlp? ?
????????Character:需要識別的字符Region
????????Image:需要識別的字符Image
????????OCRHandle:OCR分類器句柄
????????Class:識別出的字符文本
????????Confidence:識別的自信度
2.8 釋放(釋放OCR分類器)
????????clear_ocr_class_mlp()? ? ??
????????OCRHandle:OCR分類器句柄
3.字符檢測在Halcon中的應(yīng)用步驟
????????OCR檢測一般分為離線訓(xùn)練和在線檢測兩部分。

3.1 離線訓(xùn)練實現(xiàn)步驟
1)讀取樣本圖像,分割單個字符區(qū)域
????????read_image (Image, path+'/Traning.bmp')?
????????threshold (Image, Region1, 0, 10)
????????connection (Region1, ConnectedRegions)
????????select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 99999)
????????sort_region (SelectedRegions, SortedRegions, 'first_point', 'true', 'column')
????????count_obj (SortedRegions, Number)
????????if (Number#10)
????????????disp_message (WindowHandle, '分割錯誤', 'window', 0, 0, 'red', 'false')
????????????stop ()
????????endif
? ? ? ? select_obj (SortedRegions, ObjectSelected1, 1)

2)將分割出的區(qū)域添加到訓(xùn)練文件中
????????smallest_rectangle1 (ObjectSelected1, Row11, Column11, Row21, Column21)
????????charWidth:=Row21-Row11
????????charHeight:=Column21-Column11
????????charList:=[ '0','1','2','3','4','5','6','7','8','9']
? ? ????for Number := 1 to Number by 1
????????????select_obj (SortedRegions, ObjectSelected, Number)
? ? ????????append_ocr_trainf (ObjectSelected, Image, charList[Number-1], path+'/Model0-9.trf')
????????endfor?
3)獲取字符列表,創(chuàng)建、訓(xùn)練、保存OCR分類器
????????read_ocr_trainf_names (path+'/Model0-9.trf', CharacterNames, CharacterCount)
????????create_ocr_class_mlp (charWidth, charHeight, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle)
????????trainf_ocr_class_mlp (OCRHandle, path+'/Model0-9.trf', 200, 1, 0.01, Error, ErrorLog)
????????write_ocr_class_mlp (OCRHandle, path+'/Model0-9.omc')
????????dev_display (Image)
????????disp_message (WindowHandle, '訓(xùn)練完成', 'window', 0, 0, 'green', 'false')
3.2 在線檢測實現(xiàn)步驟
1)讀取檢測圖像
2)提取圖像中單個字符區(qū)域
3)讀取OCR分類器
4)使用OCR分類器對區(qū)域字符進行分類
5)釋放分類器
read_ocr_class_mlp (path+'/Model0-9.omc', OCRHandle)
list_files (path, ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(bmp|jpg|jpeg)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
????read_image (Image, ImageFiles[Index])?
????threshold (Image, Region1, 0, 1)
????connection (Region1, ConnectedRegions)
????select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 99999)
????sort_region (SelectedRegions, SortedRegions, 'first_point', 'true', 'column')
????count_obj (SortedRegions, Number)
????do_ocr_multi_class_mlp (SortedRegions, Image, OCRHandle, Class, Confidence)
????dev_display (Image)
????for Number := 1 to Number by 1
????????disp_message (WindowHandle, Class[Number-1], 'image', 100, 30+((Number-1)*59), 'green', 'false')
????endfor? ? ? ? ??
endfor
endif
clear_ocr_class_mlp (OCRHandle)

4.補充
4.1 注意事項
1)關(guān)于分類器文件。Halcon內(nèi)置了許多針對數(shù)字、字母的.omc分類器,識別目標為標準、非中文字符,是可以直接調(diào)用這些分類器文件(路徑:.\MVTec\HALCON-12.0\ocr);如果識別目標不屬于這些情況,需要自己訓(xùn)練。
2)關(guān)于訓(xùn)練分類器。Halcon的OCR助手可以快速便捷訓(xùn)練分類器。其步驟為:加載圖片>>框選識別目標>>輸入目標文本>>應(yīng)用快速設(shè)置>>創(chuàng)建新的訓(xùn)練文件>>加入訓(xùn)練數(shù)據(jù)>>開始訓(xùn)練。
3)關(guān)于訓(xùn)練分類器。訓(xùn)練時,盡量把字符本身轉(zhuǎn)正;盡量用多一點的數(shù)據(jù)去訓(xùn)練。
4)關(guān)于字符分割。離線訓(xùn)練和在線檢測的程序中,圖像預(yù)處理和閾值分割方式要盡量保持一致,這樣才能得到最好的識別效果。

by Ryou2-