iOS小技能:iOS13 证件扫描 & 文字识别API

本文涉及的产品
视觉智能开放平台,视频资源包5000点
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,分割抠图1万点
简介: 1. 应用场景:证件扫描、文字识别2. 原理:利用iOS13 VNDocumentCameraViewController的证件扫描和VNRecognizeTextRequest文字识别功能进行实现

引言

从CSDN下载Demo源码:https://download.csdn.net/download/u011018979/19262418

  1. 应用场景:证件扫描、文字识别
  2. 原理:利用iOS13 VNDocumentCameraViewController的证件扫描和VNRecognizeTextRequest文字识别功能进行实现
  3. 原理文章:https://kunnan.blog.csdn.net/article/details/117414243

在这里插入图片描述

I 、 iOS13 证件扫描API

VisionKit的VNDocumentCameraViewController

API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(macos, tvos, watchos)
@interface VNDocumentCameraViewController : UIViewController

II、iOS13 文字识别API

Vision的 VNRecognizeTextRequest

API_AVAILABLE(macos(10.15), ios(13.0), tvos(13.0))
@interface VNRecognizeTextRequest : VNImageBasedRequest <VNRequestProgressProviding>

效果图:

III 案例


#import "ViewController.h"

@interface ViewController ()

@end



@implementation ViewController

NSArray<VNRequest *> *requests;
dispatch_queue_t textRecognitionWorkQueue;

NSString *resultingText;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    
    // Parar e esconder o Indicador de atividade do OCR
    [self->activityIndicator stopAnimating];
    self->activityIndicator.hidden = YES;
    
    // Solicitar que o Vision seja executado em cada página do documento digitalizado.
    requests = [[NSArray<VNRequest *> alloc] init];
    
    // Cria a fila de expedição para executar solicitações do Vision.
    dispatch_queue_attr_t qos = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INITIATED, -1);
    textRecognitionWorkQueue = dispatch_queue_create("TextRecognitionQueue", qos);
    
    resultingText = @"";
    
    
    
    [self setupVision];
}

// Solicita o Setup do Vision, pois a solicitação pode ser reutilizada
- (void)setupVision {
    VNRecognizeTextRequest *textRecognitionRequest = [[VNRecognizeTextRequest alloc] initWithCompletionHandler:^(VNRequest * _Nonnull request, NSError * _Nullable error) {
        
        NSMutableArray *observations;
        @try {
            observations  = [[NSMutableArray alloc] init];
            for (VNRecognizedTextObservation *obs in request.results) {
                [observations addObject:(VNRecognizedTextObservation *)obs];
            }
        }
        @catch (NSException *exception) {
            NSLog(@"As observações são de um tipo inesperado.");
        }
        @finally {
            //NSLog(@"Condição final");
        }
        
        // Concatena o texto reconhecido de todas as observações.
        NSInteger maximumCandidates = 1;
        for (VNRecognizedTextObservation *observation in observations) {
            VNRecognizedText *candidate = [observation topCandidates:maximumCandidates].firstObject;
            resultingText = [NSString stringWithFormat:@"%@%@",
                             resultingText,
                             candidate.string];
        }
    }];
    // Especifica o nível de reconhecimento
    textRecognitionRequest.recognitionLevel = VNRequestTextRecognitionLevelAccurate;
    requests = @[textRecognitionRequest];
}

- (IBAction)scanReceipts:(id)sender {
    //Cria uma instancia da Classe de Leitura de Docs da Vision, e abre ela
    VNDocumentCameraViewController *documentCameraViewController = [[VNDocumentCameraViewController alloc] init];
    documentCameraViewController.delegate = self;
    
    [self presentModalViewController:documentCameraViewController animated:YES];
}


// MARK: VNDocumentCameraViewControllerDelegate


- (void)documentCameraViewController:(VNDocumentCameraViewController *)controller didFinishWithScan:(VNDocumentCameraScan *)scan {
    // Limpe qualquer texto existente.
    self->textView.text = @"";
    // Descartar a câmera de documentos
    [controller dismissModalViewControllerAnimated:YES];
    
    self->activityIndicator.hidden = NO;
    [self->activityIndicator startAnimating];
    
    dispatch_async(textRecognitionWorkQueue, ^{
        resultingText = @"";
        for (int pageIndex=0; pageIndex<scan.pageCount; pageIndex++) {
            struct CGImage *image = [scan imageOfPageAtIndex:pageIndex].CGImage;
            NSDictionary *d = [[NSDictionary alloc] init];
            VNImageRequestHandler *requestHandler = [[VNImageRequestHandler alloc] initWithCGImage:image options:d];
            NSError *error = nil;
            @try {
                [requestHandler performRequests:requests error:&error];
            }
            @catch (NSException *exception) {
                NSLog(@"%@", exception);
            }
            @finally {
                NSLog(@"Condição final");
            }
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            self->textView.text = resultingText;
            [self->activityIndicator stopAnimating];
            self->activityIndicator.hidden = YES;
        });
    });
}


@end

see also

iOS13扫描证件&银行卡信息识别;身份证识别 (正反) ;矩形边缘识别 ;自定义证件相机 (含demo源码)

————————————————
版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:[ https://blog.csdn.net/z929118967/article/details/111197419]( https://blog.csdn.net/z929118967/article/details/111197419
)
目录
相关文章
|
7月前
|
文字识别
文字识别OCR常见问题之拦截扫描件的识别如何解决
文字识别OCR(Optical Character Recognition)技术能够将图片或者扫描件中的文字转换为电子文本。以下是阿里云OCR技术使用中的一些常见问题以及相应的解答。
|
5月前
|
机器学习/深度学习 API iOS开发
探索iOS开发中的SwiftUI框架深入理解RESTful API设计原则与最佳实践
【7月更文挑战第30天】本文深入探讨了SwiftUI框架在iOS开发中的应用,分析了其对用户界面构建的简化方法及性能优化。通过比较传统UI构建方式与SwiftUI的差异,揭示了SwiftUI如何提高开发效率和用户体验。文章还讨论了SwiftUI在实际项目中的集成策略,并展望了其未来的发展方向。 【7月更文挑战第30天】在数字时代的浪潮中,RESTful API如同一座桥梁,连接着不同的软件系统。本文将探讨RESTful API的核心设计原则,揭示其背后的哲学思想,并通过实例分析展示如何将这些原则应用于实际开发中。我们将从资源定位、接口一致性到HTTP方法的恰当使用,逐一剖析,旨在为开发者提供
69 1
|
5月前
|
编解码 文字识别 API
印刷文字识别使用问题之如何有效拦截扫描件的识别
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
5月前
|
文字识别 小程序 安全
印刷文字识别操作报错合集之微信小程序调用API时路径总是返回不对,该如何处理
在使用印刷文字识别(OCR)服务时,可能会遇到各种错误。例如:1.Java异常、2.配置文件错误、3.服务未开通、4.HTTP错误码、5.权限问题(403 Forbidden)、6.调用拒绝(Refused)、7.智能纠错问题、8.图片质量或格式问题,以下是一些常见错误及其可能的原因和解决方案的合集。
|
5月前
|
文字识别 前端开发 API
印刷文字识别操作报错合集之通过HTTPS连接到OCR服务的API时报错,该如何处理
在使用印刷文字识别(OCR)服务时,可能会遇到各种错误。例如:1.Java异常、2.配置文件错误、3.服务未开通、4.HTTP错误码、5.权限问题(403 Forbidden)、6.调用拒绝(Refused)、7.智能纠错问题、8.图片质量或格式问题,以下是一些常见错误及其可能的原因和解决方案的合集。
|
5月前
|
文字识别 API
印刷文字识别操作报错合集之如何解决报错:The image type does not match the API operation.
在使用印刷文字识别(OCR)服务时,可能会遇到各种错误。例如:1.Java异常、2.配置文件错误、3.服务未开通、4.HTTP错误码、5.权限问题(403 Forbidden)、6.调用拒绝(Refused)、7.智能纠错问题、8.图片质量或格式问题,以下是一些常见错误及其可能的原因和解决方案的合集。
|
5月前
|
机器学习/深度学习 人工智能 文字识别
文本,文字扫描01,OCR文本识别技术展示,一个安卓App,一个简单的设计,文字识别可以应用于人工智能,机器学习,车牌识别,身份证识别,银行卡识别,PaddleOCR+SpringBoot+Andr
文本,文字扫描01,OCR文本识别技术展示,一个安卓App,一个简单的设计,文字识别可以应用于人工智能,机器学习,车牌识别,身份证识别,银行卡识别,PaddleOCR+SpringBoot+Andr
|
5月前
|
文字识别 API
印刷文字识别使用问题之API将全角括号识别为半角括号,该如何解决
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
5月前
|
XML JSON 文字识别
印刷文字识别操作报错合集之API调用过程中报错469,是什么导致的
在使用印刷文字识别(OCR)服务时,可能会遇到各种错误。例如:1.Java异常、2.配置文件错误、3.服务未开通、4.HTTP错误码、5.权限问题(403 Forbidden)、6.调用拒绝(Refused)、7.智能纠错问题、8.图片质量或格式问题,以下是一些常见错误及其可能的原因和解决方案的合集。
|
6月前
|
机器学习/深度学习 数据采集 文字识别
印刷文字识别产品使用合集之需要对子用户加什么权限,才能通过API访问
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
下一篇
DataWorks