【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 即可,记得 设置线性布局…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
