我想在我的Mac App中使用Tesseract
,但识别文本会阻止整个应用程序。因此,我尝试使用dispatch_async
,但我的应用程序崩溃了EXC_BAD_ACCESS(在" tess->识别(0)"。
这是方法,我使用:
- (void)getText:(void(^)(NSString *response))handler {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
tess->Recognize(0);
char *text = tess->GetUTF8Text();
NSString *string = [NSString stringWithUTF8String:text];
delete [] text;
handler(string);
});
}
我认为这是ARC和tesseract的c ++实例的问题。使用__block
没有帮助。
更新
这是工作代码。希望这可能对某人有所帮助。
AppDelegate.m
...
[self processPage:myImage withCompletionHandler:^(NSString *text) {
NSLog(@"%@", text);
}];
...
- (void)processPage:(NSImage*)image withCompletionHandler:(void(^)(NSString *text))completion {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
Tesseract *tess = [[Tesseract alloc] initWithLanguage:@"deu"];
[tess setImageWithImage:image];
NSString *text = [tess getText];
completion(text);
});
}
Tesseract.mm
- (NSString*)getText {
tess->Recognize(0);
char *text = tess->GetUTF8Text();
NSString *string = [NSString stringWithUTF8String:text];
delete [] text;
return string;
}
答案 0 :(得分:1)
感谢您的帮助。
我最近找到了解决方案。我完成了我创建Tesseract类的完整代码,并将getText方法调用到调度块中。现在它有效。