Halcon基础-瓶盖带角度的OCR批量识别
Halcon基础-OCR识别
- 1、OCR识别素材
- 2、创建路径文件
- 3、Halcon代码实现
- 4、运行效果
- 5、资源获取
1、OCR识别素材
这里我准备了7张不同角度的OCR图片,如下所示:

2、创建路径文件
按照下图所示创建全部文件夹和文件:
01用来存放OCR识别原图
c01 用来存放每张图裁剪出来的OCR区域
OCRText 用来存放每张图识别出来的OCR结果




3、Halcon代码实现
create_text_model_reader ('manual', [], TextModel)
set_text_model_param (TextModel, 'manual_char_width', 14)
set_text_model_param (TextModel, 'manual_char_height', 18)
set_text_model_param (TextModel, 'manual_stroke_width', 1.8)
set_text_model_param (TextModel, 'manual_return_punctuation', 'false')
set_text_model_param (TextModel, 'manual_uppercase_only', 'true')
set_text_model_param (TextModel, 'manual_fragment_size_min', 3)
set_text_model_param (TextModel, 'manual_eliminate_border_blobs', 'true')
set_text_model_param (TextModel, 'manual_base_line_tolerance', 0.2)
set_text_model_param (TextModel, 'manual_max_line_num', 2)
read_ocr_class_mlp ('Industrial_NoRej.omc', OcrHandle)* 设置文件夹路径
FolderPath := 'C:/Users/Administrator/Desktop/盖码测试/01'
* 使用find_files查找所有.jpg文件
list_files (FolderPath, 'files', Files)
* 获取文件的数量
NumFiles := |Files|
* 循环读取每一张图片 for Index := 0 to NumFiles-1 by 1 FileName := Files[Index] read_image(Image, FileName) rgb1_to_gray (Image, GrayImage)emphasize (GrayImage, ImageEmphasize, 10, 10, 18)threshold (ImageEmphasize, Regions, 0, 150)dilation_circle (Regions, RegionDilation, 2)erosion_circle (RegionDilation, RegionErosion, 2)connection (RegionErosion, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 50, 200)union1 (SelectedRegions, RegionUnion)dilation_circle (RegionUnion, RegionDilation, 22)connection (RegionDilation, ConnectedRegions)select_shape (ConnectedRegions, SelectedRegions, ['area','width','height'], 'and', [8000,30,30], [23000,300,300])*intersection (ImageEmphasize, RegionDilation, RegionIntersection)*reduce_domain (ImageEmphasize, RegionIntersection, ImageReduced)*area_center (RegionIntersection, Area, Row, Column)area_center (SelectedRegions, Area, Row, Column)*orientation_region (RegionDilation, Phi)*椭圆拟合求出旋转角度elliptic_axis_gray (SelectedRegions, ImageEmphasize, Ra, Rb, Phi)hom_mat2d_identity (HomMat2DIdentity)hom_mat2d_rotate (HomMat2DIdentity, -Phi, Row[0], Column[0], HomMat2DRotate)*旋转区域affine_trans_region (SelectedRegions, RegionAffineTrans, HomMat2DRotate, 'nearest_neighbor')*旋转图像affine_trans_image (ImageEmphasize, ImageAffineTrans, HomMat2DRotate, 'constant', 'false')reduce_domain (ImageAffineTrans, RegionAffineTrans, ImageReduced)crop_domain (ImageReduced, Image)write_image (Image, 'png', 0, 'C:/Users/Administrator/Desktop/盖码测试/c01/'+Index+'.png')get_image_size (Image, Width, Height)
gen_rectangle1 (ROI_OCR_01_0, 0, 0,Height, Width)access_channel (Image, TmpObj_Mono, 1)reduce_domain (TmpObj_Mono, ROI_OCR_01_0, TmpObj_MonoReduced_OCR_01_0)TmpCtrl_Orientation := 0TmpCtrl_RangeMin := -0.174533TmpCtrl_RangeMax := 0.174533text_line_orientation (TmpObj_MonoReduced_OCR_01_0, TmpObj_MonoReduced_OCR_01_0, 18, TmpCtrl_Orientation+TmpCtrl_RangeMin, TmpCtrl_Orientation+TmpCtrl_RangeMax, TmpCtrl_Orientation)hom_mat2d_identity (TmpCtrl_MatrixIdentity)hom_mat2d_rotate (TmpCtrl_MatrixIdentity, -TmpCtrl_Orientation, 0, 0, TmpCtrl_MatrixRotation)get_domain (TmpObj_MonoReduced_OCR_01_0, TmpObj_Domain)get_system ('clip_region', TmpCtrl_ClipRegion)set_system ('clip_region', 'false')dilation_circle (TmpObj_Domain, TmpObj_DomainExpanded, 9)affine_trans_region (TmpObj_DomainExpanded, TmpObj_DomainTransformedRaw, TmpCtrl_MatrixRotation, 'true')smallest_rectangle1 (TmpObj_DomainTransformedRaw, TmpCtrl_Row1, TmpCtrl_Col1, TmpCtrl_Row2, TmpCtrl_Col2)hom_mat2d_translate (TmpCtrl_MatrixIdentity, -TmpCtrl_Row1, -TmpCtrl_Col1, TmpCtrl_MatrixTranslation)hom_mat2d_compose (TmpCtrl_MatrixTranslation, TmpCtrl_MatrixRotation, TmpCtrl_MatrixComposite)affine_trans_region (TmpObj_Domain, TmpObj_DomainTransformed, TmpCtrl_MatrixComposite, 'true')affine_trans_image (TmpObj_MonoReduced_OCR_01_0, TmpObj_ImageTransformed, TmpCtrl_MatrixComposite, 'constant', 'true')dilation_circle (TmpObj_Domain, TmpObj_DomainExpanded, 9)expand_domain_gray (TmpObj_ImageTransformed, TmpObj_ImageTransformedExpanded, 9)reduce_domain (TmpObj_ImageTransformed, TmpObj_DomainTransformed, TmpObj_ImageTransformedReduced)crop_part (TmpObj_ImageTransformedReduced, TmpObj_MonoReduced_OCR_01_0, 0, 0, TmpCtrl_Col2-TmpCtrl_Col1+1, TmpCtrl_Row2-TmpCtrl_Row1+1)set_system ('clip_region', TmpCtrl_ClipRegion)find_text (TmpObj_MonoReduced_OCR_01_0, TextModel, TmpCtrl_ResultHandle_OCR_01_0)get_text_object (Symbols_OCR_01_0, TmpCtrl_ResultHandle_OCR_01_0, 'manual_all_lines')dev_display (TmpObj_MonoReduced_OCR_01_0)dev_set_draw ('fill')dev_set_colored (3)dev_display (Symbols_OCR_01_0)do_ocr_multi_class_mlp (Symbols_OCR_01_0, TmpObj_MonoReduced_OCR_01_0, OcrHandle, SymbolNames_OCR_01_0, Confidences_OCR_01_0)
* 获取元组的第一个元素
FirstSymbol := SymbolNames_OCR_01_0[0]
SecondSymbol := SymbolNames_OCR_01_0[1] if (FirstSymbol!='C' and SecondSymbol!='C')rotate_image (Image, Image, 180, 'constant')access_channel (Image, TmpObj_Mono, 1)reduce_domain (TmpObj_Mono, ROI_OCR_01_0, TmpObj_MonoReduced_OCR_01_0)TmpCtrl_Orientation := 0TmpCtrl_RangeMin := -0.174533TmpCtrl_RangeMax := 0.174533text_line_orientation (TmpObj_MonoReduced_OCR_01_0, TmpObj_MonoReduced_OCR_01_0, 18, TmpCtrl_Orientation+TmpCtrl_RangeMin, TmpCtrl_Orientation+TmpCtrl_RangeMax, TmpCtrl_Orientation)hom_mat2d_identity (TmpCtrl_MatrixIdentity)hom_mat2d_rotate (TmpCtrl_MatrixIdentity, -TmpCtrl_Orientation, 0, 0, TmpCtrl_MatrixRotation)get_domain (TmpObj_MonoReduced_OCR_01_0, TmpObj_Domain)get_system ('clip_region', TmpCtrl_ClipRegion)set_system ('clip_region', 'false')dilation_circle (TmpObj_Domain, TmpObj_DomainExpanded, 9)affine_trans_region (TmpObj_DomainExpanded, TmpObj_DomainTransformedRaw, TmpCtrl_MatrixRotation, 'true')smallest_rectangle1 (TmpObj_DomainTransformedRaw, TmpCtrl_Row1, TmpCtrl_Col1, TmpCtrl_Row2, TmpCtrl_Col2)hom_mat2d_translate (TmpCtrl_MatrixIdentity, -TmpCtrl_Row1, -TmpCtrl_Col1, TmpCtrl_MatrixTranslation)hom_mat2d_compose (TmpCtrl_MatrixTranslation, TmpCtrl_MatrixRotation, TmpCtrl_MatrixComposite)affine_trans_region (TmpObj_Domain, TmpObj_DomainTransformed, TmpCtrl_MatrixComposite, 'true')affine_trans_image (TmpObj_MonoReduced_OCR_01_0, TmpObj_ImageTransformed, TmpCtrl_MatrixComposite, 'constant', 'true')dilation_circle (TmpObj_Domain, TmpObj_DomainExpanded, 9)expand_domain_gray (TmpObj_ImageTransformed, TmpObj_ImageTransformedExpanded, 9)reduce_domain (TmpObj_ImageTransformed, TmpObj_DomainTransformed, TmpObj_ImageTransformedReduced)crop_part (TmpObj_ImageTransformedReduced, TmpObj_MonoReduced_OCR_01_0, 0, 0, TmpCtrl_Col2-TmpCtrl_Col1+1, TmpCtrl_Row2-TmpCtrl_Row1+1)set_system ('clip_region', TmpCtrl_ClipRegion)find_text (TmpObj_MonoReduced_OCR_01_0, TextModel, TmpCtrl_ResultHandle_OCR_01_0)get_text_object (Symbols_OCR_01_0, TmpCtrl_ResultHandle_OCR_01_0, 'manual_all_lines')dev_display (TmpObj_MonoReduced_OCR_01_0)dev_set_draw ('fill')dev_set_colored (3)dev_display (Symbols_OCR_01_0)do_ocr_multi_class_mlp (Symbols_OCR_01_0, TmpObj_MonoReduced_OCR_01_0, OcrHandle, SymbolNames_OCR_01_0, Confidences_OCR_01_0)endifTxtPath := 'C:/Users/Administrator/Desktop/盖码测试/OCRText'
file_name:=TxtPath+'/'+Index+'.txt'
* 打开文件以写入(如果文件已存在则覆盖)
open_file(file_name, 'output', FileHandle)
* 写入OCR信息
fwrite_string(FileHandle, SymbolNames_OCR_01_0)
*关闭文件
close_file(FileHandle)endfor
4、运行效果

5、资源获取
CSDN 源码下载:Halcon基础-瓶盖OCR识别
相关文章:
Halcon基础-瓶盖带角度的OCR批量识别
Halcon基础-OCR识别 1、OCR识别素材2、创建路径文件3、Halcon代码实现4、运行效果5、资源获取 1、OCR识别素材 这里我准备了7张不同角度的OCR图片,如下所示: 2、创建路径文件 按照下图所示创建全部文件夹和文件: 01用来存放OCR识别原图 c…...
php语法学习
启动php 进入软件 打开文件:编写代码 $php true; $java false; var_dump($php);//输出变量细节 var_dump($java) 字符串 注意可以使用双引号也可以使用单引号 测试 $php "最好学web语言"; $java 脱胎于c语言; var_dump($php);//输出变量细节 var…...
JavaWeb合集22-Apache POI
二十二、Apache POI Apache POI是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用POI在Java 序中对Miscrosoft Office各种文件进行读写操作。一般情况下,POI都是用于操作Excel文件。 使用场景:银行网银系统导出…...
DDD重构-实体与限界上下文重构
DDD重构-实体与限界上下文重构 概述 DDD 方法需要不同类型的类元素,例如实体或值对象,并且几乎所有这些类元素都可以看作是常规的 Java 类。它们的总体结构是 Name: 类的唯一名称 Properties:属性 Methods: 控制变量的变化和添加行为 一…...
MATLAB Simulink (二)高速跳频通信系统
MATLAB & Simulink (二)高速跳频通信系统 写在前面1 系统原理1.1 扩频通信系统理论基础1.1.1 基本原理1.1.2 扩频通信系统处理增益和干扰容限1.1.3 各种干扰模式下抗干扰性能 1.2 高速跳频通信系统理论基础1.2.1 基本原理1.2.2 物理模型 2 方案设计2…...
智能合约分享
智能合约练习 一、solidity初学者经典示例代码: 1.存储和检索数据: // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // 声明 Solidity 编译器版本// 定义一个名为 SimpleStorage 的合约 contract SimpleStorage {// 声明一个公共状态变量 d…...
【MR开发】在Pico设备上接入MRTK3(二)——在Unity中配置Pico SDK
上一篇文档介绍了 【MR开发】在Pico设备上接入MRTK3(一)在Unity中导入MRTK3依赖 下面将介绍在Unity中导入Pcio SDK的具体步骤 在Unity中导入Pico SDK 当前Pico SDK版本 Unity交互SDK git仓库: https://github.com/Pico-Developer/PICO-Un…...
【Java】探秘正则表达式:深度解析与精妙运用
目录 引言 一、基本概念 1.1 元字符 1.2 预定义字符类 1.3 边界匹配符 1.4 数量标识符 1.5 捕获与非捕获分组 二、Java中的正则表达式支持 三、正则表达式的使用示例 3.1 匹配字符串 3.2 替换字符串 3.3 分割字符串 3.4 使用Pattern和Matcher 3.5 捕获组和后向…...
2.6.ReactOS系统中从内核中发起系统调用
2.6.ReactOS系统中从内核中发起系统调用 2.6.ReactOS系统中从内核中发起系统调用 文章目录 2.6.ReactOS系统中从内核中发起系统调用前言 前言 上面我们已经可以看到用户空间(R3)进行系统调用的全过程即两种方法的具体实现。 系统调用一般时从R3发起的…...
chat_gpt回答:python获取当前utc时间,将xml里时间tag里的值修改为当前时间
你可以使用 lxml 库来读取、修改 XML 文件中的某个标签的值,并将其保存为新的 XML 文件。以下是一个示例代码,展示如何获取当前的 UTC 时间,并将 XML 文件中的某个时间标签修改为当前时间。 示例代码: from lxml import etree f…...
机器学习-语言分析
机器学习 1.1人工智能概述 1.2.1 机器学习与人工智能,深度学习 深度学习->机器学习->人工智能; 人工智能:1950,实现自动下棋,人机对弈,达特茅斯会议->人工智能的起点,1956年8月。克劳…...
Oracle 常见索引扫描方式概述,哪种索引扫描最快!
一.常见的索引扫描方式 INDEX RANGE SCANINDEX FAST FULL SCANINDEX FULL SCAN(MIN/MAX)INDEX FULL SCAN 二.分别模拟使用这些索引的场景 1.INDEX RANGE SCAN create table t1 as select rownum as id, rownum/2 as id2 from dual connect by level<500000; create inde…...
字符串(3)_二进制求和_高精度加法
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 字符串(3)_二进制求和_高精度加法 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌 目…...
《神经网络:智能时代的核心技术》
《神经网络:智能时代的核心技术》 一、神经网络的诞生与发展二、神经网络的结构与工作原理(一)神经元模型(二)神经网络训练过程 三、神经网络的应用领域(一)信息领域(二)…...
pdf内容三张以上转图片,使用spire.pdf.free
一、依赖 <spire.pdf.free.version>9.13.0</spire.pdf.free.version><itextpdf.version>5.5.13</itextpdf.version><dependency><groupId>e-iceblue</groupId><artifactId>spire.pdf.free</artifactId><version>$…...
游戏、软件、开源项目和资讯
游戏 标题链接【白嫖正版游戏】IT之家喜加一website 软件 标题链接【白嫖正版软件】反斗限免website 开源项目 标题链接【Luxirty Search】基于Google搜索结果,屏蔽内容农场Github【Video2X】图片/视频超分工具Github 新闻资讯 标题链接分享10个 Claude 3.5 …...
Acrel-1000变电站综合自动化系统及微机在化工企业中的应用方案
文:安科瑞郑桐 摘要:大型化工企业供配电具有的集约型特点,化工企业内35kV变电站和10kV变电所数量大、分布广,对于老的大多大型及中型化工企业而言,其变电站或变电所内高压电气设备为旧式继电保护装置,可靠…...
[Linux] CentOS7替换yum源为阿里云并安装gcc详细过程(附下载链接)
前言 CentOS7替换yum源为阿里云 yum是CentOS中的一种软件管理器,通过yum安装软件,可以自动解决包依赖的问题,免去手工安装依赖包的麻烦。 yum使用了一个中心仓库来记录和管理软件的依赖关系,默认为mirrorlist.centos.org…...
在Java中创建多线程的三种方式
多线程的创建和启动方式 在Java中,创建多线程主要有以下三种方式: 继承Thread类实现Runnable接口使用Callable接口与Future 下面是这三种方式的简单示例,以及如何在主类中启动它们。 1. 继承Thread类 class MyThread extends Thread {Ov…...
洛谷 AT_abc374_c [ABC374C] Separated Lunch 题解
题目大意 KEYENCE 总部有 N N N 个部门,第 i i i 个部门有 K i K_i Ki 个人。 现在要把所有部门分为 AB 两组,求这两组中人数多的那一组的人数最少为多少。 题目分析 设这些部门共有 x x x 个人,则较多的组的人数肯定大于等于 ⌈ …...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
