当前位置: 首页 > news >正文

HalconDotNet实现OCR详解

文章目录

  • 一、基于字符分割的 OCR
  • 二、基于模板匹配的 OCR
  • 三、基于深度学习的 OCR
  • 四、基于特征提取的 OCR
  • 五、基于区域建议的 OCR


一、基于字符分割的 OCR

  字符分割是 OCR 中的一个重要步骤。首先,对包含文本的图像进行预处理,如去噪、二值化等操作,以提高图像质量。然后,根据字符的特征,如连通区域、轮廓等,将图像中的字符分割出来。可以使用投影法、连通区域分析等方法进行字符分割。对于粘连的字符,可能需要进行特殊处理,如形态学操作或基于笔画宽度的分割方法。分割后的字符可以单独进行识别,提高识别的准确性。
C# 示例代码:

using HalconDotNet;class CharacterSegmentationOCR
{public void PerformOCR(){// 读取图像HObject image = new HObject();HOperatorSet.ReadImage(out image, "text_image.jpg");// 预处理:二值化HObject binaryImage;HOperatorSet.Threshold(image, out binaryImage, 128, 255);// 连通区域分析进行字符分割HObject connectedRegions;HOperatorSet.Connection(binaryImage, out connectedRegions);// 对每个连通区域进行单独处理HTuple regionCount;HOperatorSet.CountObj(connectedRegions, out regionCount);for (int i = 1; i <= regionCount; i++){HObject singleRegion;HOperatorSet.SelectObj(connectedRegions, out singleRegion, i);// 对单个字符区域进行识别,可以使用 Halcon 的 OCR 引擎HTuple recognizedText;using (new HOperatorSet()){HOperatorSet.ReadOcrClassMlp("ocr_model_file.omc", out recognizedText);HOperatorSet.DoOcrMultiClassMlp(singleRegion, recognizedText, out _, out _, out _, out _, out _, out _);}Console.WriteLine($"Recognized character: {recognizedText}");singleRegion.Dispose();}// 释放资源image.Dispose();binaryImage.Dispose();connectedRegions.Dispose();}
}

二、基于模板匹配的 OCR

  模板匹配 OCR 方法首先创建一系列不同字符的模板图像。对于待识别的图像,将其与每个模板进行比较,计算相似度。相似度可以通过多种方式计算,如归一化互相关等。根据相似度最高的模板确定对应的字符。这种方法对于字体较为固定、图像质量较好的情况效果较好。但需要预先创建大量的模板,并且对于字体变化、变形等情况可能不够鲁棒。
C# 示例代码:

using HalconDotNet;class TemplateMatchingOCR
{public void PerformOCR(){// 读取待识别图像HObject image = new HObject();HOperatorSet.ReadImage(out image, "text_image.jpg");// 加载字符模板HObject charTemplates = new HObject();for (char c = 'A'; c <= 'Z'; c++){HObject template = new HObject();HOperatorSet.ReadImage(out template, $"template_{c}.jpg");charTemplates = charTemplates.ConcatObj(template);template.Dispose();}// 进行模板匹配HTuple recognizedCharacters = new HTuple();HTuple scores = new HTuple();HOperatorSet.FindTemplate(image, charTemplates, -0.39, 6.28, 0.5, 1, 0.5, out _, out scores);for (int i = 0; i < scores.Length; i++){if (scores[i] > 0.8){recognizedCharacters = recognizedCharacters.ConcatObj((HTuple)charTemplates[i]);}}Console.WriteLine($"Recognized text: {recognizedCharacters}");// 释放资源image.Dispose();charTemplates.Dispose();}
}

三、基于深度学习的 OCR

  深度学习在 OCR 中取得了显著的成果。通过使用深度神经网络,如卷积神经网络(CNN)和循环神经网络(RNN)的组合,可以自动学习字符的特征,无需手动设计特征提取器。首先,收集大量的标注文本图像数据集,对神经网络进行训练。训练过程中,网络不断调整权重和参数,以最小化预测结果与真实标签之间的误差。在识别阶段,将待识别图像输入训练好的网络,网络输出预测的字符序列。深度学习方法对于复杂背景、字体变化、变形等情况具有较好的鲁棒性。
C# 示例代码:

using HalconDotNet;
using Halcon.OCR;class DeepLearningOCR
{public void PerformOCR(){// 读取图像HObject image = new HObject();HOperatorSet.ReadImage(out image, "text_image.jpg");// 创建 OCR 引擎HOcrEngine ocrEngine = new HOcrEngine();ocrEngine.InitOcrEngine("deep_learning_model_file.omc");// 进行 OCR 识别HTuple recognizedText;ocrEngine.ApplyOcr(image, out recognizedText);Console.WriteLine($"Recognized text: {recognizedText}");// 释放资源image.Dispose();ocrEngine.Dispose();}
}

四、基于特征提取的 OCR

  特征提取是 OCR 中的关键步骤之一。通过提取字符的特征,可以减少数据维度,提高识别的效率和准确性。常见的特征包括几何特征(如字符的高度、宽度、面积等)、统计特征(如灰度直方图、矩特征等)和结构特征(如字符的笔画结构、轮廓特征等)。对于不同的字体和图像质量,可以选择不同的特征组合。然后,使用分类器对提取的特征进行分类,确定字符的类别。
C# 示例代码:

using HalconDotNet;class FeatureExtractionOCR
{public void PerformOCR(){// 读取图像HObject image = new HObject();HOperatorSet.ReadImage(out image, "text_image.jpg");// 预处理:二值化HObject binaryImage;HOperatorSet.Threshold(image, out binaryImage, 128, 255);// 连通区域分析HObject connectedRegions;HOperatorSet.Connection(binaryImage, out connectedRegions);// 提取特征HTuple features = new HTuple();HTuple regionCount;HOperatorSet.CountObj(connectedRegions, out regionCount);for (int i = 1; i <= regionCount; i++){HObject singleRegion;HOperatorSet.SelectObj(connectedRegions, out singleRegion, i);// 提取几何特征和统计特征HTuple area, width, height;HOperatorSet.AreaCenter(singleRegion, out area, out _, out _);HOperatorSet.RegionFeatures(singleRegion, "width", out width);HOperatorSet.RegionFeatures(singleRegion, "height", out height);features = features.ConcatObj(area.ConcatObj(width.ConcatObj(height)));singleRegion.Dispose();}// 使用分类器进行识别HTuple recognizedCharacters;// 假设已经训练好分类器// 使用分类器对特征进行分类,得到识别结果recognizedCharacters = Classifier.Predict(features);Console.WriteLine($"Recognized text: {recognizedCharacters}");// 释放资源image.Dispose();binaryImage.Dispose();connectedRegions.Dispose();}
}

五、基于区域建议的 OCR

  区域建议方法首先在图像中生成可能包含字符的区域建议。可以使用基于深度学习的目标检测算法,如 Faster R-CNN 等,来生成区域建议。然后,对每个区域建议进行字符识别。这种方法可以有效地处理复杂背景下的文本识别问题,并且可以同时识别多个字符区域。通过对区域建议进行筛选和合并,可以提高识别的准确性和效率。
C# 示例代码:

using HalconDotNet;
using Halcon.OCR;class RegionProposalOCR
{public void PerformOCR(){// 读取图像HObject image = new HObject();HOperatorSet.ReadImage(out image, "text_image.jpg");// 创建 OCR 引擎HOcrEngine ocrEngine = new HOcrEngine();ocrEngine.InitOcrEngine("ocr_model_file.omc");// 使用区域建议算法生成可能的字符区域HObject regionProposals;// 假设已经有区域建议算法生成的区域regionProposals = GenerateRegionProposals(image);// 对每个区域进行 OCR 识别HTuple recognizedText = new HTuple();HTuple regionCount;HOperatorSet.CountObj(regionProposals, out regionCount);for (int i = 1; i <= regionCount; i++){HObject singleRegion;HOperatorSet.SelectObj(regionProposals, out singleRegion, i);HTuple tempRecognizedText;ocrEngine.ApplyOcr(singleRegion, out tempRecognizedText);recognizedText = recognizedText.ConcatObj(tempRecognizedText);singleRegion.Dispose();}Console.WriteLine($"Recognized text: {recognizedText}");// 释放资源image.Dispose();regionProposals.Dispose();ocrEngine.Dispose();}private HObject GenerateRegionProposals(HObject image){// 这里假设使用一个虚构的区域建议算法生成区域HObject dummyRegions = new HObject();// 根据具体需求生成区域建议并返回return dummyRegions;}
}

相关文章:

HalconDotNet实现OCR详解

文章目录 一、基于字符分割的 OCR二、基于模板匹配的 OCR三、基于深度学习的 OCR四、基于特征提取的 OCR五、基于区域建议的 OCR 一、基于字符分割的 OCR 字符分割是 OCR 中的一个重要步骤。首先&#xff0c;对包含文本的图像进行预处理&#xff0c;如去噪、二值化等操作&#…...

手搓一个Agent#Datawhale 组队学习Task3

书接上回&#xff0c;首先回顾一下Task2的一些补充&#xff1a; Task2主要任务是从零预训练一个tiny-llama模型&#xff0c;熟悉一下Llama的模型架构和流程。然后测试一下模型的效果。总的来说&#xff0c;因为某些未知的原因&#xff0c;loss一直没有降下去&#xff0c;导致最…...

基于SpringBoot+Vue+MySQL的在线酷听音乐系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网技术的飞速发展&#xff0c;网络已成为人们日常生活中不可或缺的一部分。在线音乐服务因其便捷性和丰富性&#xff0c;逐渐成为用户获取音乐内容的主要渠道。然而&#xff0c;传统的音乐播放平台往往存在歌曲资源有限…...

大数据实时数仓Hologres(一):Hologres 简单介绍

文章目录 Hologres 简单介绍 一、什么是实时数仓 Hologres 二、产品优势 1、专注实时场景 2、亚秒级交互式分析 3、统一数据服务出口 4、开放生态 5、MaxCompute查询加速 6、计算存储分离架构 三、应用场景 搭建实时数仓 四、产品架构 1、Shared Disk/Storage &am…...

【鸿蒙HarmonyOS NEXT】数据存储之分布式键值数据库

【鸿蒙HarmonyOS NEXT】数据存储之分布式键值数据库 一、环境说明二、分布式键值数据库介绍三、示例代码加以说明四、小结 一、环境说明 DevEco Studio 版本&#xff1a; API版本&#xff1a;以12为主 二、分布式键值数据库介绍 KVStore简介&#xff1a; 分布式键值数据库…...

基于springboot+小程序的儿童预防接种预约管理系统(疫苗1)(源码+sql脚本+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 本儿童预防接种预约微信小程序可以实现管理员和用户。 1、管理员功能有个人中心&#xff0c;用户管理&#xff0c;儿童信息管理&#xff0c;疫苗信息管理&#xff0c;儿童接种管理&#x…...

计算物理精解【8】-计算原理精解【5】

文章目录 logistic模型多元回归分析多元回归分析概览1. 多元回归的概念与重要性2. 多元回归在实际应用中的例子3. 多元回归在预测和解释数据中的优势和局限性4. 多元回归的优缺点及改进建议 多元线性回归分析详解一、原理二、性质三、计算四、例子与例题五、应用场景六、优缺点…...

【Linux】 tcp | 解除服务器对tcp连接的限制 | 物联网项目配置

一、修改tcp连接限制 1、编辑 vi /etc/sysctl.conf 2、内容 net.ipv4.tcp_keepalive_intvl 75 net.ipv4.tcp_keepalive_probes 9 net.ipv4.tcp_keepalive_time 7200 net.ipv4.ip_local_port_range 1024 65535 net.ipv4.ip_conntrack_max 20000 net.ipv4.tcp_max_tw_bucket…...

如何隐藏Windows10「安全删除硬件」里的USB无线网卡

本方法参照了原文《如何隐藏Windows10「安全删除硬件」里的USB无线网卡》里面的方法&#xff0c;但是文章中的描述我的实际情况不太一样&#xff0c;于是我针对自己的实际情况进行了调整&#xff0c;经过测试可以成功隐藏Windows10「安全删除硬件」里的USB无线网卡。 先说一下…...

【QT Quick】基础语法:导入外部JS文件及调试

在 QML 中&#xff0c;可以使用 JavaScript 来实现业务逻辑的灵活性和简化开发。接下来我们会学习如何导入 JavaScript 文件&#xff0c;并在 QML 中使用它&#xff0c;同时也会介绍如何调试这些 JavaScript 代码。 导入 JavaScript 文件 在 QML 中导入 JavaScript 文件的方式…...

【质优价廉】GAP9 AI算力处理器赋能智能可听耳机,超低功耗畅享未来音频体验!

当今世界&#xff0c;智能可听设备已经成为了流行趋势。随后耳机市场的不断成长起来&#xff0c;消费者又对AI-ANC&#xff0c;AI-ENC&#xff08;环境噪音消除&#xff09;降噪的需求逐年增加&#xff0c;但是&#xff0c;用户对于产品体验的需求也从简单的需求&#xff0c;升…...

用Flutter几年了,Flutter每个版本有什么区别?

用Flutter几年了&#xff0c;你知道Flutter每个版本有什么区别吗&#xff1f;不管是学习还是面试我们可能都需要了解这个信息。 Flutter 每个版本的用法基本都是一样的&#xff0c;每隔几天或者几周就会更新一个版本&#xff0c; 2018 年 12 月 5 日发布了1.x 版本&#…...

解决Qt每次修改代码后首次运行崩溃,后几次不崩溃问题

在使用unique_ptr声明成员变量后&#xff0c;我习惯性地在初始化构造列表中进行如下构造&#xff1a; 注意看&#xff0c;我将m_menuBtnGroup的父类指定为ui->center_menu_widget&#xff0c;这便是导致崩溃的根本原因&#xff0c;解决办法便是先用this初始化&#xff0c;后…...

语言的变量交换

不用第三个变量交换两个变量在面试题或者笔试题中无数次被提到&#xff0c;事实上&#xff0c;有些答案是理论性的&#xff0c;不是准确的。以整型为例&#xff0c;如下对比不同交换方式的差异。 不同的交换方式 利用中间变量c a; 00C02533 8B 45 F8 mov eax,dword ptr [a] 0…...

【muduo源码分析】「阻塞」「非阻塞」「同步」「异步」

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 引言何为「muduo库」安装muduo库阻塞、非阻塞、同步、异步数据准备数据准备 引言 从本篇博客开始&#xff0c;我会陆续发表muduo库源码分析的相关文章。感谢大家的持续关注&#xff01;&#xff01;…...

顶顶通呼叫中心中间件-机器人话术挂机后是否处理完成事件

前言 问题&#xff1a;机器人放音的过程中&#xff0c;如果用户直接挂机就会继续匹配下一个流程&#xff0c;如果匹配上的是放音节点&#xff0c;还会进行放音&#xff0c;那么在数据库表中就会多出一条放音记录。 解决方法 一、话术添加一个全局挂机节点 需要在话术中添加一…...

Springboot Mybatis 动态SQL

动态SQL <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.wzb.SqlImprove2024…...

ORM的了解

什么是ORM&#xff1f;为什么要用ORM&#xff1f;-CSDN博客 C高级编程&#xff08;99&#xff09;面向资源的设计思想&#xff08;ORM&#xff09;_c orm-CSDN博客 ORM:Object-Relational-Mapping 对象关系映射 -------------------------- 我想对数据库中的表A进行增删改…...

关于大模型的10个思考

9月28日&#xff0c;第四届“青年科学家50论坛”在南方科技大学举行&#xff0c;美国国家工程院外籍院士沈向洋做了《通用人工智能时代&#xff0c;我们应该怎样思考大模型》的主题演讲&#xff0c;并给出了他对大模型的10个思考。 以下是他10个思考的具体内容&#xff1a; 1…...

CFR( Java 反编译器)---> lambda 表达式底层实现机制

一、安装教程 CFR&#xff08;Class File Reader&#xff09;是一个流行的Java反编译器&#xff0c;它可以将编译后的.class文件或整个.jar文件转换回Java源代码。以下是CFR的下载和使用教程&#xff1a; 下载CFR 访问CFR的官方网站或GitHub仓库&#xff1a;CFR的最新版本和所…...

《C++多态性:开启实际项目高效编程之门》

在 C的广阔编程世界中&#xff0c;多态性是一个强大而富有魅力的特性。它为程序员提供了极大的灵活性和可扩展性&#xff0c;使得代码能够更加优雅地应对复杂的业务需求。在实际项目中&#xff0c;理解和正确应用 C的多态性至关重要&#xff0c;它可以显著提高代码的质量、可维…...

UDS_5_输入输出控制功能单元

目录 一. 0x2F服务 一. 0x2F服务 InputOutputControlByIdentifier(0x2F)服务 用于替换服务器输入信号的值或内部功能控制电子系统的某个输出(执行器) •请求报文 A_Data Byte Parameter Name Cvt Byte Value #1 InputOutputControlByIdentifier Request SID M 0x2F dataI…...

CAD快捷键

CAD快捷键 功能快捷键描述直线L点PO多段线PL多用于描边构造线XL无限长直线射线RAY样条曲线SPL绘制光滑曲线–––圆弧A圆C矩形REC正多边形POL–––填充H圆角F倒角CHA–––打断BR分解X合并J–––创建块B插入块I 功能快捷键描述移动M复制CO擦除E修剪TR延伸EX拉伸S镜像MI偏移…...

Spring6梳理12——依赖注入之注入Map集合类型属性

以上笔记来源&#xff1a; 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09;https://www.bilibili.com/video/BV1kR4y1b7Qc 12 依赖注入之注入Map集合类型属性 12.1 创建Student类和Teacher类 Student类中创建了run…...

基于SpringBoot校园失物招领系统设计与实现

文未可获取一份本项目的java源码和数据库参考。 本课题的作用、意义&#xff0c;在国内外的研究现状和发展趋势&#xff0c;尚待研究的问题 作用&#xff1a;本课题的目的是使失物招领信息管理清晰化&#xff0c;透明化&#xff0c;便于操作&#xff0c;易于管理。通过功能模…...

推荐4款2024年热门的PDF转ppt工具

有时候&#xff0c;我们为了方便&#xff0c;需要将PDF里面的内容直接转换的PPT的格式&#xff0c;既方便自己演示和讲解&#xff0c;也让我们可以更加灵活的进行文件的编辑和修改。如果大家不知道要如何进行操作的话&#xff0c;我可以为大家推荐几个比窘方便实用的PDF转换工具…...

[深度学习]卷积神经网络CNN

1 图像基础知识 import numpy as np import matplotlib.pyplot as plt # 图像数据 #imgnp.zeros((200,200,3)) imgnp.full((200,200,3),255) # 可视化 plt.imshow(img) plt.show() # 图像读取 imgplt.imread(img.jpg) plt.imshow(img) plt.show() 2 CNN概述 卷积层convrelu池…...

从零开始,Docker进阶之路(三):Docker镜像与命令

一、Docker核心名词 镜像文件、容器、仓库 镜像&#xff1a;简单理解为就是一个安装包&#xff0c;里面包含容器所需要运行的基础文件和配置信息&#xff0c;比如&#xff1a;redis镜像、mysql镜像等。 镜像的来源方式&#xff1a; 1.自己做镜像&#xff0c;比如自己开发微服…...

【计算机网络】网络层详解

文章目录 一、引言二、IP 基础知识1、IP 地址2、路由3、IP报文4、IP报文的分片与重组 三、IP 属于面向无连接型四、IP协议相关技术1、DNS2、ICMP3、NAT技术4、DHCP 一、引言 TCP/IP的心脏是网络层。这一层主要由 IP 和 ICMP 两个协议组成。网络层的主要作用是“实现终端节点之…...

后端开发刷题 | 最小的K个数(优先队列)

描述 给定一个长度为 n 的可能有重复值的数组&#xff0c;找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字&#xff0c;则最小的4个数字是1,2,3,4(任意顺序皆可)。 数据范围&#xff1a;0≤k,n≤10000&#xff0c;数组中每个数的大小0≤val≤1000 要…...

网站怎么做外联/日本比分预测

torchserve for docker 什么是TorchServe TorchServe是用于服务PyTorch模型的灵活易用的工具。它没有TFX的复杂性&#xff0c;因此&#xff0c;它没有提供那么多的功能。但是&#xff0c;这是完成工作的直接方法&#xff01; TorchServe提供了一组必要的功能&#xff0c;例如…...

wordpress 繁体/百度广告电话号码是多少

小 编注&#xff1a;相比起网页射击狮&#xff0c;操纵代码的前端攻城狮凭着双手在键盘巴拉巴拉敲出的字符&#xff0c;就能赋予二次元的静态页面生命&#xff0c;各种lovely 的~~fabulous的~~elegant的交互效果&#xff0c;那叫一个锦上添花哈~~不过&#xff0c;要修炼成一个百…...

用模板做网站/广告资源对接平台

目录 题目描述&#xff1a;示例&#xff1a;解法&#xff1a;题目描述&#xff1a; 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性&#xff1a;val 和 next。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。如果要使用双向…...

动漫做的游戏 迅雷下载网站有哪些/百度软文推广怎样收费

在JS中&#xff0c;类的实现是基于其原型继承机制的。 如果两个实例都从同一个原型对象上继承了属性&#xff0c;我们就说它们是同一个类的实例。 如果两个对象继承自同一个原型&#xff0c;往往意味着它们是由同一个构造函数创建并初始化的。 类和构造函数 使用关键字 new…...

土特产 网站源码/什么网站百度收录快

01 服务器虚拟化介绍 02 VMware组件介绍 03 ESXi介绍 04 vCenter Server介绍 05 VMware虚拟机及虚拟机管理介绍 06 Vmware vMotion及Storage vMotion 07 Vmware 可用性及可扩展性介绍...

国外有网站备案制度吗/百度平台商家我的订单查询

http://www.cnblogs.com/schaepher/p/5561193.html#init 本地使用git命令总结&#xff1a; 行为命令备注初始化init在本地的当前目录里初始化git仓库 clone 地址从网络上某个地址拷贝仓库(repository)到本地查看当前状态status查看当前仓库的状态。碰到问题不知道怎么办的时候…...