Halcon 第六章◆第6节:光学字符识别OCR
????????一、介紹
????????光學字符識別OCR(Optical Character Recognition)是指用計算機圖像處理的方法將字符圖像“翻譯”成計算機文字的過程,包括圖像采集、預處理(二值化、噪聲去除、傾斜校正)、字符定位、字符分割、特征提取、字符分類等步驟。
????????二、常用方法
????????①統計特征字符識別:這類方法先從字符圖像中提取字形,將其與事先存儲的字形進行比較,將相似度最高的匹配結果作為分類結果。這類方法的匹配算法簡單,具有較快的匹配速度和較高的識別率。但是這類方法對于變形、選擇等改變方向字符的識別能力較弱。
????????②結構字符識別:該類方法首先對待識別字體進行字體結構識別,利用字符的輪廓結構特征和統計特征來確定字符的模式、基元等特征,并通過基元的排序、組合形成字符特征。該類方法需要較高的圖像分辨率,以便獲得清晰的圖像特征結構,但是這會影響圖像識別的速度。
????????③神經網絡的識別:該類方法將提取到的字符特征向量輸入神經網絡進行識別。該類方法能夠有效地對各種模糊字符進行正確判斷,但是學習速度慢,泛化能力較弱。
????????④深度學習的方法:這類方法通常用深度神經網絡來充當字符的特征提取器和分類器,不需要人為設計字符特征,從而減少了人為設計特征造成的不完備性,提高識別的準確率。它的缺點是要達到很好的精度,需要大數據支撐,以及更多更好的硬件支持。
? ? ? ? 三、步驟
? ? ? ? OCR的檢測分為離線訓練和在線檢測兩個部分。
? ? ? ? 1、離線訓練
? ? ? ? 離線部分一般指的是字符的訓練過程,包括以下幾個步驟:
? ? ? ? ①讀取樣本圖像,并對樣本中的已知字符進行區域分割,分割的單位是單個字符的包圍區域。這時可以使用draw_rectangle1等算子選擇出單個字符的區域。
? ? ? ? ②將分割出的區域和對應的字符名稱存儲在訓練文件中。可以使用append_ocr_trainf算子,將字符區域存在指定的以“.trf”結尾的訓練文件中。
? ? ? ? ③檢查訓練文件中的對應關系,即圖像與字符的名稱應一一對應。
? ? ? ? ④訓練分類器。首先創建一個分類器,然后進行訓練。可以使用create_ocr_class_mlp算子訓練基于MLP的分類器,使用trainf_ocr_class_mlp算子訓練基于“.trf”訓練文件的分類器,得到分類器句柄OCRHandle。
? ? ? ? ⑤保存分類器。使用write_ocr_class_mlp算子保存句柄為OCRHandle的分類器,分類器的名稱為以“.omc”結尾的文件。
? ? ? ? ⑥清楚分類器。
? ? ? ? 2、在線檢測
? ? ? ? 在線部分的OCR指的是對字符進行檢測,即分類,一般流程如下:
? ? ? ? ①讀取分類器。使用read_ocr_class_mlp算子讀取以“.omc”結尾的分類器文件。
? ? ? ? ②對待檢測的字符進行區域分割,提取出獨立的字符區域。
? ? ? ? ③使用分類器對字符區域進行分類。MLP分類器使用do_ocr_multi_class_mlp算子進行分類,返回對應的分類結果,結果形式為類別名稱class和confidence。
? ? ? ? ④清除分類器。
? ? ? ? 提示:Halcon目錄下的OCR文件夾中內置了許多針對數字、字母、和噴碼等字符的分類器,包含對多種標準的、非中文的字符類的識別,有時可以直接調用這些分類器文件,以省去自己訓練的步驟。如果要識別的字符不屬于這些情況,如中文字符或者手寫等特殊情況,則需要自己訓練。
? ? ? ? 三、Halcon中OCR相關算子
| ????????OCR / Training Files ????????將字符(元組)添加到一個訓練文件中 append_ocr_trainf(Character, Image : : Class, TrainingFile : ) ????????Character:輸入參數,需要訓練的字符,也就是輸入對應的字符的圖像區域。 ????????Image:輸入參數,輸入對應的字符圖像,一般就是用來摳出Character的圖像區域所用的原圖像。 ????????Class:輸入參數,輸入字符的類名(數組)(比如摳出來的區域對應的字符、數字或文字等可以作為這個圖像的類名)。 ????????TrainingFile:輸入參數,輸入需要保存的訓練文件名,默認'train_ocr',后綴為【?.trf, .otr】。 |
| ????????OCR / Neural Nets【神經網絡】 ????????使用MLP(多層感知器)創建一個OCR分類器。 create_ocr_class_mlp( : : WidthCharacter, HeightCharacter, Interpolation, Features, Characters, NumHidden, Preprocessing, NumComponents, RandSeed : OCRHandle) ????????WidthCharacter:輸入參數,輸入被分割的字符縮放到指定的寬度。默認8,建議值【1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 20】,典型值范圍【?4 ≤ WidthCharacter ≤ 20】。 ????????HeightCharacter:輸入參數,輸入被分割的字符縮放到指定的高度。默認10,建議值【1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 20】,典型值范圍【4 ≤ HeightCharacter ≤ 20】。 ????????Interpolation:輸入參數,設置縮放的字符纂改模式。默認【'constant'】,列表【?'bicubic', 'bilinear'雙線性, 'constant'不變, 'nearest_neighbor'鄰近, 'weighted'有利的】。 ????????Features:輸入參數,默認'default'?,列表【 'anisometry'字符的不等軸(參考橢圓,單一特征); 'chord_histo'每一排運動的頻率(字符高度特性); 'compactness'字符的緊湊型(單一特性); 'convexity'字符的凹凸特性(單一特性); 'cooc'點陣(參考gen_cooc_matrix一個區域中同時出現的矩陣,八個特征); 'default'等于選擇了'ratio' 和 'pixel_invar'; 'foreground'在前景中的部分像素(單一特性); 'foreground_grid_16'字符像素占4×4個小方格,十六個特征; 'foreground_grid_9'字符像素占3×3個小方格,九個特征; 'gradient_8dir'字符圖像的傾斜度,即對字符圖像進行梯度計算。將梯度方向離散為8個方向。根據這些離散方向,將振幅圖像分解為8個通道。每個通道在一個5x5的網格中提取25個樣本。這些樣本被用作特征(200個特征)?; 'height'字符的原始高度(參考smallest_rectangle1單一特征); 'moments_central'字符的某一時刻對應中心的矩特性,四個特征; 'moments_gray_plane'字符的某一時刻對應角度的矩特性,四個特征; 'moments_region_2nd_invar'字符的某一時刻對應的矩特性(參考moments_region_2nd_invar; 三個特征); 'moments_region_2nd_rel_invar'字符的某一時刻對應的矩特性(參考moments_region_2nd_rel_invar; 兩個特征); 'moments_region_3rd_invar'字符的某一時刻對應的矩特性(參考moments_region_3rd_invar; 四個特征); 'num_connect'相連接部分的數量(參考connect_and_holes單一特征); 'num_holes'孔的數量(參考connect_and_holes連接部分和中斷的數目,單一特征); 'num_runs'在某一區域高度運動的數量(單一特征); 'phi'字符方位(參考eliptic_axis橢圓的長軸對應的角度,兩個特征); 'pixel'識別字符對應的灰度像素(字符寬度乘以字符高度特性); 'pixel_binary'字符(高寬)占有區域對應的灰度像素(字符寬度乘以字符高度特性); 'pixel_invar'識別(最大縮放比)字符對應的灰度像素(字符寬度乘以字符高度特性); 'projection_horizontal' 依水平方向投影所對應的灰度值,參考gray_projections; 'projection_horizontal_invar'依水平方向的最大投影比例所對應的灰度值(字符高度特征); 'projection_vertical'依垂直方向投影所對應的灰度值,參考gray_projections; 'projection_vertical_invar'依垂直方向的最大投影比例所對應的灰度值(字符高度特征); 'ratio'字符的縱橫比(1個特征); 'width'字符的原始寬度(參考smallest_rectangle1單一特征)); 'zoom_factor'寬高比值(介于寬度和高度之間的特性,單一特性) 】 ????????Characters:輸入參數,設置需要匹配的字符查閱表,如(0~9、A~Z、+-*/=<>#$%&()等)默認【?['0','1','2','3','4','5','6','7','8','9']】 ????????NumHidden:輸入參數,隱藏的MLP單元數目。默認80,建議值【1, 2, 3, 4, 5, 8, 10, 15, 20, 30, 40, 50, 60, 70, 80, 90, 100, 120, 150】,范圍【?NumHidden >= 1】。 ????????Preprocessing:輸入參數,矢量特征轉換的預處理類型。默認?'none',列表【'canonical_variates', 'none', 'normalization', 'principal_components'】。 ????????NumComponents:輸入參數,預處理參數:變換特征個數,即匹配字符的數量(當Preprocessing='none', 'normalization'時此參數無效)。默認10,建議值【?1, 2, 3, 4, 5, 8, 10, 15, 20, 30, 40, 50, 60, 70, 80, 90, 100】,范圍【NumComponents >= 1】。 ????????RandSeed:輸入參數,隨機數生成器的種子值,用于用隨機值初始化MLP。默認42。 ????????OCRHandle:輸出參數,輸出OCR_mlp分類器的句柄。 |
| ????????OCR / Neural Nets【神經網絡】 ????????訓練OCR分類器 trainf_ocr_class_mlp( : : OCRHandle, TrainingFile, MaxIterations, WeightTolerance, ErrorTolerance : Error, ErrorLog) ????????OCRHandle:輸入參數,輸入OCR_mlp分類器的句柄。 ????????TrainingFile:輸入參數,輸入示范樣品文件,后綴為.trf。默認?'ocr.trf',可導入的文件后綴名有【trf, .otr】。 ????????MaxIterations:輸入參數,優化算法的最大迭代次數。默認200,建議值【20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260, 280, 300】。 ????????WeightTolerance:輸入參數,為兩次迭代優化算法之間MLP權值的差異設定閾值。默認1.0,建議值【?1.0, 0.1, 0.01, 0.001, 0.0001, 0.00001】,范圍【WeightTolerance >= 1.0e-8】。 ????????ErrorTolerance:輸入參數,優化算法對訓練數據的MLP平均誤差在兩次迭代之間的差異閾值。默認0.01,建議值【1.0, 0.1, 0.01, 0.001, 0.0001, 0.00001】,范圍【ErrorTolerance >= 1.0e-8】。 ????????Error:輸出參數,輸出MLP的訓練數據的平均誤差。 ????????ErrorLog:輸出參數,MLP對訓練數據的平均誤差作為優化算法迭代次數的函數,一次重復MLP最佳運算法則的平均錯誤數據。 |
| ????????OCR / Neural Nets【神經網絡】 ????????寫入一個OCR分類器到一個文件 write_ocr_class_mlp( : : OCRHandle, FileName : ) ????????OCRHandle:輸入參數,輸入OCR_mlp分類器的句柄。 ????????FileName:輸入參數,輸入文件名稱(保存的文件擴展名默認為.omc)。 |
| ????????OCR / Neural Nets【神經網絡】 ????????使用OCR分類器對多個字符進行實例分類 do_ocr_multi_class_mlp(Character, Image : : OCRHandle : Class, Confidence) ????????Character:輸入參數,輸入需要辨認的字符區域。 ????????Image:輸入參數,輸入需要辨認字符的灰度值圖像。 ????????OCRHandle:輸入參數,OCR_mlp分類器的句柄。 ????????Class:輸出參數,輸出MLP識別對應的結果,該值保存的值為識別出來的字母或者數字或者符號等(數組)。Class == Character。 ????????Confidence:輸出參數, 輸出對應的特征相似值(數組),該值≤1.0,Confidence == Character。 |
| ????????OCR / Training Files ????????在訓練的文件中查詢 read_ocr_trainf_names( : : TrainingFile : CharacterNames, CharacterCount) ????????TrainingFile:輸入參數,輸入要查詢的文件的位置+名稱+后綴,后綴一般為.trf。 ????????CharacterNames:輸出參數,讀取字符的名稱。 ????????CharacterCount:輸出參數,讀取字符圖像的個數。 |
?
?
總結
以上是生活随笔為你收集整理的Halcon 第六章◆第6节:光学字符识别OCR的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网吧操作系统制作和优化的经验
- 下一篇: unity粒子特效附上贴图后播放动画