【iOS】——基于Vision Kit框架实现图片文字识别

文章目录

  • 前言
  • 一、文本识别的分类
  • 二、实现步骤
    • 1.导入Vision Kit框架
    • 2.创建请求处理器
    • 3.在请求处理器中设置文字识别功能
    • 4.将图片添加到请求处理器中
    • 5.发起文字识别请求
    • 6.处理识别结果
  • 三、运行结果测试
    • 1.纯英文环境
    • 2.中英文混合环境


前言

根据苹果的官方文档,Vision可以执行面部检测、文本检测、条形码识别、图像注册和一般功能跟踪。Vision还允许将自定义Core ML模型用于分类或对象检测等任务。下面只是对文本识别的一个学习。


一、文本识别的分类

Vision的文本识别分为两种方式。

第一种是快速路径(fast),它使用框架的字符检测功能来查找单个字符,然后使用小型机器学习模型来识别单个字符和单词,这种方法类似于传统的光学字符识别(OCR)。

第二种是准确路径(accurate),它使用神经网络查找字符串和行的文本,然后执行进一步分析以查找单个单词和句子。这种方法更符合人类阅读文本的方式。

这两种识别方式都在VNRecognizeTextRequest 类的 recognitionLevel 属性中,并且该属性为枚举类型:

VNRequestTextRecognitionLevelAccurate: 表示精确级别的文本识别。在这个级别下,识别结果的准确性较高,但可能会增加处理时间和资源消耗。
VNRequestTextRecognitionLevelFast: 表示快速级别的文本识别。在这个级别下,识别速度较快,但可能会牺牲一些准确性。

使用其中任意一个路径都可以选择应用基于自然语言处理(NLP)的语言校正阶段,以尽量减少误读的可能性。

流程图如下:

在这里插入图片描述

识别图像中的文本官方文档

二、实现步骤

实现文字识别总共分为六个步骤:

  • 第一步:导入Vision Kit框架
  • 第二步:创建请求处理器
  • 第三步:在请求处理器中设置文字识别功能
  • 第四步:将图片添加到请求处理器中
  • 第五步:发起文字识别请求
  • 第六步:处理识别结果

1.导入Vision Kit框架

1.打开需要导入的Xcode项目

2.在导航器面板中,选择您的项目文件

3.在项目设置中点击"General"选项卡,然后在"Frameworks, Libraries, and Embedded Content"(框架、库和嵌入内容)部分,点击"+"按钮。

在这里插入图片描述

4.在弹出窗口中,搜索并选择"Vision.framework"。

在这里插入图片描述

5.在项目文件中引入头文件

#import <Vision/Vision.h>
#import <VisionKit/VisionKit.h>

2.创建请求处理器

 // 创建一个请求处理器VNRecognizeTextRequest *request = [[VNRecognizeTextRequest alloc] initWithCompletionHandler:^(VNRequest * _Nonnull request, NSError * _Nullable error) {if (error) {NSLog(@"文字识别出错: %@", error);return;}}];

3.在请求处理器中设置文字识别功能

通过设置VNRecognizeTextRequest属性来设置文字识别功能

//设置参数
//搜索路径为准确路径request.recognitionLevel = VNRequestTextRecognitionLevelAccurate;//语言范围是英文或者简体中文request.recognitionLanguages = @[@"en-US", @"zh-Hans"];

使用 recognitionLanguages 属性来设置文本识别的语言范围。recognitionLanguages 是一个字符串数组,你可以将支持的语言标识符添加到数组中。

4.将图片添加到请求处理器中

创建了一个 VNImageRequestHandler 对象,并将需要识别的图像以 CGImage 的形式传入

 VNImageRequestHandler *handler = [[VNImageRequestHandler alloc] initWithCGImage:image.CGImage options:@{}];

5.发起文字识别请求

通过使用 VNImageRequestHandler 的 performRequests方法来实现

 // 发起文字识别请求NSError *error = nil;[handler performRequests:@[request] error:&error];if (error) {NSLog(@"文字识别请求出错: %@", error);}

6.处理识别结果

VNRecognizedTextObservation 类代表了 Vision 框架识别出的文本观察结果。使用 VNRecognizedTextObservation 对象的 topCandidates 方法返回一个数组,其中包含了识别结果的候选文本。

// 处理识别结果NSArray *results = request.results;for (VNRecognizedTextObservation *observation in results) {NSArray<VNRecognizedText *> *topCandidates = [observation topCandidates:1];if (topCandidates.count > 0) {VNRecognizedText *recognizedText = [topCandidates firstObject];NSString *text = recognizedText.string;NSLog(@"识别结果: %@", text);self.medicineLabel.text = text;} else {NSLog(@"没有找到候选文本");}}

三、运行结果测试

1.纯英文环境

1.准确路径下的运行结果
在这里插入图片描述

2.快速路径下的运行结果
在这里插入图片描述
可以看到在纯英文环境下,两种路径的识别准确率都是非常高的

2.中英文混合环境

1.准确路径下的运行结果
在这里插入图片描述
2.快速路径下的运行结果
在这里插入图片描述
在中英文混合环境下,虽然设置了识别范围是英文和简体中文但是准确路径只识别到了一个单词,快速路径虽然识别了一个字段但是准确率不是特别高

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

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

相关文章

【React】脚手架创建项目

文章目录 创建React项目目录结构分析了解PWA脚手架中的webpack 创建React项目 ◼ 创建React项目的命令如下&#xff1a; ​  注意&#xff1a;项目名称不能包含大写字母 ​  另外还有更多创建项目的方式&#xff0c;可以参考GitHub的readme 命令&#xff1a; create-rea…

NRF52832跟NRF52840性能区别 高端蓝牙智能手环穿戴应用

nRF52840可以说是nRF52832的超强升级版&#xff0c;虽然同样是蓝牙5.0&#xff0c;但是整体稳定性和性能上的提升却相差甚远&#xff0c;下面为大家简单讲解下NRF52832和NRF52840的性能上的区别&#xff01; 先说说共同点&#xff1a;这两款芯片都支持蓝牙5.0&#xff0c;MCU也…

Vue3前端h5移动端页面预览PDF使用pdfjs-dist,添加自定义文本水印

pdfjs-dist版本 pnpm i pdfjs-dist2.5.207 <script setup> import {ref, onMounted, watch} from vue import { useRoute } from "vue-router"; import * as pdfjsLib from pdfjs-distconst route useRoute() // &#xff01; pdfjsLib.GlobalWorkerOptions.w…

谷粒商城篇章8 ---- P236-P247 ---- 购物车【分布式高级篇五】

目录 1 环境搭建 1.1 新建购物车服务模块gulimall-cart 1.2 购物车服务相关配置 1.2.1 pom.xml 1.2.2 yml配置 1.2.2.1 application.yml配置 1.2.2.2 bootstrap.yml配置 1.2.3 主类 1.3 SwitchHosts增加配置 1.4 网关配置 1.5 整合SpringSession 1.5.1 session数据…

定义一个求圆面积的方法,并将计算结果保留5位小数

.尝试开发一个程序&#xff0c;定义一个求圆面积的方法&#xff0c;其中以圆半径作为参数&#xff0c;并将计算结果保留5位小数。 首先&#xff0c;在Java中&#xff0c;可以使用Math类中的常量Math.PI来表示圆周率。要使用Math.PI&#xff0c;你可以将其赋值给一个变量&#x…

禅道下载安装及基本使用(项目周期管理)实施必会!!!

文章目录 前言&#xff1a;一、为什么要使用禅道&#xff1f;二、禅道的下载与安装 前言&#xff1a; 禅道的使用能使公司提高项目管理效率、促进团队协作、支持敏捷开发&#xff0c;并可根据具体需求进行个性化配置。 本文章博主将以一个项目周期来带你们了解禅道。 一、为什…

SCSI/UFS储存架构/协议/电源管理/命令处理流程

UFS子系统架构 1.UFS协议 无论是ufs host controller部分还是ufs device部分&#xff0c;他们都将遵循统一的UFS规范 UFS Application Layer(UAP)应用层 1.UFS command set (UCS) UCS处理命令集&#xff0c;如读、写命令等&#xff0c;.使用的命令是简化的SCSI命令&#xff08;…

鸿蒙harmony--HTTP数据请求的简单使用

不得不承认&#xff0c;年龄越大性格就越简单&#xff0c;更喜欢安静&#xff0c;不喜欢去了解别人&#xff0c;也不想被了解&#xff0c;只想静静的做自己喜欢的事…… 目录 一&#xff0c;场景介绍 二&#xff0c;接口说明 三&#xff0c;http请求使用 一&#xff0c;场景介绍…

Python for循环练习-输入一个非负整数N,计算N的阶乘N!

题目&#xff1a;输入一个非负整数N&#xff0c;计算N的阶乘N&#xff01; 要计算非负整数N的阶乘&#xff08;N!&#xff09;&#xff0c;可以使用for循环来累乘从1到N的所有整数。 实现&#xff1a; # 读取用户输入的非负整数 n int(input("请输入一个非负整数&…

ora-12154无法解析指定的连接标识符

用户反映查询的时候报错ora-12154 这个系统只做历史数据查询使用&#xff0c;使用并不平凡&#xff0c;该数据库曾做过一次服务器间的迁移。 用户描述&#xff0c;所有oracle客户端查询该视图都报tns错误&#xff0c;一般ora-12154会发生在连接数据库时&#xff0c;因为tns配…

[文件IO]文件操作的几个笔试题

目录 1.扫描指定目录&#xff0c;找到要查询的文件名&#xff0c;并询问用户是否要删除 2. 文件的复制 3.扫描指定目录&#xff0c;并找到名称或者内容中包含指定字符的所有普通文件&#xff08;不包含目录&#xff09; 1.扫描指定目录&#xff0c;找到要查询的文件名&#x…

Hardware-Aware-Transformers开源项目笔记

文章目录 Hardware-Aware-Transformers开源项目笔记开源项目背景知识nas进化算法进化算法代码示例 开源项目Evolutionary Search1 生成延迟的数据集2 训练延迟预测器3 使延时约束运行搜索算法4. 训练搜索得到的subTransformer5. 根据重训练后的submodel 得到BLEU精度值 代码结构…

医学图像的图像处理、分割、分类和定位-1

一、说明 本报告全面探讨了应用于医学图像的图像处理和分类技术。开展了四项不同的任务来展示这些方法的多功能性和有效性。任务 1 涉及读取、写入和显示 PNG、JPG 和 DICOM 图像。任务 2 涉及基于定向变化的多类图像分类。此外&#xff0c;我们在任务 3 中包括了胸部 X 光图像…

java数据结构与算法刷题-----LeetCode977. 有序数组的平方

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 时间复杂度 空间复杂度 O(n * l o g 2 n log_2{n} log2​…

PyTorch 中的距离函数深度解析:掌握向量间的距离和相似度计算

目录 Pytorch中Distance functions详解 pairwise_distance 用途 用法 参数 数学理论公式 示例代码 cosine_similarity 用途 用法 参数 数学理论 示例代码 输出结果 pdist 用途 用法 参数 数学理论 示例代码 总结 Pytorch中Distance functions详解 pair…

Js面试之防抖与节流

Js面试之防抖与节流 防抖节流二者区别触发方式不同执行时间点不同 适用场景不同 最近在整理一些前端面试中经常被问到的问题&#xff0c;分为vue相关、react相关、js相关、react相关等等专题&#xff0c;可持续关注后续内容&#xff0c;会不断进行整理~ 防抖&#xff08;Deboun…

JVM工作原理与实战(十九):运行时数据区-方法区

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、运行时数据区 二、方法区 1.方法区介绍 2.方法区在Java虚拟机的实现 3.类的元信息 4.运行时常量池 5.字符串常量池 6.静态变量的存储 总结 前言 JVM作为Java程序的运行环境…

App分发测试平台:改变应用开发的游戏规则

App分发测试平台是一个提供应用开发者上传、测试、分享和发布应用的在线服务平台。它为开发者提供了一个高效的测试环境&#xff0c;并为用户提供了一个方便的应用获取渠道。其中&#xff0c;测试环节尤为关键&#xff0c;因为它能够确保应用在上线之前达到预期的功能和性能。 …

问题:Feem无法发送信息OR无法连接(手机端无法发给电脑端)

目录 前言 问题分析 资源、链接 其他问题 前言 需要在小米手机、华为平板、Dell电脑之间传输文件&#xff0c;试过安装破解的华为电脑管家、小米的MIUI文件传输等&#xff0c;均无果。&#xff08;小米“远程管理”ftp传输倒是可以&#xff0c;但速度太慢了&#xff0c;且…

Java JVM 堆、栈、方法区详解

目录 1. 栈 2. 堆 3. 方法区 4. 本地方法栈 5. 程序计数器 首先来看一下JVM运行时数据区有哪些。 1. 栈 在介绍JVM栈之前&#xff0c;先了解一下 栈帧 概念。 栈帧&#xff1a;一个栈帧随着一个方法的调用开始而创建&#xff0c;这个方法调用完成而销毁。栈帧内存放者方…