Vision的文本识别分为两种方式。
第一种是快速路径(fast),它使用框架的字符检测功能来查找单个字符,然后使用小型机器学习模型来识别单个字符和单词,这种方法类似于传统的光学字符识别(OCR)。
第二种是准确路径(accurate),它使用神经网络查找字符串和行的文本,然后执行进一步分析以查找单个单词和句子。这种方法更符合人类阅读文本的方式。
这两种识别方式都在VNRecognizeTextRequest 类的 recognitionLevel 属性中,并且该属性为枚举类型:
VNRequestTextRecognitionLevelAccurate: 表示精确级别的文本识别。在这个级别下,识别结果的准确性较高,但可能会增加处理时间和资源消耗。
VNRequestTextRecognitionLevelFast: 表示快速级别的文本识别。在这个级别下,识别速度较快,但可能会牺牲一些准确性。
#import <Vision/Vision.h>
#import <VisionKit/VisionKit.h>
// 创建一个请求处理器
VNRecognizeTextRequest *request = [[VNRecognizeTextRequest alloc] initWithCompletionHandler:^(VNRequest * _Nonnull request, NSError * _Nullable error) {
if (error) {
NSLog(@"文字识别出错: %@", error);
return;
}
}];
//设置参数
//搜索路径为准确路径
request.recognitionLevel = VNRequestTextRecognitionLevelAccurate;
//语言范围是英文或者简体中文
request.recognitionLanguages = @[/*@"en-US", */@"zh-Hans"];
UIImage *image = [UIImage imageNamed:@"chinese"];
VNImageRequestHandler *handler = [[VNImageRequestHandler alloc] initWithCGImage:image.CGImage options:@{}];
// 发起文字识别请求
NSError *error = nil;
[handler performRequests:@[request] error:&error];
if (error) {
NSLog(@"文字识别请求出错: %@", error);
}
// 处理识别结果
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);
} else {
NSLog(@"没有找到候选文本");
}
}