IOS自带的OCR识别功能

一、识别身份证

@interface IDCardScanViewController () <AVCaptureMetadataOutputObjectsDelegate>

@property (nonatomic, strong) AVCaptureSession *captureSession;

@end

@implementation IDCardScanViewController

  • (void)viewDidLoad {

super viewDidLoad\]; // 创建视频预览层 AVCaptureVideoPreviewLayer \*previewLayer = \[\[AVCaptureVideoPreviewLayer alloc\] initWithSession:self.captureSession\]; previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; previewLayer.frame = self.scanView.bounds; \[self.scanView.layer addSublayer:previewLayer\]; // 创建数据输出 AVCaptureMetadataOutput \*output = \[\[AVCaptureMetadataOutput alloc\] init\]; \[self.captureSession addOutput:output\]; \[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()\]; // 设置扫描支持的码类型 if (\[output.availableMetadataObjectTypes containsObject:AVMetadataObjectTypeIDCard\]) { output.metadataObjectTypes = @\[AVMetadataObjectTypeIDCard\]; } // 启动扫描 \[self.captureSession startRunning\]; } - (AVCaptureSession \*)captureSession { if (!_captureSession) { _captureSession = \[\[AVCaptureSession alloc\] init\]; // 配置摄像头输入 AVCaptureDevice \*device = \[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo\]; AVCaptureDeviceInput \*input = \[AVCaptureDeviceInput deviceInputWithDevice:device error:nil\]; \[_captureSession addInput:input\]; } return _captureSession; } - (void)captureOutput:(AVCaptureOutput \*)captureOutput didOutputMetadataObjects:(NSArray\<__kindof AVMetadataObject \*\> \*)metadataObjects fromConnection:(AVCaptureConnection \*)connection { for (AVMetadataObject \*metadata in metadataObjects) { if (\[metadata isKindOfClass:\[AVMetadataMachineReadableCodeObject class\]\]) { AVMetadataMachineReadableCodeObject \*code = (AVMetadataMachineReadableCodeObject \*)metadata; if (\[code.type isEqualToString:AVMetadataObjectTypeIDCard\]) { NSString \*result = code.stringValue; // 对扫描结果进行处理 NSLog(@"扫描结果:%@", result); } } } } 下面的方法需要iOS13以上才能支持 #import \ #import \ @interface ViewController () \ @end @implementation ViewController - (void)viewDidLoad { \[super viewDidLoad\]; // 在需要的地方调用此方法启动身份证扫描 \[self startDocumentCapture\]; } - (void)startDocumentCapture { VNDocumentCameraViewController \*documentCameraViewController = \[\[VNDocumentCameraViewController alloc\] init\]; documentCameraViewController.delegate = self; \[self presentViewController:documentCameraViewController animated:YES completion:nil\]; } #pragma mark - VNDocumentCameraViewControllerDelegate - (void)documentCameraViewController:(VNDocumentCameraViewController \*)controller didFinishWithScan:(VNDocumentCameraScan \*)scan { // 遍历扫描结果 for (NSUInteger pageIndex = 0; pageIndex \< scan.pageCount; pageIndex++) { VNPage \*page = \[scan pageAtIndex:pageIndex\]; // 检查扫描结果是否为身份证 if (\[self isIdentityCard:page\]) { // 获取身份证号码和姓名 NSString \*number = \[self identityCardNumberFromPage:page\]; NSString \*name = \[self identityCardNameFromPage:page\]; NSLog(@"身份证号码:%@", number); NSLog(@"姓名:%@", name); // 在这里进行身份证识别后的处理 } } // 关闭扫描视图控制器 \[controller dismissViewControllerAnimated:YES completion:nil\]; } - (void)documentCameraViewControllerDidCancel:(VNDocumentCameraViewController \*)controller { // 用户取消了扫描,关闭扫描视图控制器 \[controller dismissViewControllerAnimated:YES completion:nil\]; } - (void)documentCameraViewController:(VNDocumentCameraViewController \*)controller didFailWithError:(NSError \*)error { // 扫描失败,处理错误信息 NSLog(@"扫描身份证发生错误:%@", error); \[controller dismissViewControllerAnimated:YES completion:nil\]; } #pragma mark - Helper Methods - (BOOL)isIdentityCard:(VNPage \*)page { // 获取页面文本内容 NSString \*text = page.recognizedText.string; // 判断是否包含"公民身份号码"和"姓名"关键字 if (\[text containsString:@"公民身份号码"\] \&\& \[text containsString:@"姓名"\]) { return YES; } return NO; } - (NSString \*)identityCardNumberFromPage:(VNPage \*)page { // 获取页面文本内容 NSString \*text = page.recognizedText.string; // 查找身份证号码 NSRange range = \[text rangeOfString:@"公民身份号码"\]; if (range.location != NSNotFound) { NSString \*number = \[text substringFromIndex:range.location + range.length\]; number = \[number stringByReplacingOccurrencesOfString:@" " withString:@""\]; return number; } return nil; } - (NSString \*)identityCardNameFromPage:(VNPage \*)page { // 获取页面文本内容 NSString \*text = page.recognizedText.string; // 查找姓名 NSRange range = \[text rangeOfString:@"姓名"\]; if (range.location != NSNotFound) { NSString \*name = \[text substringFromIndex:range.location + range.length\]; name = \[name stringByReplacingOccurrencesOfString:@" " withString:@""\]; return name; } return nil; } @end **二、识别图片上的文字** #import \ @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { \[super viewDidLoad\]; UIImage \*image = \[UIImage imageNamed:@"test_image.jpg"\]; \[self recognizeTextInImage:image\]; } - (void)recognizeTextInImage:(UIImage \*)image { // 创建VNImageRequestHandler对象 VNImageRequestHandler \*requestHandler = \[\[VNImageRequestHandler alloc\] initWithCGImage:image.CGImage options:@{}\]; // 创建VNRecognizeTextRequest对象 VNRecognizeTextRequest \*textRequest = \[\[VNRecognizeTextRequest alloc\] initWithCompletionHandler:\^(VNRequest \* _Nonnull request, NSError \* _Nullable error) { // 处理识别结果 if (error == nil) { NSArray \*results = request.results; NSMutableString \*recognizedText = \[NSMutableString string\]; for (VNRecognizedTextObservation \*observation in results) { for (VNRecognizedText \*text in observation.topCandidates(1)) { \[recognizedText appendString:text.string\]; \[recognizedText appendString:@"\\n"\]; } } NSLog(@"识别结果:%@", recognizedText); // 在这里进行识别后的处理 } else { NSLog(@"识别出错:%@", error); } }\]; // 设置识别方式和语种 textRequest.recognitionLevel = VNRequestTextRecognitionLevelAccurate; textRequest.usesLanguageCorrection = YES; // 发送识别请求 NSError \*requestError = nil; \[requestHandler performRequests:@\[textRequest\] error:\&requestError\]; if (requestError != nil) { NSLog(@"发送识别请求出错:%@", requestError); } } @end

相关推荐
安和昂41 分钟前
【iOS】Tagged Pointer
macos·ios·cocoa
I烟雨云渊T10 小时前
iOS 阅后即焚功能的实现
macos·ios·cocoa
struggle202510 小时前
适用于 iOS 的 开源Ultralytics YOLO:应用程序和 Swift 软件包,用于在您自己的 iOS 应用程序中运行 YOLO
yolo·ios·开源·app·swift
Unlimitedz10 小时前
iOS视频编码详细步骤(视频编码器,基于 VideoToolbox,支持硬件编码 H264/H265)
ios·音视频
安和昂20 小时前
【iOS】SDWebImage源码学习
学习·ios
ii_best20 小时前
按键精灵ios脚本新增元素功能助力辅助工具开发(三)
ios
ii_best1 天前
按键精灵ios脚本新增元素功能助力辅助工具开发(二)
ios
ii_best1 天前
按键精灵ios脚本新增元素功能助力辅助工具开发(一)
ios
Swift社区1 天前
Swift实战:如何优雅地从二叉搜索树中挑出最接近的K个值
开发语言·ios·swift
I烟雨云渊T1 天前
iOS即时通信的技术要点
ios