HalconDotNet实现OCR详解

news2024/9/23 13:12:26

文章目录

  • 一、基于字符分割的 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;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2157613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图纸加密防泄密软件 | 从设计到交付,2024年值得关注的图纸加密软件大盘点!

图纸者&#xff0c;匠心之凝聚&#xff0c;智慧之结晶。然&#xff0c;信息之海浩瀚无垠&#xff0c;暗流涌动&#xff0c;图纸之安全&#xff0c;实乃企业之头等大事。 故&#xff0c;择一良器&#xff0c;以密护图纸&#xff0c;实为当务之急。 以下&#xff0c;七款图纸加密…

Linux之实战命令01:xargs应用实例(三十五)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

高刷显示器哪个好?540Hz才有资格称高刷

高刷显示器哪个好&#xff1f;说实话&#xff0c;540Hz这些才能成为高刷显示器&#xff0c;什么200,240的&#xff0c;都不够高&#xff0c;什么是从容&#xff0c;有我不用才叫从容。下面我们一起来看看540Hz的高刷显示器都有哪些吧&#xff01; 1.高刷显示器哪个好 - 蚂蚁电…

2024风湿免疫科常用评估量表汇总,附操作步骤与评定标准!

常笑医学整理了5个风湿免疫科常用的评估量表&#xff0c;包括类风湿关节炎患者病情评价&#xff08;DAS28&#xff09;、系统性狼疮活动性测定&#xff08;SLAM&#xff09;等。这些量表在常笑医学网均支持在线评估、下载和创建项目使用。 01 类风湿关节炎患者病情评价 &#x…

实践中如何选择o1或sonnet3-5?

简述 AI更新太快导致我们不知选择什么使用更好&#xff1f;本文对比了新模型o1系列和Claude-3.5-sonnet的一些特点&#xff0c;针对不同开发场景提供了选择建议&#xff0c;希望能为你提供一些模型选择的参考。 模型对比 o1系列: 优势&#xff1a; 推理能力非常强&#xff0…

【动态规划】两个数组的 dp 问题二

两个数组的 dp 问题 1.正则表达式匹配2.交错字符串3.两个字符串的最小ASCII删除和4.最长重复子数组 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1…

高德地图自定义点标记

const markerContent <div class"custom-content-marker"> <span>摄像机<span> <img src"//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-red.png"> </div> marker.value new AMap.Marker({position:…

Ubuntu搭建java开发环境

一&#xff1a;Ubuntu安装 1、下载Ubuntu 24.04.1 LTS 官网下载地址&#xff1a;https://releases.ubuntu.com/24.04.1/ubuntu-24.04.1-desktop-amd64.iso 可以直接点击这里下载 2、使用VMware安装 新建虚拟机 之后一直下一步&#xff0c;到如下界面&#xff0c;选择 刚刚…

【MYSQL】聚合查询、分组查询、联合查询

目录 聚合查询聚合函数count()sum()avg()max()和min()总结 分组查询group by 子句having 子句 联合查询笛卡尔积内连接外连接自连接子查询单行子查询多行子查询from子句使用子查询 合并查询 聚合查询 聚合查询就是针对表中行与行之间的查询。 聚合函数 count() count(列名)&a…

战神5/战神:诸神黄昏/God of War Ragnarok(容量175GB)百度网盘下载

版本介绍 v1.0.612.4312|容量175GB|官方简体中文|支持键盘.鼠标.手柄|赠单板学习补丁 配置要求 战神5/战神&#xff1a;诸神黄昏/God of War Ragnarok 游戏介绍 不灭的北欧传奇 由Santa Monica Studio出品、Jetpack Interactive负责PC移植的佳作《God of War Ragnark》将带您…

python实现语音唤醒

1. 环境 python版本&#xff1a;3.11.9 2.完整代码 import sqlite3 import timefrom funasr import AutoModel import sounddevice as sd import numpy as np from pypinyin import lazy_pinyin# 模型参数设置 chunk_size [0, 10, 5] encoder_chunk_look_back 7 decoder_c…

气膜体育馆:低成本、高效益的体育空间解决方案—轻空间

随着全民健身和健康生活理念的兴起&#xff0c;各类体育场馆需求日益增加。在这样的市场背景下&#xff0c;气膜体育馆凭借其低成本、快速建造以及灵活多变的空间设计&#xff0c;成为现代体育场馆建设的新趋势。气膜技术为体育场馆提供了一种全新的解决方案&#xff0c;让运营…

Tomcat 漏洞复现

1、CVE-2017-12615 1、环境开启 2、首页抓包&#xff0c;修改为 PUT 方式提交 Tomcat允许适用put方法上传任意文件类型&#xff0c;但不允许isp后缀文件上传&#xff0c;因此需要配合 windows的解析漏洞 3、访问上传的jsp文件 4、使用工具进行连接 2、后台弱⼝令部署war包 1…

新建flask项目,配置入口文件,启动项目

pycharm新建flask项目时&#xff0c;会提供一个创建flask项目的导向&#xff0c;自动设置虚拟环境&#xff0c;并且安装flask及其依赖而vscode新建flask项目时&#xff0c;需要手动设置虚拟环境并安装flask&#xff0c;需要在终端使用pip install flask命令来安装flask及其依赖…

一文了解什么是大模型?到底大模型有什么用呢?

党中央、国务院面向未来准确把握时代大势&#xff0c;已于十三五期间部署推进数字中国建设&#xff0c;《国民经济和社会发展第十四个五年规划和2035年远景目标纲要》更是将“加快数字化发展&#xff0c;建设数字中国”单列成篇&#xff0c;要求“提高数字政府建设水平”&#…

Kettle的实战练习指南:从数据导入到ETL自动化

在数据集成和数据仓库建设中&#xff0c;Kettle作为一个强大的开源ETL工具&#xff0c;提供了灵活的数据抽取、转换和加载功能。本文将通过实战案例&#xff0c;详细介绍Kettle在数据导入、ETL流程设计、自动化任务调度等方面的应用。 一、数据导入 1. SQL语句导入 导入sql语…

机器人速度雅可比矩阵求解(2自由度平面关节机器人)

关节速度和末端速度空间的映射需要计算雅可比矩阵的逆矩阵,在博途PLC里如何计算一个方阵的逆矩阵,大家可以参考下面这篇文章: 博途PLC矩阵求逆 矩阵求逆 博图SCL_博图矩阵运算-CSDN博客文章浏览阅读839次。本文介绍如何用C语言实现矩阵求逆的过程,详细解析了相关代码,适…

Openai gym environment for multi-agent games

题意&#xff1a;用于多智能体游戏的 OpenAI Gym 环境 问题背景&#xff1a; Is it possible to use openais gym environments for multi-agent games? Specifically, I would like to model a card game with four players (agents). The player scoring a turn starts the…

如何使用地图Picker快捷接入地图服务?

在移动互联网的浪潮中&#xff0c;地图能力的使用已成为应用开发的关键领域。对于依赖地理位置信息的应用而言&#xff0c;用好地图服务不仅是基本要求&#xff0c;更是提升用户体验、实现个性化服务的关键。 但是在使用地图服务过程中&#xff0c;地图组件提供的设置参数种类…

Python学习——【4.5】数据容器:set集合

文章目录 【4.5】数据容器&#xff1a;set集合一、集合的定义格式二、集合的特点三、集合的常见操作四、集合的遍历 【4.5】数据容器&#xff1a;set集合 一、集合的定义格式 为什么使用集合 我们目前接触到了列表、元组、字符串三个数据容器了。基本满足大多数的使用场景。为…