字符识别之字符训练部分

有朋友需要完成的OCR代码,这里放出来可以自己训练的代码以供参考。

***设置要训练的字符***
words:=['1','6','0']
***设置字符极性***
LightDark := 'dark'

dev_clear_window ()
dev_close_window ()

try
*读取训练图片
read_image (TrainImage,'image/train5.png')
*转为单通道图片
count_channels(TrainImage, Channels)
if (Channels == 3)
    rgb1_to_gray (TrainImage, GrayImage)
elseif (Channels != 3 and Channels != 1)
    access_channel(TrainImage, GrayImage, 1)
else
    GrayImage:=TrainImage
endif
get_image_size (GrayImage, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (GrayImage)
dev_set_draw ('margin')
*确定训练字符所在区域
disp_message(WindowHandle, '框选需要训练的字符区域\n单击右键!', 'window', 12, 12, 'green', 'false')
*绘制ROI
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
*创建矩形区域
gen_rectangle1(Rectangle, Row1, Column1, Row2, Column2)
*字符区域
reduce_domain (GrayImage, Rectangle, ImageReduced)
*设置字符极性
*阈值分割,提取前景
auto_threshold (ImageReduced, Regions, 10)
count_obj (Regions, Number)

if (LightDark=='dark')
    select_obj (Regions, TObjectSelected1, 1)
elseif (LightDark=='light')
    select_obj (Regions, TObjectSelected1, Number)
endif
*设置字符膨胀系数
dilation_rectangle1 (TObjectSelected1, RegionDilation, 1, 1)
*设置字符粘连参数
Radius:=0.5
*执行开运算,消除粘连
opening_circle (RegionDilation, RegionOpening, Radius)
*分割字符
connection (RegionOpening, ConnectedRegions)
*字符宽度范围
WidthMin:=0
WidthMax:=200
select_shape (ConnectedRegions, WSelectedRegions, 'width', 'and', WidthMin, WidthMax)
*字符高度范围
HeightMin:=0
HeightMax:=200
select_shape (WSelectedRegions, HSelectedRegions, 'height', 'and', HeightMin, HeightMax)
*字符面积范围
AreaMin:=0
AreaMax:=4000
select_shape (HSelectedRegions, ASelectedRegions, 'area', 'and', AreaMin, AreaMax)
*字符角度范围
PhiMin:=-45
PhiMax:=45
select_shape (ASelectedRegions, PSelectedRegions, 'phi', 'and', PhiMin, PhiMax)
*矩形框显示字符位置
shape_trans (PSelectedRegions, RegionTrans, 'rectangle1')
*创建空集合
gen_empty_obj (EmptyObject)
*接受已分割字符区域
concat_obj (EmptyObject, PSelectedRegions, EmptyObject1)
*排序
sort_region(EmptyObject1, SortedRegions, 'character', 'true', 'column')
count_obj (PSelectedRegions, CharacterNums)

ClassImage := 'ClassImage'
for Lable := 1 to CharacterNums by 1
    select_obj (SortedRegions, ObjectSelected1, Lable)
    area_center (ObjectSelected1, Area, Row, Column)
    region_features (ObjectSelected1, 'height', Height)
    region_features (ObjectSelected1, 'width', Width)
    region_to_bin (ObjectSelected1, BinImage, 0, 0, 2*Width, 2*Height)
    get_region_points (ObjectSelected1, Rows, Columns)
    get_grayval (ImageReduced1, Rows, Columns, Grayval)
    set_grayval (BinImage, Rows-80, Columns-120, Grayval)
endfor





 **********字符训练部分***********
*创建训练文件路径
TrainingFile:='train/char.trf1'
*将标签与字符区域相对应,并存入训练文件char.trf
for Index:=1 to CharacterNums by 1
    *标签与区域对应
    select_obj (SortedRegions,ObjectSelected,Index)
    *创建训练文件

    append_ocr_trainf(ObjectSelected, TrainImage, words[Index-1],  TrainingFile)
    *读取已训练文件
endfor  
    read_ocr_trainf_names (TrainingFile,CharacterNames, CharacterCount)
    *创建MLP分类器
    create_ocr_class_mlp(40, 72, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle)
    *训练MLP分类器
    trainf_ocr_class_mlp(OCRHandle, TrainingFile, 200, 1, 0.01, Error, ErrorLog)
    *保存已训练分类器
    Classifier:='train/char.omc1'
    write_ocr_class_mlp(OCRHandle,Classifier )
    disp_message (WindowHandle, '按F5进行字符识别', 'window', 200, 200, 'black', 'true')
catch (Exception)
    disp_message (WindowHandle, '字符训练失败', 'window', 200, 200, 'black', 'true')
endtry
stop()

猜你喜欢

转载自blog.csdn.net/weixin_43710577/article/details/130007085