基于Vision.framework从图片中提取文字 苹果在iOS 11中引入的Vision框架为OCR提供了基础能力,其核心组件VNRecognizeTextRequest
可实现高效文字检测与识别。结合VisionKit中的DocumentCameraViewController
,开发者可快速构建扫描界面,支持自动裁剪、透视校正等预处理功能。
技术优势:
- 硬件加速 :利用神经网络引擎(Neural Engine)实现低功耗、高帧率识别
- 隐私保护:所有计算在设备端完成,无需上传至云端
- 系统级优化:与iOS相机、相册系统深度集成
objectivec
#import <Foundation/Foundation.h>
#import <Vision/Vision.h>
NS_ASSUME_NONNULL_BEGIN
API_AVAILABLE(ios(11.0))
typedef void(^SBVisionTextCallBack)(NSError *error, NSArray<__kindof VNObservation*>* results);
API_AVAILABLE(ios(11.0))
@interface SBVisionText : NSObject
@property (nonatomic,copy)SBVisionTextCallBack resultBlock;
+ (void)sb_vision_text_image:(UIImage *)img result:(SBVisionTextCallBack) resultBlock;
@end
#import "SBVisionText.h"
@implementation SBVisionText
+ (void)sb_vision_text_image:(UIImage *)img result:(SBVisionTextCallBack) resultBlock{
if (@available(iOS 13.0, *)) {
VNRecognizeTextRequest *textRequest = [[VNRecognizeTextRequest alloc] initWithCompletionHandler:^(VNRequest * _Nonnull request, NSError * _Nullable error){
NSArray *observations = request.results;
// [self textRectangles:observations image:image complete:complete];
NSLog(@"sb_vision_text_image:%@",observations);
if (resultBlock) {
resultBlock(error,request.results);
}
}];
textRequest.recognitionLevel = VNRequestTextRecognitionLevelAccurate;
textRequest.usesLanguageCorrection = NO;
textRequest.recognitionLanguages = @[@"zh-Hans", @"en-US"];
// 转换CIImage
CIImage *convertImage = [[CIImage alloc]initWithImage:img];
// 创建处理requestHandler
VNImageRequestHandler *detectRequestHandler = [[VNImageRequestHandler alloc]initWithCIImage:convertImage options:@{}];
// 发送识别请求
[detectRequestHandler performRequests:@[textRequest] error:nil];
} else {
// Fallback on earlier versions
NSLog(@"Fallback on earlier versions");
}
}
@end
方法调用
swift
#import "SBVisionTextViewController.h"
#import "SBVisionText.h"
@implementation SBVisionTextViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (IBAction)getText:(UIButton *)sender {
[self getTextFormImage:[UIImage imageNamed:@"1681888102373.jpg"]];
}
-(void)getTextFormImage:(UIImage *)img{
if (@available(iOS 11.0, *)) {
[SBVisionText sb_vision_text_image:img result:^(NSError * _Nonnull error, NSArray<__kindof VNObservation *> * _Nonnull results) {
if (@available(iOS 13.0, *)) {
for (VNRecognizedTextObservation *observation in results) {
NSLog(@"%@", [observation topCandidates:1].firstObject.string);
}
} else {
NSLog(@"Fallback on earlier versions");
}
}];
} else {
NSLog(@"Fallback on earlier versions");
}
return;
}
@end