设置首页收藏本站
开启左侧

Halcon汉字OCR识别出错

[复制链接]
wh8888 发表于 2024-5-24 13:10:58 | 显示全部楼层 |阅读模式
  1. *实际结果:??文?
  2. *测试结果:文文文?
  3. WindowHandle:=3600
  4. dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
  5. gen_empty_obj (EmptyObject)
  6. read_image (Image, 'test1.jpg')
  7. rgb1_to_gray (Image, GrayImage)
  8. forInt := 1
  9. for Index := 1 to forInt by 1
  10. disp_message (WindowHandle, '请框选单个汉字区域,右键确认:','window', 12, 12, 'yellow', 'false')
  11. **画个矩形
  12. draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
  13. **根据画的矩形生成对应的矩形
  14. gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
  15. *裁出来
  16. reduce_domain (GrayImage, Rectangle, ImageReduced1)


  17. *阈值
  18. threshold (ImageReduced1, Region1, 128, 255)
  19. *开运算,我看这步省了也行
  20. opening_circle (Region1, RegionOpening, 1.5)
  21. *准备接收所有提取的字符区域
  22. concat_obj (EmptyObject, RegionOpening, EmptyObject)
  23. endfor
  24. *字符标识
  25. words:=['文']
  26. *排个序
  27. sort_region (EmptyObject, SortedRegions1, 'character', 'true', 'row')
  28. *创建训练文件
  29. TrainFile:='Test.trf'
  30. *创建OMC文件
  31. FontFlie:='Test.omc'
  32. for Index1:=1 to forInt by 1
  33. select_obj (SortedRegions1, ObjectSelected1, Index1)
  34. *1、定义:向训练文件中添加字符
  35. *append_ocr_trainf(Character, // 选中当前目标
  36. *                  Image, // 目标对应图片
  37. *                  Class, // 字符的类别(名称)
  38. *                  TrainingFile) // 培训文件的名称
  39. *说明
  40. *操作符append_ocr_trainf用于使用操作符trainf_ocr_class_mlp或trainf_ocr_class_svm准备训练
  41. *因此,表示字符的区域,包括其灰度值(区域和像素)和相应的类名将被写入文件。在一个映像中支持任意数量的区域。对于“字符”中的每个字符(区域),必须在“类”中指定相应的类名。灰度值通过参数Image传递
  42. *与操作符write_ocr_trainf不同的是,字符被附加到使用与该文件相同的训练文件格式的现有文件中。如果文件不存在,则生成一个新文件
  43. *在这种情况下,可以通过操作符set_system的参数'ocr_trainf_version'来选择文件格式。如果在TrainingFile中没有指定文件扩展名,则扩展名'。Trf '被加在名字后面
  44. *如果参数正确,操作符append_ocr_trainf返回值TRUE,否则将引发异常
  45. *使用MLP(多层感知器)创建一个OCR分类器。
  46. append_ocr_trainf (ObjectSelected1, Image, words[Index1-1], TrainFile)
  47. endfor
  48. *2、读取训练文件
  49. *定义:查询训练文件中存储的字符
  50. *说明:提取指定训练文件中所有字符的名称和频率
  51. * read_ocr_trainf_names(TrainingFile, // 训练文件名称  .trf
  52. *                      CharacterNames, // 训练字体的名称
  53. *                      CharacterCount) // 训练字体样本的个数
  54. read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)
  55. *创建神经网络分类器mlp
  56. *3、定义:创建一个使用多层感知器(MLP)的OCR分类器,得到OCR分类器的句柄
  57. *create_ocr_class_mlp(WidthCharacter, HeightCharacter, // 识别字符宽度、高度
  58. *                     Interpolation, // 插值算法
  59. *                    Features, // 特征值 (区域特征、灰度值特征   包含曲度、紧密度、凸性等等)
  60. *                     Characters, // 训练样本的名称
  61. *                    NumHidden, // 隐藏层中的单元数
  62. *                     Preprocessing, // 预处理
  63. *                     NumComponents, // 特征变换的数量(特征未规划前的向量数一般为默认值)
  64. *                     RandSeed, // 随机种子点数一般都写42 ,这个是神经网络迭代的过程
  65. *                     OCRHandle) // 句柄
  66. create_ocr_class_mlp (8, 10, 'constant', 'default', [CharacterNames,'?'], 80, 'none', 10, 42, OCRHandle)
  67. set_rejection_params_ocr_class_mlp (OCRHandle, 'sampling_strategy', 'hyperbox_around_all_classes')
  68. set_rejection_params_ocr_class_mlp (OCRHandle, 'rejection_class_index', 1)
  69. *训练
  70. *4、定义:使用TrainingFile提供的OCR训练文件中存储的训练字符训练OCR分类器OCRHandle,输出平均误差与错误
  71. *trainf_ocr_class_mlp(OCRHandle, // 句柄
  72. *                     TrainingFile, // trf文件,ocr.trf
  73. *                     MaxIterations, // 优化算法最大迭代次数 200
  74. *                     WeightTolerance, // 砝码公差 优化算法两次迭代MLP权值差的阈值 1.0
  75. *                     ErrorTolerance, // 错误公差 两次迭代平均误差阈值 0.01
  76. *                     Error, // 训练数据平均误差
  77. *                     ErrorLog) // 算法在训练数据上的平均错误
  78. trainf_ocr_class_mlp (OCRHandle, TrainFile, 200, 1, 0.01, Error, ErrorLog)
  79. *保存训练结果.omc
  80. *5、定义:将OCR分类器OCRHandle写入FileName指定的文件
  81. *write_ocr_class_mlp(OCRHandle, // 需要保存的句柄
  82. *                     FileName) // 路径地址
  83. write_ocr_class_mlp (OCRHandle, FontFlie)
  84. *如果在FileName中没有指定文件扩展名,则默认扩展名'.omc'被附加到FileName
  85. *Write_ocr_class_mlp通常在使用trainf_ocr_class_mlp训练分类器之后调用,可以使用read_ocr_class_mlp读取分类器
  86. *6、定义:清除由create_ocr_class_mlp创建的OCRHandle提供的OCR分类器,并释放分类器所需的所有内存
  87. *说明:调用clear_ocr_class_mlp之后,分类器就不能再使用了,句柄OCRHandle变得无效
  88. clear_ocr_class_mlp (OCRHandle)
  89. *导入另一张做测试的图
  90. read_image (Image1, 'test1.jpg')
  91. gen_rectangle1 (Rectangle, 150, 67, 233, 318)
  92. reduce_domain (Image1, Rectangle, ImageReduced1)
  93. rgb1_to_gray (ImageReduced1, GrayImage)
  94. invert_image (GrayImage, GrayImage)
  95. *二值化
  96. threshold (GrayImage, testwordregion, 0, 60)
  97. *将像素相连的区域合并成一个Element
  98. connection (testwordregion, ConnectedwordRegions)
  99. *筛选符合条件的区域
  100. select_shape (ConnectedwordRegions, SelectedwordRegions, 'height', 'and', 50, 250)
  101. *从左到右,排个序
  102. sort_region (SelectedwordRegions, SortedRegions2, 'upper_left', 'true', 'column')
  103. *数数有几个字
  104. count_obj(SortedRegions2, Number)
  105. *开始识别
  106. read_ocr_class_mlp (FontFlie, OCRHandle1)
  107. * OCR / Neural Nets【神经网络】
  108. * 使用OCR分类器对多个字符进行实例分类
  109. * do_ocr_multi_class_mlp(Character, Image : : OCRHandle : Class, Confidence)
  110. * Character:输入参数,输入需要辨认的字符区域
  111. * Image:输入参数,输入需要辨认字符的灰度值图像
  112. * OCRHandle:输入参数,OCR_mlp分类器的句柄
  113. * Class:输出参数,输出MLP识别对应的结果,该值保存的值为识别出来的字母或者数字或者符号等(数组)。Class == Character
  114. * Confidence:输出参数, 输出对应的特征相似值(数组),该值≤1.0,Confidence == Character
  115. do_ocr_multi_class_mlp (SortedRegions2, GrayImage, OCRHandle1, Class, Confidence)
  116. *显示结果
  117. disp_message(WindowHandle, '识别结果:', 'image', 30, 50, 'white', 'false')
  118. for i:=1 to 4 by 1
  119. disp_message(WindowHandle, Class[i-1], 'image', 30, 120+40*i, 'yellow', 'false')
  120. endfor
复制代码
test1.jpg


奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
新凉无处暑 发表于 2024-5-30 08:59:17 | 显示全部楼层
可以试下,PaddleOCR!识别字符还是比较准确的
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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