【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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

产品初探Devops!以及AI如何赋能Devops?

DevOps源自Development(开发)和Operations(运维)的组合,是一种新的软件工程理念,旨在打破传统软件工程方法中“开发->测试->运维”的割裂模式,强调端到端高效一致的交付流程,实…

python+PyMuPDF库:(一)创建pdf文件及内容读取和写入

目录 文档操作 打开文档 获取文档信息 删除页 复制页 移动页 选择重构合并 保存关闭 页对象操作 内容读取 获取页对象的字体样式 插入文本标签 插入文本内容 字体设置 insert_text添加文本 insert_textbox添加文本 插入图片 获取页面注释、链接、表单字段 …

开源诊断工具Arthas

说明: 1、需要先要安装配置好jdk。 2、你的虚拟机得有网,没有网就按照压缩包上传解压。然后直接看三 一、官网 https://arthas.aliyun.com/doc/quick-start.html#_1-%E5%90%AF%E5%8A%A8-math-game 二、下载和卸载 # 下载 curl -O https://arthas.al…

VisionPro开发使用交互反馈系统(Affordance System)

XR Interaction Toolkit 提供了一个affordance system 可供性系统,使用户能够创建对交互状态的视觉和听觉反馈。一般的信息流从向Affordance State Provider场景中添加一个(通常是可交互的)并将其指向我们要监视其交互状态的可交互对象开始。…

如何在 Ubuntu 22.04 上安装并开始使用 RabbitMQ

简介 消息代理是中间应用程序,在不同服务之间提供可靠和稳定的通信方面发挥着关键作用。它们可以将传入的请求存储在队列中,并逐个提供给接收服务。通过以这种方式解耦服务,你可以使其更具可扩展性和性能。 RabbitMQ 是一种流行的开源消息代…

力扣矩阵-算法模版总结

lc-73.矩阵置零-(时隔14天)-12.27 思路:(23min22s) 1.直接遍历遇0将行列设0肯定不行,会影响后续判断,题目又要求原地算法,那么进一步考虑是否可以将元素为0,其行列需要设为0的位置给存储下来,最后再遍历根据…

OCR实践-问卷表格统计

前言 书接上文 OCR实践—PaddleOCROCR实践-Table-Transformer 本项目代码已开源 放在 Github上,欢迎参考使用,Star https://github.com/caibucai22/TableAnalysisTool 主要功能说明:对手动拍照的问卷图片进行统计分数(对应分数…

yarn list --pattern vuex-module-decorators

dgqdgqdeMac-mini spid-admin % yarn list --pattern vuex-module-decorators yarn list v1.22.22 └─ vuex-module-decorators0.16.1 ✨ Done in 0.24s.好的,这段代码是一个典型的 Vuex 模块定义,使用了 vuex-module-decorators 库。这个库为 Vuex 提…

用Python写炸金花游戏

文章目录 **代码分解与讲解**1. **扑克牌的生成与洗牌**2. **给玩家发牌**3. **打印玩家的手牌**4. **定义牌的优先级**5. **判断牌型**6. **确定牌型优先级**7. **比较两手牌的大小**8. **打印结果** 完整代码 以下游戏规则: 那么我们要实现的功能,就是…

day19-Linux软件包

科普,什么是代码文件。 电脑程序Program,就是某一个编程语言编写的一个代码文件,里面包含了该语言特有的指令,以及各种字符、符号。 linux自带的network管理脚本,shell脚本 什么是软件程序。 软件程序,就…

图像处理-Ch4-频率域处理

Ch4 频率域处理(Image Enhancement in Frequency Domain) FT :将信号表示成各种频率的正弦信号的线性组合。 频谱: ∣ F ( u , v ) ∣ [ R 2 ( u , v ) I 2 ( u , v ) ] 1 2 |F(u, v)| \left[ R^2(u, v) I^2(u, v) \right]^{\frac{1}{2}} ∣F(u,v)…

Vue BPMN Modeler流程图

1、参考地址 git clone https://github.com/evanyangg/vue-bpmn-modeler.git 2、安装bpmn.js npm install bpmn-js --save 3、使用bpmn.js <template><div class"containers"><div class"canvas" ref"canvas"></div&g…

STM32完全学习——FATFS0.15移植SD卡

一、下载FATFS源码 大家都知道使用CubMAX可以很快的将&#xff0c;FATFS文件管理系统移植到单片机上&#xff0c;但是别的芯片没有这么好用的工具&#xff0c;就需要自己从官网下载源码进行移植。我们首先解决SD卡的驱动问题&#xff0c;然后再移植FATFS文件管理系统。 二、SD…

5、栈应用-表达式求值

本章内容使用上述栈结构函数&#xff0c;来完成表达式求值操作。 表达式例如&#xff1a;3*(7-2) 或者 (0-12)*((5-3)*32)/(22) 。 1、实现思路 a、建立OPTR&#xff08;运算符&#xff09;和OPND&#xff08;数字&#xff09;两个栈&#xff0c;后输入字符串以结束 b、自左向…

【递归与回溯深度解析:经典题解精讲(下篇)】—— Leetcode

文章目录 有效的数独解数独单词搜索黄金矿工不同的路径||| 有效的数独 递归解法思路 将每个数独的格子视为一个任务&#xff0c;依次检查每个格子是否合法。 如果当前格子中的数字违反了数独规则&#xff08;在行、列或 33 小方块中重复&#xff09;&#xff0c;直接返回 Fals…

Llama 3 预训练(二)

目录 3. 预训练 3.1 预训练数据 3.1.1 网络数据筛选 PII 和安全过滤 文本提取与清理 去重&#xff08;De-duplication&#xff09; 启发式过滤&#xff08;Heuristic Filtering&#xff09; 基于模型的质量过滤 代码和数学推理数据处理 多语言数据处理 3.1.2 确定数…

双指针——查找总价格为目标值的两个商品

一.题目描述 LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 二.题目解析 这个题目非常简单&#xff0c;其实就是判断有没有两个数加起来等于target。 三.算法解析 1.暴力解法 暴力解法的话我们可以枚举出所有的情况&#xff0c;然后判…

sqlserver镜像设置

本案例是双机热备&#xff0c;只设置主体服务器&#xff08;主&#xff09;和镜像服务器&#xff08;从&#xff09;&#xff0c;不设置见证服务器 设置镜像前先检查是否启用了 主从服务器数据库的 TCP/IP协议 和 RemoteDAC &#xff08;1&#xff09;打开SQL Server配置管理器…

Elasticsearch:analyzer(分析器)

一、概述 可用于将字符串字段转换为单独的术语&#xff1a; 添加到倒排索引中&#xff0c;以便文档可搜索。级查询&#xff08;如 生成搜索词的 match查询&#xff09;使用。 分析器分为内置分析器和自定义的分析器&#xff0c;它们都是由若干个字符过滤器&#xff08;chara…

ElementPlus 自定义封装 el-date-picker 的快捷功能

文章目录 需求分析 需求 分析 我们看到官网上给出的案例如下&#xff0c;但是不太满足我们用户想要的快捷功能&#xff0c;因为不太多&#xff0c;因此需要我们自己封装一些&#xff0c;方法如下 外部自定义该组件的快捷内容 export const getPickerOptions () > {cons…