设为首页收藏本站
授权版本:2024_07
开启左侧

Halcon汉字OCR训练识别

[复制链接]
wh8888 发表于 2024-5-23 14:38:54 | 显示全部楼层 |阅读模式
一张图像上有四个汉字,只训练一个为什么后三个和第一个汉字相同
  1. WindowHandle:=3600
  2. dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
  3. gen_empty_obj (EmptyObject)
  4. read_image (Image, 'test1.jpg')
  5. rgb1_to_gray (Image, GrayImage)

  6. for Index := 1 to 1 by 1
  7. disp_message (WindowHandle, '请框选单个汉字区域,右键确认:','window', 12, 12, 'yellow', 'false')

  8. **画个矩形
  9. draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)

  10. **根据画的矩形生成对应的矩形
  11. gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)

  12. *裁出来
  13. reduce_domain (GrayImage, Rectangle, ImageReduced1)

  14. *阈值
  15. threshold (ImageReduced1, Region1, 128, 255)

  16. *开运算,我看这步省了也行
  17. opening_circle (Region1, RegionOpening, 1.5)

  18. *准备接收所有提取的字符区域
  19. concat_obj (EmptyObject, RegionOpening, EmptyObject)

  20. endfor
  21. *字符标识
  22. words:=['测']
  23. *排个序
  24. sort_region (EmptyObject, SortedRegions1, 'character', 'true', 'row')
  25. *创建训练文件
  26. TrainFile:='TEST.trf'
  27. *创建OMC文件
  28. FontFlie:='TEST.omc'

  29. for Index1:=1 to 1 by 1
  30. select_obj (SortedRegions1, ObjectSelected1, Index1)
  31. *1、定义:向训练文件中添加字符
  32. *append_ocr_trainf(Character, // 选中当前目标
  33. *                  Image, // 目标对应图片
  34. *                  Class, // 字符的类别(名称)
  35. *                  TrainingFile) // 培训文件的名称
  36. *说明
  37. *操作符append_ocr_trainf用于使用操作符trainf_ocr_class_mlp或trainf_ocr_class_svm准备训练
  38. *因此,表示字符的区域,包括其灰度值(区域和像素)和相应的类名将被写入文件。在一个映像中支持任意数量的区域。对于“字符”中的每个字符(区域),必须在“类”中指定相应的类名。灰度值通过参数Image传递
  39. *与操作符write_ocr_trainf不同的是,字符被附加到使用与该文件相同的训练文件格式的现有文件中。如果文件不存在,则生成一个新文件
  40. *在这种情况下,可以通过操作符set_system的参数'ocr_trainf_version'来选择文件格式。如果在TrainingFile中没有指定文件扩展名,则扩展名'。Trf '被加在名字后面
  41. *如果参数正确,操作符append_ocr_trainf返回值TRUE,否则将引发异常

  42. *使用MLP(多层感知器)创建一个OCR分类器。
  43. append_ocr_trainf (ObjectSelected1, Image, words[Index1-1], TrainFile)
  44. endfor
  45. *2、读取训练文件
  46. *定义:查询训练文件中存储的字符
  47. *说明:提取指定训练文件中所有字符的名称和频率
  48. * read_ocr_trainf_names(TrainingFile, // 训练文件名称  .trf
  49. *                      CharacterNames, // 训练字体的名称
  50. *                      CharacterCount) // 训练字体样本的个数
  51. read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)
  52. *创建神经网络分类器mlp
  53. *3、定义:创建一个使用多层感知器(MLP)的OCR分类器,得到OCR分类器的句柄
  54. *create_ocr_class_mlp(WidthCharacter, HeightCharacter, // 识别字符宽度、高度
  55. *                     Interpolation, // 插值算法
  56. *                    Features, // 特征值 (区域特征、灰度值特征   包含曲度、紧密度、凸性等等)
  57. *                     Characters, // 训练样本的名称
  58. *                    NumHidden, // 隐藏层中的单元数
  59. *                     Preprocessing, // 预处理
  60. *                     NumComponents, // 特征变换的数量(特征未规划前的向量数一般为默认值)
  61. *                     RandSeed, // 随机种子点数一般都写42 ,这个是神经网络迭代的过程
  62. *                     OCRHandle) // 句柄
  63. create_ocr_class_mlp (8, 10, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle)
  64. *训练
  65. *4、定义:使用TrainingFile提供的OCR训练文件中存储的训练字符训练OCR分类器OCRHandle,输出平均误差与错误
  66. *trainf_ocr_class_mlp(OCRHandle, // 句柄
  67. *                     TrainingFile, // trf文件,ocr.trf
  68. *                     MaxIterations, // 优化算法最大迭代次数 200
  69. *                     WeightTolerance, // 砝码公差 优化算法两次迭代MLP权值差的阈值 1.0
  70. *                     ErrorTolerance, // 错误公差 两次迭代平均误差阈值 0.01
  71. *                     Error, // 训练数据平均误差
  72. *                     ErrorLog) // 算法在训练数据上的平均错误
  73. trainf_ocr_class_mlp (OCRHandle, TrainFile, 200, 1, 0.01, Error, ErrorLog)
  74. *保存训练结果.omc
  75. *5、定义:将OCR分类器OCRHandle写入FileName指定的文件
  76. *write_ocr_class_mlp(OCRHandle, // 需要保存的句柄
  77. *                     FileName) // 路径地址
  78. write_ocr_class_mlp (OCRHandle, FontFlie)
  79. *如果在FileName中没有指定文件扩展名,则默认扩展名'.omc'被附加到FileName
  80. *Write_ocr_class_mlp通常在使用trainf_ocr_class_mlp训练分类器之后调用,可以使用read_ocr_class_mlp读取分类器
  81. *6、定义:清除由create_ocr_class_mlp创建的OCRHandle提供的OCR分类器,并释放分类器所需的所有内存
  82. *说明:调用clear_ocr_class_mlp之后,分类器就不能再使用了,句柄OCRHandle变得无效
  83. clear_ocr_class_mlp (OCRHandle)


  84. WindowHandle:=3600
  85. dev_open_window (0, 0, 512, 512, 'black', WindowHandle)

  86. *导入另一张做测试的图
  87. read_image (Image1, 'test1.jpg')

  88. *二值化
  89. threshold (Image1, testwordregion, 125, 255)

  90. *将像素相连的区域合并成一个Element
  91. connection (testwordregion, ConnectedwordRegions)

  92. *筛选符合条件的区域
  93. select_shape (ConnectedwordRegions, SelectedwordRegions, 'height', 'and', 50, 250)

  94. *从左到右,排个序
  95. sort_region (SelectedwordRegions, SortedRegions2, 'upper_left', 'true', 'column')

  96. *数数有几个字
  97. count_obj(SortedRegions2, Number)
  98. *创建OMC文件
  99. FontFlie:='TEST.omc'
  100. *开始识别
  101. read_ocr_class_mlp (FontFlie, OCRHandle1)
  102. * OCR / Neural Nets【神经网络】
  103. * 使用OCR分类器对多个字符进行实例分类
  104. * do_ocr_multi_class_mlp(Character, Image : : OCRHandle : Class, Confidence)
  105. * Character:输入参数,输入需要辨认的字符区域
  106. * Image:输入参数,输入需要辨认字符的灰度值图像
  107. * OCRHandle:输入参数,OCR_mlp分类器的句柄
  108. * Class:输出参数,输出MLP识别对应的结果,该值保存的值为识别出来的字母或者数字或者符号等(数组)。Class == Character
  109. * Confidence:输出参数, 输出对应的特征相似值(数组),该值≤1.0,Confidence == Character
  110. do_ocr_multi_class_mlp (SortedRegions2, Image1, OCRHandle1, Class, Confidence)

  111. *显示结果
  112. disp_message(WindowHandle, '识别结果:', 'image', 30, 50, 'white', 'false')

  113. for i:=1 to 4 by 1
  114. disp_message(WindowHandle, Class[i-1], 'image', 30, 120+40*i, 'yellow', 'false')
  115. endfor
复制代码
test1.jpg
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
halcon2016 发表于 2024-5-23 21:36:51 | 显示全部楼层
本帖最后由 halcon2016 于 2024-5-23 21:47 编辑

WindowHandle:=3600
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
gen_empty_obj (EmptyObject)
read_image (Image, 'C:/Users/Administrator/Desktop/144739a0qjrr0z3n6lqjn7.jpg')
rgb1_to_gray (Image, GrayImage)
invert_image (GrayImage, 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, 0, 60)
*开运算,我看这步省了也行
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)
append_ocr_trainf (ObjectSelected1, GrayImage, words[Index1-1], TrainFile)
endfor
read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)
create_ocr_class_mlp (8, 10, 'constant', 'default', [CharacterNames,'?'], 80, 'none', 10, 42, OCRHandle)
set_rejection_params_ocr_class_mlp (OCRHandle, 'sampling_strategy', 'hyperbox_around_all_classes')
set_rejection_params_ocr_class_mlp (OCRHandle, 'rejection_class_index', 1)
trainf_ocr_class_mlp (OCRHandle, TrainFile, 200, 1, 0.01, Error, ErrorLog)
write_ocr_class_mlp (OCRHandle, FontFlie)
clear_ocr_class_mlp (OCRHandle)
WindowHandle:=3600
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*导入另一张做测试的图
read_image (Image1, 'C:/Users/Administrator/Desktop/144739a0qjrr0z3n6lqjn7.jpg')
*二值化
threshold (GrayImage, testwordregion, 0, 60)
*将像素相连的区域合并成一个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)
do_ocr_multi_class_mlp (SortedRegions2, GrayImage, 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
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复 支持 1 反对 0

使用道具 举报

halcon2016 发表于 2024-5-23 21:43:59 | 显示全部楼层
1、需要白底黑字
2、设置拒绝类
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| wh8888 发表于 2024-5-24 09:20:33 | 显示全部楼层
halcon2016 发表于 2024-5-23 21:43
1、需要白底黑字
2、设置拒绝类

只培训文字结果是??文?
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表