【Halcon】例程讲解:基于形状匹配与OCR的多图像处理(附图像、程序下载链接)
1. 开发需求
- 在参考图像中定义感兴趣区域(ROI),用于形状匹配和文本识别。
- 通过形状匹配找到图像中的目标对象位置。
- 对齐多幅输入图像,使其与参考图像保持一致。
- 在对齐后的图像上进行OCR识别,提取文本和数字信息。
- 以循环方式批量处理多张图像。
2. 程序逻辑与流程
(1)程序思路流程
程序整体流程分为以下几个主要步骤:
-
初始化模块
- 关闭窗口自动刷新、加载参考图像、初始化显示环境。
- 显示交互式提示信息。
-
定义ROI模块
- 定义两个感兴趣区域:
- 模型ROI:用于裁剪图像,供形状匹配模型使用。
- 文本ROI:用于OCR识别,定位目标文本区域。
- 定义两个感兴趣区域:
-
模型创建模块
- 创建并训练形状匹配模型,用于后续的目标匹配与定位。
- 加载OCR模型,支持对文本和数字的识别。
-
形状匹配与对齐模块
- 在参考图像中,利用形状匹配找到目标位置,获取其变换矩阵。
- 在多张输入图像中重复上述过程,并对图像进行对齐。
-
OCR识别模块
- 在对齐后的图像中,裁剪文本ROI,并使用OCR模型提取文本。
-
循环处理模块
- 通过循环批量处理多张图像,逐一完成形状匹配、图像对齐和OCR识别。
-
程序结束
- 显示完成提示,并关闭窗口,释放资源。
(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_model
和 train_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
循环,实现多张图像的批量处理。每次循环中:
- 加载输入图像。
- 执行形状匹配,计算变换矩阵。
- 对齐图像,并在对齐后进行OCR识别。
- 显示识别结果。
关键代码:
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
相关文章:

【Halcon】例程讲解:基于形状匹配与OCR的多图像处理(附图像、程序下载链接)
1. 开发需求 在参考图像中定义感兴趣区域(ROI),用于形状匹配和文本识别。通过形状匹配找到图像中的目标对象位置。对齐多幅输入图像,使其与参考图像保持一致。在对齐后的图像上进行OCR识别,提取文本和数字信息。以循环…...

B站推荐模型数据流的一致性架构
01 背景 推荐系统的模型,通过学习用户历史行为来达到个性化精准推荐的目的,因此模型训练依赖的样本数据,需要包括用户特征、服务端推荐的视频特征,以及用户在推荐视频上是否有一系列的消费行为。 推荐模型数据流,即为…...

不安全物联网的轻量级加密:综述
Abstract 本文综述了针对物联网(IoT)的轻量级加密解决方案。这项综述全面覆盖了从轻量级加密方案到不同类型分组密码的比较等多个方面。同时,还对硬件与软件解决方案之间的比较进行了讨论,并分析了当前最受信赖且研究最深入的分组…...
mysql_init的概念和使用案例
mysql_init 是 MySQL C API 中的一个函数,用于初始化一个 MYSQL 结构,这个结构在后续的 MySQL 数据库操作中会被频繁使用。mysql_init 的调用是建立与 MySQL 数据库连接的第一步。 函数原型: MYSQL *mysql_init(MYSQL *mysql);参数说明&…...

3GPP R18 MT-SDT
Rel-17 指定MO-SDT允许针对UL方向的数据包进行小数据包传输。对于DL,MT-SDT(即DL触发的小数据)可带来类似的好处,即 通过不转换到 RRC_CONNECTED来减少信令开销和UE功耗,并通过允许快速传输(小而少见的)数据包(例如用于定位)来减少延迟。 在R17中,NR_SmallData_INACTIVE的工…...

时频转换 | Matlab暂态提取变换transient-extracting transform一维数据转二维图像方法
目录 基本介绍程序设计参考资料获取方式 基本介绍 时频转换 | Matlab暂态提取变换transient-extracting transform一维数据转二维图像方法 程序设计 clear clc % close all load x.mat % 导入数据 x x(1:5120); % 本数据只选择5120个点进行分析 fs 6400 ; % 数据采样频…...
.NET Framework 逐渐过时,.NET 8和 .NET 9引领未来
随着科技的不断进步,软件开发的工具和技术也在不断更新换代。.NET Framework,曾是微软的旗舰开发平台,曾经在软件开发领域占据了主导地位。然而,随着技术的演变和开发需求的变化,.NET Framework逐渐显得力不从心&#…...

从虚拟到现实:AI与AR/VR技术如何改变体验经济?
引言:体验经济的崛起 在当今消费环境中,产品与服务早已不再是市场竞争的唯一焦点,能够提供深刻感知和独特体验的品牌,往往更能赢得消费者的青睐。这种转变标志着体验经济的崛起。体验经济不仅仅是简单的买卖行为,而是通…...
在K8S中,Ingress该如何使用?
在Kubernetes中,Ingress是一种API对象,它提供了对外部请求进入集群内部服务的一种统一入口和路由机制。Ingress控制器是一个运行在集群中的守护进程,它监听Ingress对象的变化并配置相应的负载均衡器或代理服务,以便根据定义的规则…...

Ubuntu24.04安装NVIDIA驱动及工具包
Ubuntu24.04安装NVIDIA驱动及工具包 安装nvidia显卡驱动安装cuda驱动安装cuDNN安装Anaconda 安装nvidia显卡驱动 NVIDIA 驱动程序(NVIDIA Driver)是专为 NVIDIA 图形处理单元(GPU)设计的软件,它充当操作系统与硬件之间…...
【每日学点鸿蒙知识】组件封装通用方法、callback和await性能对比、Web组件下拉刷新、hsp包报错、WebView圆角
1、HarmonyOS 自定义的组件如何封装一些通用的属性和方法,例如 Java 中的继承? export class Animal{name:stringage:stringconstructor(name:string,age:string) {this.name namethis.age age} }export class Person extends Animal{reading:stri…...

Excel批量设置行高,Excel表格设置自动换行后打印显示不全,Excel表格设置最合适的行高后打印显示不全,完美解决方案!!!
文章目录 说个问题(很严重!!!)写个方案会Python看这里Python环境搭建不存在多行合并存在多行合并 不会Python看这里 说个问题(很严重!!!) 平时处理Excel表格…...

Web Bluetooth API 开发记录
搞了一天的蓝牙串口协议被几个软件和AI带沟里面去了。 1.00001101-0000-1000-8000-00805f9b34fb 是spp协议。但是我用的称是使用的49535343-fe7d-4ae5-8fa9-9fafd205e455蓝牙低功耗spp协议 2.推荐一款软件Android-nRF-Connect github地址:https://github.com/Nor…...

python基础知识(二)
元组 元组与列表类似,不同之处在于,元组的元素不能修改,元组使用()。 集合 集合是一个无序且不重复的元素列表。 基本功能是 进行成员关系测试和删除重复元素。 创建集合使用大括号或者set()函数。 例子: 注意:创建一…...
【每日学点鸿蒙知识】初始化BigInt、包体积瘦身、Tabs嵌套Grid、老年化适配、Release打包失败
1、HarmonyOS 在一个类中,怎么初始化一个BigInt类型的属性? 可以通过BigInt关键字来初始化,如: let a BigInt(1); let b BigInt("2"); 关于Uint8Array与string互转,示例: // string 转Uint8…...
Android service framework笔记
1. 网络摘录如何添加一个Application Framework Service(一)(without native code) 如何添加一个Application Framework Service(二)(with native code) 2.书籍摘录...
安全攻防:中间人攻击
1. 中间人攻击定义 中间人攻击(简称MITM)是攻击者在进行网络通信的双方中间,分别与两端建立独立的联系,并进行数据嗅探甚至篡改,而通信的双方却对中间人毫不知情,认为自己是直接在与对端通信。2. 常见中间人…...
【Rust自学】7.3. use关键字 Pt.1:use的使用与as关键字
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 7.3.1. use的作用 use的作用是将路径导入到当前作用域内。而引入的内容仍然是遵守私有性原则,也就是只有公共的部分引入进来才…...
变长的时间戳(第4版)
以32位为单位,一个时间戳可以是32位、64位、96位。 122932 113032 A类:(40036597)1000146097000≤229 B类:246060100086400000≤229 C类:1000100010001000000000≤230 每400年有40036597146097天,A类时间戳能表达1000…...

Intent--组件通信
组件通信1 获取子活动的返回值 创建Activity时实现自动注册!【Activity必须要注册才能使用】 默认 LinearLayout 布局,注意 xml 中约束布局的使用; 若需要更改 线性布局 只需要将标签更改为 LinearLayout 即可,记得 设置线性布局…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...