iOS 文本二维码识别

news/2024/11/24 11:30:05/

在 WWDC 2022,苹果发布了VisionKit 中的 DataScannerViewController,这是一个可以在本地无网络状态下识别文本以及条形码的视图控制器,它的相应速度以及精度都是比较高的,他可以支持汉语(简繁版均支持)、英语、日语、韩语、法语、意大利语、德语、西班牙语、葡萄牙语等 9 种语言。 WWDChttps://developer.apple.com/videos/play/wwdc2022/10026/

使用限制:
iOS 设备必须是 A12 或者更新的新版、系统必须为 iOS16 以及以上版本
官方文档

1. 如何扫码以及识别文字

1.1 检查设备

就像上面提到的一样,只有安装了 A12 以及更新芯片的设备才可以使用 DataScannerViewController,所以在使用前需要检查:

import VisionKit// 检查设备是否支持
guard DataScannerViewController.isSupported else {print("This device is NOT supported")return
}

下面这些设备是 2018年发布,是第一批安装 A12 芯片的设备:

  1. iPhone XS
  2. iPhone XS Max
  3. iPhone XR
  4. 5代 iPad Mini
  5. 3 代 iPad Air
  6. 8 代 iPad

如果 DataScannerViewController 在 App 中是一个必不可少的功能,则可以通过在 Info.plist 文件的 “Required device capabilities” 中添加 “iPhone / iPad Minimum Performance A12” 来限制 App 只可以在安装 A12 芯片的设备中使用
在这里插入图片描述

1.2 请求相机权限

在 Info.plist 文件中添加 「Privacy — Camera Usage Description」Key,并补充描述信息

在这里插入图片描述

然后根据下面的代码请求相机权限:

AVCaptureDevice.requestAccess(for: .video) { granted inguard granted else {print("相机权限未授权. 请在设置中添加权限")return}/// NOTE: 需要特别注意,需要在主线程中展示 DataScannerViewController,否则可能出现 runtime 错误DispatchQueue.main.async { [weak self] inguard let strongSelf = self else { return}strongSelf.showDataScannerViewController()}
}

如何设置请求权限信息支持多语言:

  1. 创建 InfoPlist.strings
  2. 使用本地化 key NSCameraUsageDescription 填写多语言文本
    官方论坛

1.3 创建 DataScannerViewController

DataScannerViewController 有七个属性可以在初始化时进行配置,并且这些属性都是只读的,在执行的时候是不可以修改的。

  1. recognizedDataTypes
    支持识别的数据类型,是一组 Option 数据类型,包括文本、条形码、二维码等

  2. qualityLevel
    .balanced 平衡
    .fast 快速
    .accurate 精确

  3. recognizesMultipleItems 默认为 false

  4. isHighFrameRateTrackingEnabled 默认为 true

  5. isPinchToZoomEnabled 默认为 true

  6. isGuidanceEnabled 默认为 true
    在这里插入图片描述

  7. isHighlightingEnabled 默认为 false

// 创建 `DataScannerViewController`
let dataScannerViewController = DataScannerViewController(recognizedDataTypes: [.text(), .barcode()],qualityLevel: .accurate,recognizesMultipleItems: true,isHighFrameRateTrackingEnabled: true,isPinchToZoomEnabled: true,isGuidanceEnabled: true,isHighlightingEnabled: true)  

1.4 使用

我们可以在视图控制器中,通过模态推出 dataScannerViewController 来开始扫描文本和条形码

present(dataScannerViewController, animated: true) {do {// 开始扫码try dataScannerViewController.startScanning()} catch {print("Error on scanning: \(error.localizedDescription)")   }
}

1.5 效果

这些文本和条形码都可以被识别
请添加图片描述

2. 如何获取识别的内容

我们需要实现 DataScannerViewController 的代理 DataScannerViewControllerDelegate,来监听被识别的文本和条形码,

// Set the delegate to your `UIViewController`
dataScannerViewController.delegate = selfextension YourOwnViewController: DataScannerViewControllerDelegate {}

只要监测到任何可以识别的文本或者二维码,都会触发 didAdd 回调方法

/// Called when the the scanner recognizes new items in the scene.
/// - Parameters:
///   - dataScanner: The DataScannerViewController object providing the update.
///   - addedItems: The newly recognized items.
///   - allItems: The new complete collection of items remaining after adding `addedItems`.
func dataScanner(_ dataScanner: DataScannerViewController, didAdd addedItems: [RecognizedItem], allItems: [RecognizedItem]) {addedItems.forEach { recognizedItem inswitch recognizedItem {case .text(let text):print("DataScannerViewControllerDelegate: didAdd new items - \(text.transcript)")case .barcode(let barcode):print("DataScannerViewControllerDelegate: didAdd new items - \(barcode.payloadStringValue ?? "")")}}
}

然而,只要新的视频帧被扫描,新识别的内容会更新或者移除已被识别的文本或者条形码。所以,我们也需要实现 didUpdate 以及 didRemove 的回调

/// Called when the the scanner updates the geometry or content of an item previously recognized in the scene.
/// - Parameters:
///   - dataScanner: The DataScannerViewController object providing the update.
///   - updatedItems: the items that have been updated.
///   - allItems: The complete collection of items.
func dataScanner(_ dataScanner: DataScannerViewController, didUpdate updatedItems: [RecognizedItem], allItems: [RecognizedItem]) {updatedItems.forEach { recognizedItem inswitch recognizedItem {case .text(let text):print("DataScannerViewControllerDelegate: didUpdate updated items - \(text.transcript)")case .barcode(let barcode):print("DataScannerViewControllerDelegate: didUpdate updated items - \(barcode.payloadStringValue ?? "")")}}
}
/// Called when the scanner no longer sees a previously recognized item in the scene.
/// - Parameters:
///   - dataScanner: The DataScannerViewController object providing the update.
///   - removedItems: The items that were removed.
///   - allItems: The new complete collection of items remaining after removing `removedItems`.
func dataScanner(_ dataScanner: DataScannerViewController, didRemove removedItems: [RecognizedItem], allItems: [RecognizedItem]) {removedItems.forEach { recognizedItem inswitch recognizedItem {case .text(let text):print("DataScannerViewControllerDelegate: didRemove removed items - \(text.transcript)")case .barcode(let barcode):print("DataScannerViewControllerDelegate: didRemove removed items - \(barcode.payloadStringValue ?? "")")}}
}

3. 总结

DataScannerViewController 是内置在 VisionKit 中的 UIViewController。它是通过 Google Cloud Vision 的 API 以及 Amazon Rekognition API 的服务来实现的,可以监测 9 种语言以及条形码和二维条形码,监测速度又快又准,不过目前只可以运行在 A12 芯片以及 iOS 16以及以上版本的系统


http://www.ppmy.cn/news/37890.html

相关文章

城市新型智慧能源体系建设的初步解决方案

为加快推进国家“双碳”战略和新型能源体系建设,努力实现负荷控制和用户精细化管理,按照“政府主导、电网组织、政企协同、用户实施”的指导原则,多地成立市/县级电力负荷管理中心,包括浙江宁波、慈溪、辽宁大连、湖南株洲、娄底、…

JDBC---查询所有学生信息的页面运行后报错:

原代码&#xff1a; <% page import"java.sql.Connection" %> <% page import"java.sql.DriverManager" %> <% page import"java.sql.PreparedStatement" %> <% page import"java.sql.ResultSet" %><%--C…

Python 自动化指南(繁琐工作自动化)第二版:零、前言

关于作者 Al Sweigart 是一名软件开发人员和技术书籍作者。Python 是他最喜欢的编程语言&#xff0c;他是该语言的几个开源模块的开发者。他的其他书籍可以在他的网站上根据知识共享许可免费获得。他的猫现在重 11 磅。 关于技术评审 Philip James 从事 Python 工作已经超过…

【Go基础】一篇文章带你全面了解学习—切片

目录 1、切片注意点 2、声明切片 3、切片初始化 4、切片的内存布局

P5717 【深基3.习8】三角形分类

题目描述 给出三条线段 a,b,ca,b,c 的长度&#xff0c;均是不大于 1000010000 的正整数。打算把这三条线段拼成一个三角形&#xff0c;它可以是什么三角形呢&#xff1f; 如果三条线段不能组成一个三角形&#xff0c;输出Not triangle&#xff1b;如果是直角三角形&#xff0c;…

[Java]SpringBoot配置参数

偶尔忘记怎么获取配置的参数&#xff0c;备忘一下。 Spring Boot会自动识别正确的配置文件&#xff08;.properties或.yml&#xff09;并加载其中的属性。 例如&#xff1a;application.properties与application.yml读取机制为 Environment &#xff0c;它将配置抽象为Propert…

Java摘要算法学习日记

Java摘要算法学习日记摘要的作用MD家族的摘要算法sha(安全散列算法)MAC(含有秘钥的散列函数算法)摘要的作用 摘要的作用主要是验证数据的完整性 举个例子: 我们去apche下载jar包时网页上有个sha512的链接&#xff0c;点击后会看到一串sha512摘要值 b6d517db15aedc424d112b8f3…

代码随想录算法训练营第四十九天| 121 买卖股票的最佳时机 122 买卖股票的最佳时机II

代码随想录算法训练营第四十九天| 121 买卖股票的最佳时机 122 买卖股票的最佳时机II LeetCode 121 买卖股票的最佳时机 题目: 121.买卖股票的最佳时机 动规五部曲&#xff1a; 确定dp数组以及下标的含义 **dp[i][0] 表示第i天持有股票所得最多现金 ** 确定递推公式 dp[…