【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 即可,记得 设置线性布局…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...
深入解析 ReentrantLock:原理、公平锁与非公平锁的较量
ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...
作为点的对象CenterNet论文阅读
摘要 检测器将图像中的物体表示为轴对齐的边界框。大多数成功的目标检测方法都会枚举几乎完整的潜在目标位置列表,并对每一个位置进行分类。这种做法既浪费又低效,并且需要额外的后处理。在本文中,我们采取了不同的方法。我们将物体建模为单…...
VASP软件在第一性原理计算中的应用-测试GO
VASP软件在第一性原理计算中的应用 VASP是由维也纳大学Hafner小组开发的一款功能强大的第一性原理计算软件,广泛应用于材料科学、凝聚态物理、化学和纳米技术等领域。 VASP的核心功能与应用 1. 电子结构计算 VASP最突出的功能是进行高精度的电子结构计算ÿ…...
MCP和Function Calling
MCP MCP(Model Context Protocol,模型上下文协议) ,2024年11月底,由 Anthropic 推出的一种开放标准,旨在统一大模型与外部数据源和工具之间的通信协议。MCP 的主要目的在于解决当前 AI 模型因数据孤岛限制而…...
Go爬虫开发学习记录
Go爬虫开发学习记录 基础篇:使用net/http库 Go的标准库net/http提供了完善的HTTP客户端功能,是构建爬虫的基石: package mainimport ("fmt""io""net/http" )func fetchPage(url string) string {// 创建自定…...
PCA笔记
✅ 问题本质:为什么让矩阵 TT 的行列式为 1? 这个问题通常出现在我们对数据做**线性变换(旋转/缩放)**的时候,比如在 PCA 中把数据从原始坐标系变换到主成分方向时。 📌 回顾一下背景 在 PCA 中ÿ…...
