日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > ChatGpt >内容正文

ChatGpt

Halcon 第六章◆第6节:光学字符识别OCR

發布時間:2023/12/31 ChatGpt 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Halcon 第六章◆第6节:光学字符识别OCR 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????????一、介紹

????????光學字符識別OCR(Optical Character Recognition)是指用計算機圖像處理的方法將字符圖像“翻譯”成計算機文字的過程,包括圖像采集、預處理(二值化、噪聲去除、傾斜校正)、字符定位、字符分割、特征提取、字符分類等步驟。

????????二、常用方法

????????①統計特征字符識別:這類方法先從字符圖像中提取字形,將其與事先存儲的字形進行比較,將相似度最高的匹配結果作為分類結果。這類方法的匹配算法簡單,具有較快的匹配速度和較高的識別率。但是這類方法對于變形、選擇等改變方向字符的識別能力較弱。

????????②結構字符識別:該類方法首先對待識別字體進行字體結構識別,利用字符的輪廓結構特征和統計特征來確定字符的模式、基元等特征,并通過基元的排序、組合形成字符特征。該類方法需要較高的圖像分辨率,以便獲得清晰的圖像特征結構,但是這會影響圖像識別的速度。

????????③神經網絡的識別:該類方法將提取到的字符特征向量輸入神經網絡進行識別。該類方法能夠有效地對各種模糊字符進行正確判斷,但是學習速度慢,泛化能力較弱。

????????④深度學習的方法:這類方法通常用深度神經網絡來充當字符的特征提取器和分類器,不需要人為設計字符特征,從而減少了人為設計特征造成的不完備性,提高識別的準確率。它的缺點是要達到很好的精度,需要大數據支撐,以及更多更好的硬件支持。

? ? ? ? 三、步驟

? ? ? ? OCR的檢測分為離線訓練和在線檢測兩個部分。

? ? ? ? 1、離線訓練

? ? ? ? 離線部分一般指的是字符的訓練過程,包括以下幾個步驟:

? ? ? ? ①讀取樣本圖像,并對樣本中的已知字符進行區域分割,分割的單位是單個字符的包圍區域。這時可以使用draw_rectangle1等算子選擇出單個字符的區域。

? ? ? ? ②將分割出的區域和對應的字符名稱存儲在訓練文件中。可以使用append_ocr_trainf算子,將字符區域存在指定的以“.trf”結尾的訓練文件中。

? ? ? ? ③檢查訓練文件中的對應關系,即圖像與字符的名稱應一一對應。

? ? ? ? ④訓練分類器。首先創建一個分類器,然后進行訓練??梢允褂胏reate_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:輸出參數,讀取字符圖像的個數。

dev_close_window() read_image (Image, 'data/機器視覺') get_image_size(Image,width,height) dev_open_window (0, 0, width, height, 'black', WindowHandle) rgb1_to_gray (Image, GrayImage) ***創建一個EmptyObject空元組 gen_empty_obj (EmptyObject) for Index := 1 to 4 by 1disp_message (WindowHandle, '請框選單個漢字區域,右鍵確認:','window', 12, 12, 'yellow', 'false')***手動畫一個矩形,輸出其左上和右下的坐標draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)**根據畫的矩形生成對應的矩形Rectanglegen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)***GrayImage為底,以Rectangle為區域,提取出ImageReduced1區域reduce_domain (GrayImage, Rectangle, ImageReduced1)*閾值處理threshold (ImageReduced1, Region1, 128, 255)*將元組EmptyObject和Region1區域合并concat_obj (EmptyObject, Region1, EmptyObject) endfor words:=['機','器','視','覺'] *排序 ***按區域的相對位置排序 sort_region (EmptyObject, SortedRegions1, 'character', 'true', 'row')for Index1:=1 to 4 by 1***在元組SortedRegions1中,選擇單獨某一個對象 select_obj (SortedRegions1, ObjectSelected1, Index1)*將選擇的對象字符添加到一個訓練文件中 append_ocr_trainf (ObjectSelected1, Image, words[Index1-1], 'data/jqsj.trf') endfor ***從訓練文件中查詢有哪些字符 read_ocr_trainf_names ('data/jqsj.trf', CharacterNames, CharacterCount) stop() ***創建一個OCR分類器 create_ocr_class_mlp (50, 60, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle) ***從訓練文件中開始訓練 trainf_ocr_class_mlp (OCRHandle, 'data/jqsj.trf', 200, 1, 0.01, Error, ErrorLog) ***輸出訓練后的文件 write_ocr_class_mlp (OCRHandle, 'data/jqsj.omc') *讀取一張測試圖 read_image (ImageTest, 'data/機器視覺.png') rgb1_to_gray (ImageTest, Image1) threshold (Image1, T1, 128, 255) *對符合條件的字符區域進行分割 connection (T1, T2) *------------------------------------ closing_circle(T1, RegionClosing, 15) connection(RegionClosing, ConnectedRegions) intersection(ConnectedRegions,T2,T11) *------------------------------------ *篩選符合條件的字符形狀區域 select_shape (T11, SelectedwordRegions, 'area', 'and', 200, 2500) *從左到右,排序 sort_region (SelectedwordRegions, SortedRegions2, 'upper_left', 'true', 'column') count_obj(SortedRegions2, Number) *開始字符識別 read_ocr_class_mlp ('data/jqsj.omc', OCRHandle1) do_ocr_multi_class_mlp (SortedRegions2, Image1, OCRHandle1, Class, Confidence) *顯示結果 dev_clear_window() dev_display(SortedRegions2) disp_message(WindowHandle, '識別結果:', 'image', 10, 10, 'white', 'false') for i:=1 to 4 by 1disp_message(WindowHandle, Class[i-1], 'image', 230, i*140, 'green', 'false') endfor

?

?

總結

以上是生活随笔為你收集整理的Halcon 第六章◆第6节:光学字符识别OCR的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。