【OCR项目】之用HALCON的深度学习工具进行文字识别,并导出到C++调用

前言

HALCON是一个强大的机器视觉工具,包含了2D,3D图像各种算子,以及各种任务的深度学习工具,包括目标检测,实例分割,文字识别等。

这次从实际生产的角度,来分享一下如何用HALCON进行文字识别。

衡量一个技术是否能在实际工业生产使用,要考虑的因素:

  • 最重要的一点,精度要高且稳定。在复杂的工业场景,需要能稳定的做到非常高的精度,而不是像简单的示例程序或者学生作品一样,只是学习和展示使用。这点HALCON的深度学习OCR可以满足大部分普通的工业场景。
    • 这里有一个细节,HALCON的版本越高,理论上提供的模型结构要越先进,预训练模型精度也越高。这里使用的是22.05的版本。
  • 速度要快。HALCON做深度学习OCR即使使用CPU进行识别,速度也非常快。
  • 需要能整合到实际开发的软件工程里。HALCON支持导出成C++,只需要少量的调整。

HALCON代码

HALCON的OCR和现在主流的字符识别任务一样,分成两阶段任务。

  • 文本检测Detection,识别出文本行的位置。
  • 文本识别Recognition,把Detection任务检测出来的文本行抠出来进行识别。

并且HALCON支持像上面图片这样倾斜的文字,下面是简单的实现代码和逐行解释。

* 读取图片
read_image (Image, 'D:/Project/OCR_demo.jpg')
* 获取显示窗口的句柄
dev_get_window (WindowHandle)
* 设置文字的字体和大小
set_font (WindowHandle, 'Courier New-Bold-' + round(26))
* 创建OCR识别句柄
create_deep_ocr ('mode', 'auto', DeepOcrHandle)
* 创建CPU/GPU设备句柄
query_available_dl_devices ('runtime', 'cpu', DLDeviceHandle)
* 设置OCR使用的设备
set_deep_ocr_param (DeepOcrHandle, 'device', DLDeviceHandle)* 记录开始时间
count_seconds(StartTime)
* 执行OCR
apply_deep_ocr (Image, DeepOcrHandle, 'auto', DeepOcrResult)
* 记录结束时间
count_seconds(EndTime)
* 计算耗时
Duration := EndTime - StartTime
* 绘制文字
write_string (WindowHandle, '耗时'+Duration+'s')* 获取结果
get_dict_tuple (DeepOcrResult, 'words', WordsRes)
* 获取文字区域的行坐标
get_dict_tuple (WordsRes, 'row', Rows)
* 获取文字区域的列坐标
get_dict_tuple (WordsRes, 'col', Cols)
* 获取文字区域的倾斜角度
get_dict_tuple (WordsRes, 'phi', Phis)
* 获取文字区域的矩形长边
get_dict_tuple (WordsRes, 'length1', Length1s)
* 获取文字区域的矩形短边
get_dict_tuple (WordsRes, 'length2', Length2s)
* 获取识别文字结果
get_dict_tuple (WordsRes, 'word', Words)
* 设置绘制模式为画轮廓
dev_set_draw('margin')
* 设置画线的宽度
dev_set_line_width (2)for Index := 0 to |Rows|-1 by 1* 绘制带方向的矩形disp_rectangle2(WindowHandle, Rows[Index], Cols[Index], Phis[Index], Length1s[Index], Length2s[Index])* 设置文字的坐标set_tposition(WindowHandle, Rows[Index],  Cols[Index])* 绘制文字write_string (WindowHandle, Words[Index])
endfor

上面的代码运行结果如下,可以看到HALCON在CPU上的速度也是非常快的。

导出C++

HALCON导出到C++也非常方便,只需要点击

【文件】-【导出程序】

需要注意的点是,上面的HALCON代码虽然在HALCON里运行没有问题,但是直接导出C++运行是会报错的。

因为上面使用的是HALCON自带的模型,导出C++之后,程序里是不带有这个模型的。所以需要将自带的模型导出,然后设置成使用这个模型来进行识别。

使用以下HALCON代码进行模型导出

* 创建自带的OCR模型
create_deep_ocr ('mode', 'auto', DeepOcrHandle)
* 设置导出模型的路径
Filename := 'D:/model.hdo'
* 导出模型
write_deep_ocr (DeepOcrHandle, Filename)

然后把上面的识别代码从创建默认OCR识别模型句柄,改成读取指定的模型。

* 创建OCR识别句柄
* create_deep_ocr ('mode', 'auto', DeepOcrHandle)
* 读取指定的模型
read_deep_ocr ('D:/model.hdo', DeepOcrHandle)

再进行C++代码导出,就可以使用了。

在C++工程里调用也非常简单,只需要包含halcon.dll,halconcppdll,halcondl.dll即可。

案例

在实际项目中,如果文字足够清晰,预处理足够干净,文本定位足够准确的话,即使使用默认的模型也能达到非常高的精度。

比如下面的例子,通过内容区域提取,透视变换,文本检测,文本位置精细定位,背景分割过滤等手段,将文本区域精准提取出来之后,直接使用默认的模型也可以达到很好的效果。

当然,在针对性的场景,通过标注对应的数据集,并在预训练模型的基础上进行针对性训练,可以达到一个更好的效果,这个步骤也很简单,后面机会再展开讲一下。

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

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

相关文章

Redis(01)——常用指令

基础指令 select 数字:切换到其他数据库flushdb:清空当前数据库flushall:清空所有数据库dbsize:查看数据库大小exists key1[key2 …]:判断当前的key是否存在keys *:查看所有的keyexpire key 时间&#xff…

STM32-串口解析框架

STM32 UART 是最基础的通信接口。本文介绍一种基于 STM32 UART 的通信协议解析框架。与其说是一种解析框架,不如说是一种解析架构,一种解析逻辑更为准确。 测试环境: Master MCU: STM32F103RCT6Slave Module:尚鑫航 SXH485 H200…

运维之道—生产环境安装Redis

目录 1.前言 2.环境准备 2.1 安装gcc依赖 3.部署安装 3.1 下载redis安装包 3.2 解压并编译安装redis 3.3 配置redis ​编辑3.4 启动redis并测试 4. 总结 1.前言 大家好,运维之道的系列文章继续进行,我们今天整理的是Redis生产环境的安装,Redis的安装以及生产环境的…

【数据结构与算法】1.数据结构绪论

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点&…

10-数组-区域和检索-数组不可变

这是数组的第10篇算法&#xff0c;力扣链接。 给定一个整数数组 nums&#xff0c;处理以下类型的多个查询: 计算索引 left 和 right &#xff08;包含 left 和 right&#xff09;之间的 nums 元素的 和 &#xff0c;其中 left < right 实现 NumArray 类&#xff1a; NumArr…

EOCR电机保护器带煤电厂的具体应用

EOCR系列电动机智能保护器在煤电厂中有广泛的应用。这些保护器具有齐全的保护功能、直观的测量参数、快速的反应灵敏度、可靠的行动以及与上位机通讯构成远程监控的能力&#xff0c;使其成为理想的低压电动机保护及远程监控产品。 在煤电厂中&#xff0c;电动机保护器需要具备过…

【Linux多线程】生产者消费者模型

目录 生产者消费者模型 1. 生产者消费者模式的概念 2. 生产者消费者模型优点 ​编辑3. 生产者消费者模型的特点 基于BlockingQueue&#xff08;阻塞队列&#xff09;的生产者消费者模型 1.BlockingQueue 2. 使用CSTL中的queue来模拟实现阻塞队列 3. 基于任务的生产者消费…

三天吃透Java集合面试八股文

内容摘自我的学习网站&#xff1a;topjavaer.cn 常见的集合有哪些&#xff1f; Java集合类主要由两个接口Collection和Map派生出来的&#xff0c;Collection有三个子接口&#xff1a;List、Set、Queue。 Java集合框架图如下&#xff1a; List代表了有序可重复集合&#xff0c…

Modbus网关BL101 既实现Modbus转MQTT,还能当串口服务器使用

随着工业4.0的迅猛发展&#xff0c;人们深刻认识到在工业生产和生活中&#xff0c;实时、可靠、安全的数据传输至关重要。在此背景下&#xff0c;高性能的工业电力数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于工业自动化系统、远程监控和物联网应用应用环境…

Linux第34步_TF-A移植的第2步_修改设备树和tf-a.tsv

在虚拟机中&#xff0c;使用VSCode打开linux /atk-mp1/atk-mp1/my-tfa/目录下tf-a.code-workspace”&#xff1b; 找到“tf-a-stm32mp-2.2.r1/fdts”目录&#xff0c;就是设备树文件所在的目录。 见下图&#xff1a; 一、修改“stm32mp157d-atk.dts” 修改后&#xff0c;见下…

【VTKExamples::PolyData】第十一期 ExtractPolyLinesFromPolyData

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例ExtractPolyLinesFromPolyData,并解析vtkCutter & vtkStripper,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)…

课题学习(十九)----Allan方差:陀螺仪噪声分析

一、介绍 Allan方差是一种分析时域数据序列的方法&#xff0c;用于测量振荡器的频率稳定性。该方法还可用于确定系统中作为平均时间函数的本征噪声。该方法易于计算和理解&#xff0c;是目前最流行的识别和量化惯性传感器数据中存在的不同噪声项的方法之一。该方法的结果与适用…

Window安装Python和开发Pycharm

准备&#xff1a; 1&#xff1a;安装Python环境 https://www.python.org/downloads/windows/ 2: 下载Pycharm https://www.jetbrains.com/pycharm/download/other.html

openGauss学习笔记-203 openGauss 数据库运维-常见故障定位案例-修改索引时只调用索引名提示索引不存在

文章目录 openGauss学习笔记-203 openGauss 数据库运维-常见故障定位案例-修改索引时只调用索引名提示索引不存在203.1 修改索引时只调用索引名提示索引不存在203.1.1 问题现象203.1.2 原因分析203.1.3 处理办法 openGauss学习笔记-203 openGauss 数据库运维-常见故障定位案例-…

Oracle1 数据库管理

Oracle的安装 一、基础表的创建 1.1 切换到scott用户 用sys 账户 登录 解锁scott账户 alter user scott account unlock;conn scott/tiger;发现并不存在scott账户&#xff0c;自己创建一个&#xff1f; 查找资料后发现&#xff0c;scott用户的脚本需要自己执行一下 C:\ap…

C++ //练习 2.28 说明下面的这些定义是什么意思,挑出其中不合法的。

C Primer&#xff08;第5版&#xff09; 练习 2.28 练习 2.28 说明下面的这些定义是什么意思&#xff0c;挑出其中不合法的。 ( a ) int i, *const cp; ( b ) int *p1, *const p2; ( c ) const int ic, &r ic; ( d ) const int *const p3; ( e ) const int *p; 环境…

多服务器对外提供一个浮动ip

浅调研了下浮动ip方案。主要是用来做高可用/灾备切换&#xff0c;同一时间只有一个服务器提供服务。 三个问题 无论是什么方案&#xff0c;都要解决这三个问题&#xff1a; 如何配置浮动ip如何实现故障检测如何切换浮动ip 浮动IP方案 第一种&#xff1a;主备手动配置ip&am…

cfssl简单使用

1、安装 方式1&#xff1a;直接下载 详见&#xff1a;手动生成证书 | Kubernetes # 1、下载cfssl、cfssljson、cfssl-certinfo # cfssl&#xff1a;用于签发证书 # cfssljson&#xff1a;将cfssl签发生成的证书(json格式)变成文件承载式文件 # cfssl-certinfo&#xff1a;验…

Docker设置获取环境变量

在Dockerfile中设置环境变量 在构建Docker镜像时&#xff0c;可以在Dockerfile中使用ENV指令来设置环境变量 ENV MY_ENV_VAR"ABC123" ENV指令用于设置环境变量&#xff0c;语法为 ENV <key> <value> ENV <key><value> 使用docker run命令…

【100个 Unity实用技能】☀️ | Unity中 过滤透明区域的点击事件

Unity 小知识 大智慧 &#x1f3ac; 博客主页&#xff1a;https://xiaoy.blog.csdn.net &#x1f3a5; 本文由 呆呆敲代码的小Y 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;Unity系统学习专栏 &#x1f332; 游戏制作专栏推荐&#x…