【Halcon】例程讲解:基于形状匹配与OCR的多图像处理(附图像、程序下载链接)

1. 开发需求
  • 在参考图像中定义感兴趣区域(ROI),用于形状匹配和文本识别。
  • 通过形状匹配找到图像中的目标对象位置。
  • 对齐多幅输入图像,使其与参考图像保持一致。
  • 在对齐后的图像上进行OCR识别,提取文本和数字信息。
  • 以循环方式批量处理多张图像。

2. 程序逻辑与流程
(1)程序思路流程

程序整体流程分为以下几个主要步骤:

  1. 初始化模块

    • 关闭窗口自动刷新、加载参考图像、初始化显示环境。
    • 显示交互式提示信息。
  2. 定义ROI模块

    • 定义两个感兴趣区域:
      • 模型ROI:用于裁剪图像,供形状匹配模型使用。
      • 文本ROI:用于OCR识别,定位目标文本区域。
  3. 模型创建模块

    • 创建并训练形状匹配模型,用于后续的目标匹配与定位。
    • 加载OCR模型,支持对文本和数字的识别。
  4. 形状匹配与对齐模块

    • 在参考图像中,利用形状匹配找到目标位置,获取其变换矩阵。
    • 在多张输入图像中重复上述过程,并对图像进行对齐。
  5. OCR识别模块

    • 在对齐后的图像中,裁剪文本ROI,并使用OCR模型提取文本。
  6. 循环处理模块

    • 通过循环批量处理多张图像,逐一完成形状匹配、图像对齐和OCR识别。
  7. 程序结束

    • 显示完成提示,并关闭窗口,释放资源。
(2)流程图

以下是程序的流程图,展示了程序的逻辑和模块的操作步骤:

+-------------------------+
|    初始化与加载图像     |
+-----------+-------------++--------------------------+
|     定义模型与文本ROI    |
+-----------+-------------++--------------------------+
|     创建并训练形状模型    |
|     加载OCR识别模型      |
+-----------+-------------++--------------------------+
| 在参考图像中匹配目标并获取 |
|     变换矩阵 (HomMat2D)   |
+-----------+-------------++--------------------------+
|   循环处理多张图像       |
| 1. 加载图像              |
| 2. 形状匹配,计算变换矩阵 |
| 3. 图像对齐              |
| 4. OCR文本识别           |
| 5. 显示匹配与识别结果     |
+-----------+-------------++--------------------------+
|       显示完成提示       |
|        结束程序          |
+--------------------------+

3. 程序功能实现与代码讲解
模块划分与关键代码
(1)初始化模块

在程序的开头,我们需要完成以下工作:

  • 关闭窗口自动刷新和已有窗口资源。
  • 加载参考图像并获取其尺寸,用于初始化显示窗口。
  • 显示操作提示信息,为用户提供交互式说明。

关键代码:

dev_update_window ('off')   
dev_close_window ()         
read_image (ReferenceImage, 'board/board_01')  
get_image_size (ReferenceImage, Width, Height)  
initialize_visualization (Width / 2, Height / 2, WindowHandle, WindowHandleText)  
disp_continue_message (WindowHandle, 'black', 'true')  
disp_description_text (WindowHandleText)  

(2)定义ROI模块

ROI(Region of Interest,感兴趣区域)分为两部分:

  • 模型ROI: 用于裁剪参考图像,提取目标对象的形状信息,供形状匹配模型使用。
  • 文本ROI: 用于OCR识别,定位目标文本区域。

关键代码:

gen_rectangle1 (ROIModel, 60, 535, 185, 900)  
* 定义模型区域ROI,用于形状匹配

gen_rectangle1 (ROIText, 445, 585, 590, 765)  
* 定义文本识别区域ROI,用于OCR

(3)模型创建模块

在参考图像中,我们基于模型ROI裁剪图像,提取目标区域的形状信息。之后,通过 create_generic_shape_modeltrain_generic_shape_model 创建并训练形状模型。

同时,加载OCR模型,后续将用于文本识别。

关键代码:

reduce_domain (ReferenceImage, ROIModel, ModelImage)  
create_generic_shape_model (ModelHandle)  
train_generic_shape_model (ModelImage, ModelHandle)  

create_text_model_reader ('auto', 'Industrial_0-9A-Z_Rej.omc', TextModel)  
* 加载工业字体OCR模型

(4)形状匹配与对齐模块
  • 在参考图像中,通过形状匹配找到目标对象,获取其位置信息和变换矩阵。
  • 在输入图像中重复形状匹配,并结合参考图像的变换矩阵对图像进行对齐。

对齐操作的核心是变换矩阵的计算与应用。通过矩阵反转和组合,完成从输入图像到参考图像的对齐。

关键代码:

find_generic_shape_model (ReferenceImage, ModelHandle, MatchResultID, Matches)  
get_generic_shape_model_result (MatchResultID, 'all', 'hom_mat_2d', HomMat2DModel)  
* 获取参考图像中目标的位置和变换矩阵

find_generic_shape_model (SearchImage, ModelHandle, MatchResultID, Matches)  
get_generic_shape_model_result (MatchResultID, 'all', 'hom_mat_2d', HomMat2DMatch)  

hom_mat2d_invert (HomMat2DMatch, HomMat2DMatchInvert)  
* 计算逆变换矩阵

hom_mat2d_compose (HomMat2DModel, HomMat2DMatchInvert, TransformationMatrix)  
affine_trans_image (SearchImage, ImageAffineTrans, TransformationMatrix, 'constant', 'false')  
* 对当前图像进行对齐

(5)OCR识别模块

在对齐后的图像上,使用OCR模型提取文本信息:

  • 裁剪对齐图像到文本ROI。
  • 使用 find_text 查找文本对象,并获取识别结果。
  • 显示识别的字符区域和对应的文本。

关键代码:

reduce_domain (ImageAffineTrans, ROIText, ImageOCR)  
find_text (ImageOCR, TextModel, TextResultID)  
* 使用OCR识别对齐图像中的文本

get_text_object (Characters, TextResultID, 'all_lines')  
get_text_result (TextResultID, 'class', RecognizedText)  

disp_finding_text (Characters, WindowHandle, WindowHandleText, RecognizedText)  
* 显示识别的文本结果

(6)循环处理模块

利用 for 循环,实现多张图像的批量处理。每次循环中:

  1. 加载输入图像。
  2. 执行形状匹配,计算变换矩阵。
  3. 对齐图像,并在对齐后进行OCR识别。
  4. 显示识别结果。

关键代码:

for i := 1 to 9 by 1  
    read_image (SearchImage, 'board/board_' + i$'02')  
    * 读取序列图像

    find_generic_shape_model (SearchImage, ModelHandle, MatchResultID, Matches)  
    affine_trans_image (SearchImage, ImageAffineTrans, TransformationMatrix, 'constant', 'false')  

    reduce_domain (ImageAffineTrans, ROIText, ImageOCR)  
    find_text (ImageOCR, TextModel, TextResultID)  

    disp_finding_text (Characters, WindowHandle, WindowHandleText, RecognizedText)  
    * 显示识别的文本结果
endfor  

4. 总结

本程序通过模块化设计,实现了从形状匹配到OCR文本识别的完整流程:

  • 利用形状匹配技术,完成图像的精确对齐。
  • 结合OCR模型,提取对齐图像中的文本信息。
  • 支持批量图像处理,适合工业检测和自动化识别场景。
5. 下载链接
通过网盘分享的文件:主板文本检测(模板匹配+OCR)
链接: https://pan.baidu.com/s/16bGZs9B9xLrdW64jHvTqEg?pwd=jkcf 提取码: jkcf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/944108.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快速理解24种设计模式

简单工厂模式 建立产品接口类,规定好要实现方法。 建立工厂类,根据传入的参数,实例化所需的类,实例化的类必须实现指定的产品类接口 创建型 单例模式Singleton 保证一个类只有一个实例,并提供一个访问他它的全局…

CKA认证 | Day7 K8s存储

第七章 Kubernetes存储 1、数据卷与数据持久卷 为什么需要数据卷? 容器中的文件在磁盘上是临时存放的,这给容器中运行比较重要的应用程序带来一些问题。 问题1:当容器升级或者崩溃时,kubelet会重建容器,容器内文件会…

【JavaEE进阶】@RequestMapping注解

目录 📕前言 🌴项目准备 🌲建立连接 🚩RequestMapping注解 🚩RequestMapping 注解介绍 🎄RequestMapping是GET还是POST请求? 🚩通过Fiddler查看 🚩Postman查看 …

ROUGE指标在自然语言处理中的应用:从理论到实践

引言 你是否曾经遇到过机器生成的文本摘要与原文内容不符的情况?或者在使用机器翻译时,发现译文虽然“看起来”正确,但语义却与原文相差甚远?在自然语言处理(NLP)领域,如何科学地评估生成文本的…

编译openssl遇到错误Parse errors: No plan found in TAP output的解决方法

在编译openssl时 tar -zxvf openssl-1.1.1p.tar.gz cd openssl-1.1.1p ./config --prefix/usr --openssldir/etc/ssl --shared zlib make make test 遇到错误 Parse errors: No plan found in TAP output 解决方法: yum install perl-Test-Simple

Visual Studio 2017 配置 OpenCV 4.5.5 及二次配置的导入

重点参考: Visual Studio 2017 OpenCV_4.5.0安装_opencv4.5.0下载-CSDN博客 VS2017配置OpenCV4.5_vs2017 opencv4.5.4-CSDN博客 下载准备工作就不说了,直接从官网下载就行了。 关键就两步: 1)将OpenCV的bin目录添加到环境变量…

42 模板进阶

目录 一、非类型形参 (一)简介 (二)非类型形参与宏的区别 (三)注意点 二、模板的特化 (一)概念 (二)函数模板的特化 (三&#xff…

接口测试面试题

接口测试在软件测试中占据重要位置,无论是功能测试还是性能测试,接口的稳定性至关重要。以下总结了一些常见的接口测试面试题,帮助你从容应对面试挑战! 面试官常说:“接口测试是测试的重头戏,了解接口的设计…

使用ArcGIS/ArcGIS pro绘制六边形/三角形/菱形渔网图

在做一些尺度分析时,经常会涉及到对研究区构建不同尺度的渔网进行分析,渔网的形状通常为规则四边形。构建渔网的方法也很简单,使用ArcGIS/ArcGIS Pro工具箱中的【创建渔网/CreateFishnet】工具来构建。但如果想构建其他形状渔网进行相关分析&…

在Linux上获取MS(如Media Server)中的RTP流并录制为双轨PCM格式的WAV文件

在Linux上获取MS(如Media Server)中的RTP流并录制为双轨PCM格式的WAV文件 一、RTP流与WAV文件格式二、实现步骤三、伪代码示例四、C语言示例代码五、关键点说明六、总结在Linux操作系统上,从媒体服务器(如Media Server,简称MS)获取RTP(Real-time Transport Protocol)流…

Docker 是什么? Docker 基本观念介绍与容器和虚拟机的比较

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:历代文学,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计&#xf…

Wend看源码-Java-集合学习(List)

摘要 本篇文章深入探讨了基于JDK 21版本的Java.util包中提供的多样化集合类型。在Java中集合共分类为三种数据结构:List、Set和Queue。本文将详细阐述这些数据类型的各自实现,并按照线程安全性进行分类,分别介绍非线程安全与线程安全的实现方…

人工智能知识分享第二天-机器学习之KNN算法

KNN算法 KNN算法简介 KNN算法思想 K-近邻算法(K Nearest Neighbor,简称KNN)。比如:根据你的“邻居”来推断出你的类别 KNN算法思想:如果一个样本在特征空间中的 k 个最相似的样本中的大多数属于某一个类别&#xff…

b站ip属地评论和主页不一样怎么回事

在浏览B站时,细心的用户可能会发现一个有趣的现象:某些用户的评论IP属地与主页显示的IP属地并不一致。这种差异引发了用户的好奇和猜测,究竟是什么原因导致了这种情况的发生呢?本文将对此进行深入解析,帮助大家揭开这一…

Robyn+Vue3+wangEditor打造个人笔记

Github:https://github.com/gwt805/MYNotes Gitee: https://gitee.com/gwt805/MYNotes GitCode: https://gitcode.com/gwt805/MYNotes/overview

BGP路由反射器,解决路由黑洞问题

路由反射器解决路由黑洞问题 路由反射器解决路由黑洞问题 路由黑洞的产生路由黑洞的解决办法路由反射器解决黑洞问题基本配置配置反射器前查看路由配置路由反射器配置反射器后查看路由路由黑洞的产生 根据BGP建立邻居的规则,只要TCP可达便可建立邻居系。如下图所示: AR2、AR…

JavaFX FXML模式下的布局

常见布局方式概述 在 JavaFX FXML 模式下,有多种布局方式可供选择。这些布局方式可以帮助您有效地组织和排列 UI 组件,以创建出美观且功能良好的用户界面。常用布局容器及布局方式 BorderPane 布局 特点:BorderPane 将空间划分为五个区域&…

二叉树的深搜_求根节点到叶节点数字之和_验证二叉搜索树_二叉树的所有路径

2331. 计算布尔二叉树的值 二叉树遍历可以用递归来解决,该问题的简单子问题是 知道左右孩子的值,再根据| &返回true/false。左子树右子树的值交给dfs解决。 终止条件就是到达叶子节点,即没有左右孩子,因为是完全二叉树 所以只需要判断一个…

Jupyter占用内存高问题排查解决

前言 前段时间我们上线了实例内存预警功能,方便大家更好地管理服务器内存资源。那么,也有同学会问,如果收到系统通知,我该怎么做呢?系统提示交换内存占用过高,但是又不知道是哪些程序占用的,怎么…

python下载,安装,环境配置

下载地址:Python Windows版本下载| Python中文网 官网 选择路径 安装完成 检测安装是否成功 使用 winr 启动运行对话框,输入 cmd 进入命令行。 输入pip list 输入 where python 查看 python.exe 的路径 环境配置 winr 打开运行对话框,输入 …