【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 即可,记得 设置线性布局…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
