1. 程式人生 > >halcon OCR識別,訓練自己的OCR

halcon OCR識別,訓練自己的OCR

看halcon助手有OCR識別,就想著試一下,結果一直識別不出來,不知道怎麼訓練自己的OCR庫,經過一天搜尋資料,終於知道怎麼訓練自己的OCR庫,並在影象中進行識別
害怕以後忘了,上傳上來以備以後不時之需

dev_set_draw (‘margin’)
*載入影象
read_image (Image, ‘漢字識別.jpg’)
*選取感興趣區域,本例訓練‘中華人民共和國’幾個漢字
gen_rectangle1 (Rectangle1, 134, 187, 188, 418)
reduce_domain (Image, Rectangle1, ImageReduced)
*影象預處理
dev_set_draw (‘fill’)
threshold (ImageReduced, Regions, 0, 200)
connection (Regions, ConnectedRegions)

*對於‘共’這種分開的字元,sort_region可通過’character’引數識別成一個字元
sort_region (ConnectedRegions, SortedRegions, ‘character’, ‘true’, ‘column’)
count_obj (SortedRegions, Number)

word := [‘中’,‘華’,‘人’,‘民’,‘共’,‘和’,‘國’]
TrainFile:=‘MyTrainTest漢字.trf’
dev_set_check (’~give_error’)
delete_file (TrainFile)
dev_set_check (’~give_error’)

MaxHeight:=9
MaxWidth:=11
for Index := 1 to Number by 1
select_obj (SortedRegions, ObjectSelected, Index)
*將訓練字元新增到測試檔案中
append_ocr_trainf (ObjectSelected, Image, word[Index-1], TrainFile)
*以下內容可刪除,便於後面確定顯示位置
shape_trans (ObjectSelected, RegionTrans, ‘rectangle1’)
dev_display (RegionTrans)
region_features (RegionTrans, ‘width’, width)
region_features (RegionTrans, ‘height’, height)
if (|width| > MaxWidth)
width:=MaxWidth
endif
if (|height| > MaxHeight)
height:=MaxHeight
endif
endfor
stop ()

FontFile:=‘MyTrainTest漢字.omc’
*查詢哪些字元儲存在測試檔案中
read_ocr_trainf_names (TrainFile, CharacterNames1, CharacterCount1)
*利用MLP(多層感知器)建立一個新的OCR分級器
create_ocr_class_mlp (MaxWidth, MaxHeight, ‘constant’, ‘default’, word, 80, ‘none’, 10, 42, OCRHandle)
*測試OCR分級器的OCRHandle,根據儲存在OCR檔案中的測試特性
trainf_ocr_class_mlp (OCRHandle, TrainFile, 200, 1, 0.01, Error1, ErrorLog1)
*將OCR分級器的OCRHandle寫入由檔名確定的檔案中
write_ocr_class_mlp (OCRHandle, FontFile)
*清除所有的由OCRHandle給定的且由create_ocr_class_mlp建立的OCR分級器,釋放所有的分級器佔據的儲存空間
clear_ocr_class_mlp (OCRHandle)

*以上,字元訓練完畢,下面開始進行字元識別

*經測試,識別正確,分數都在0.99以上,低於0.99一般都是識別錯誤
MinScore:=0.992
*載入即將識別的影象
read_image (Image1, ‘漢字識別.jpg’)
*影象預處理
threshold (Image1, Region, 0, 200)
connection (Region, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, ‘area’, ‘and’, 45, 160)
sort_region (SelectedRegions1, SortedRegions1, ‘first_point’, ‘true’, ‘row’)
area_center (SortedRegions1, Area, Row, Column)

*從一個檔案中讀取OCR分級器
read_ocr_class_mlp (FontFile, OCRHandle1)
*為根據給定區域字元和OCR分級器OCRHandle的灰度影象值而給定的每個字元計算出最好的類,將類返回到Class中,且將類的置信度返回到Confidence中
do_ocr_multi_class_mlp (SortedRegions1, Image1, OCRHandle1, RecNum, Confidence)

*顯示在螢幕上
dev_display (Image1)
OffsetX:=10
OffsetY:=6
dev_set_draw (‘margin’)
for i := 0 to |RecNum| - 1 by 1
RowBegin:=Row[i]+OffsetX
ColumnBegin:=Column[i]-OffsetY
if (Confidence[i]<MinScore)
*未識別出來,顯示X
set_tposition (3600, RowBegin, ColumnBegin)
write_string (3600, ‘X’)
else
*識別成功,顯示該字元
set_tposition (3600, RowBegin, ColumnBegin)
write_string (3600, RecNum[i])
endif
endfor

stop 在這裡插入圖片描述
在這裡插入圖片描述