一张图像上有四个汉字,只训练一个为什么后三个和第一个汉字相同
- WindowHandle:=3600
- dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
- gen_empty_obj (EmptyObject)
- read_image (Image, 'test1.jpg')
- rgb1_to_gray (Image, GrayImage)
- for Index := 1 to 1 by 1
- disp_message (WindowHandle, '请框选单个汉字区域,右键确认:','window', 12, 12, 'yellow', 'false')
- **画个矩形
- draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
- **根据画的矩形生成对应的矩形
- gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
- *裁出来
- reduce_domain (GrayImage, Rectangle, ImageReduced1)
- *阈值
- threshold (ImageReduced1, Region1, 128, 255)
- *开运算,我看这步省了也行
- opening_circle (Region1, RegionOpening, 1.5)
- *准备接收所有提取的字符区域
- concat_obj (EmptyObject, RegionOpening, EmptyObject)
- endfor
- *字符标识
- words:=['测']
- *排个序
- sort_region (EmptyObject, SortedRegions1, 'character', 'true', 'row')
- *创建训练文件
- TrainFile:='TEST.trf'
- *创建OMC文件
- FontFlie:='TEST.omc'
- for Index1:=1 to 1 by 1
- select_obj (SortedRegions1, ObjectSelected1, Index1)
- *1、定义:向训练文件中添加字符
- *append_ocr_trainf(Character, // 选中当前目标
- * Image, // 目标对应图片
- * Class, // 字符的类别(名称)
- * TrainingFile) // 培训文件的名称
- *说明
- *操作符append_ocr_trainf用于使用操作符trainf_ocr_class_mlp或trainf_ocr_class_svm准备训练
- *因此,表示字符的区域,包括其灰度值(区域和像素)和相应的类名将被写入文件。在一个映像中支持任意数量的区域。对于“字符”中的每个字符(区域),必须在“类”中指定相应的类名。灰度值通过参数Image传递
- *与操作符write_ocr_trainf不同的是,字符被附加到使用与该文件相同的训练文件格式的现有文件中。如果文件不存在,则生成一个新文件
- *在这种情况下,可以通过操作符set_system的参数'ocr_trainf_version'来选择文件格式。如果在TrainingFile中没有指定文件扩展名,则扩展名'。Trf '被加在名字后面
- *如果参数正确,操作符append_ocr_trainf返回值TRUE,否则将引发异常
- *使用MLP(多层感知器)创建一个OCR分类器。
- append_ocr_trainf (ObjectSelected1, Image, words[Index1-1], TrainFile)
- endfor
- *2、读取训练文件
- *定义:查询训练文件中存储的字符
- *说明:提取指定训练文件中所有字符的名称和频率
- * read_ocr_trainf_names(TrainingFile, // 训练文件名称 .trf
- * CharacterNames, // 训练字体的名称
- * CharacterCount) // 训练字体样本的个数
- read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)
- *创建神经网络分类器mlp
- *3、定义:创建一个使用多层感知器(MLP)的OCR分类器,得到OCR分类器的句柄
- *create_ocr_class_mlp(WidthCharacter, HeightCharacter, // 识别字符宽度、高度
- * Interpolation, // 插值算法
- * Features, // 特征值 (区域特征、灰度值特征 包含曲度、紧密度、凸性等等)
- * Characters, // 训练样本的名称
- * NumHidden, // 隐藏层中的单元数
- * Preprocessing, // 预处理
- * NumComponents, // 特征变换的数量(特征未规划前的向量数一般为默认值)
- * RandSeed, // 随机种子点数一般都写42 ,这个是神经网络迭代的过程
- * OCRHandle) // 句柄
- create_ocr_class_mlp (8, 10, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle)
- *训练
- *4、定义:使用TrainingFile提供的OCR训练文件中存储的训练字符训练OCR分类器OCRHandle,输出平均误差与错误
- *trainf_ocr_class_mlp(OCRHandle, // 句柄
- * TrainingFile, // trf文件,ocr.trf
- * MaxIterations, // 优化算法最大迭代次数 200
- * WeightTolerance, // 砝码公差 优化算法两次迭代MLP权值差的阈值 1.0
- * ErrorTolerance, // 错误公差 两次迭代平均误差阈值 0.01
- * Error, // 训练数据平均误差
- * ErrorLog) // 算法在训练数据上的平均错误
- trainf_ocr_class_mlp (OCRHandle, TrainFile, 200, 1, 0.01, Error, ErrorLog)
- *保存训练结果.omc
- *5、定义:将OCR分类器OCRHandle写入FileName指定的文件
- *write_ocr_class_mlp(OCRHandle, // 需要保存的句柄
- * FileName) // 路径地址
- write_ocr_class_mlp (OCRHandle, FontFlie)
- *如果在FileName中没有指定文件扩展名,则默认扩展名'.omc'被附加到FileName
- *Write_ocr_class_mlp通常在使用trainf_ocr_class_mlp训练分类器之后调用,可以使用read_ocr_class_mlp读取分类器
- *6、定义:清除由create_ocr_class_mlp创建的OCRHandle提供的OCR分类器,并释放分类器所需的所有内存
- *说明:调用clear_ocr_class_mlp之后,分类器就不能再使用了,句柄OCRHandle变得无效
- clear_ocr_class_mlp (OCRHandle)
- WindowHandle:=3600
- dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
- *导入另一张做测试的图
- read_image (Image1, 'test1.jpg')
- *二值化
- threshold (Image1, testwordregion, 125, 255)
- *将像素相连的区域合并成一个Element
- connection (testwordregion, ConnectedwordRegions)
- *筛选符合条件的区域
- select_shape (ConnectedwordRegions, SelectedwordRegions, 'height', 'and', 50, 250)
- *从左到右,排个序
- sort_region (SelectedwordRegions, SortedRegions2, 'upper_left', 'true', 'column')
- *数数有几个字
- count_obj(SortedRegions2, Number)
- *创建OMC文件
- FontFlie:='TEST.omc'
- *开始识别
- read_ocr_class_mlp (FontFlie, OCRHandle1)
- * 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
- do_ocr_multi_class_mlp (SortedRegions2, Image1, OCRHandle1, Class, Confidence)
- *显示结果
- disp_message(WindowHandle, '识别结果:', 'image', 30, 50, 'white', 'false')
- for i:=1 to 4 by 1
- disp_message(WindowHandle, Class[i-1], 'image', 30, 120+40*i, 'yellow', 'false')
- endfor
复制代码
|