我正在使用OCR(Tesseract)来扫描图片。然而,Tesseract并不总是准确地识别单词和单词,如" kitchen"和#34;马铃薯"可以被认为是" k1thn"和" oolat0"。
要纠正'这些错误识别的单词我想使用库PermissiveResearch来搜索和匹配预定义的可能单词列表。
图书馆的工作非常出色,但有一个缺点。它只能在大型数据源中搜索一个单词。 OCR扫描的结果是多个单词的NSArray。
因此,合乎逻辑的做法是迭代NSArray,如:
for (ScannedWord *scannedWord in inputArray) {
[[PermissiveResearchDatabase sharedDatabase] searchString:scannedWord.name withOperation:ScoringOperationTypeExact];
}
我遇到的问题是,搜索的结果是在委托方法(-(void)searchCompletedWithResults:(NSArray *)results
)中捕获的,该方法在完成后仅被称为一次搜索。即使我正在遍历NSArray并多次调用[[PermissiveResearchDatabase sharedDatabase] searchString:scannedWord.name withOperation:ScoringOperationTypeExact];
。
如何使用此库在NSArray上进行许可搜索?
或者您推荐不同的方法(使用不同的库)?
答案 0 :(得分:1)
你能从inputArray
只用一个单词开始匹配,并从委托方法继续数组的其余部分吗?
START:
self.copyArray = [inputArray mutableCopy];
NSDictionary * scannedWord = [self.copyArray objectAtIndex:0];
[copyArray removeObjectAtIndex:0];
[[PermissiveResearchDatabase sharedDatabase] searchString:scannedWord.name withOperation:ScoringOperationTypeExact];
INSIDE DELEGATE(成功或错误继续处理inputArray
if(self.copyArray.count > 0)
{
NSDictionary * scannedWord = [self.copyArray objectAtIndex:0];
[copyArray removeObjectAtIndex:0];
[[PermissiveResearchDatabase sharedDatabase] searchString:scannedWord.name withOperation:ScoringOperationTypeExact];
}
这样,你将在每个时候迭代inputArray元素,在我看来不会省略任何元素。
顺便说一下,我没有xcode
因此,代码中的偏移是错误的
答案 1 :(得分:0)
我还没有对此进行测试,并不清楚PermissiveResearch库是否支持并发操作,但您应该可以使用类似的东西
NSOperationQueue* aQueue = [[NSOperationQueue alloc] init];
// If you find problems with concurrency you can limit the queue to a single operation at a time -
// aQueue.maxConcurrentOperationCount=1;
NSMutableArray *outputArray=[inputArray mutableCopy];
NSMutableArray *operationArray=[NSMutableArray new];
for (int i=0;i<inputArray;i++) {
operation = [ExactScoringOperation new];
operation.searchedString = inputArray[i];
SearchCompletionBlock block = ^(NSArray *results) {
@synchronized(outputArray) {
outputArray[i]=results[0];
}
};
[operation setCustomCompletionBlock:block];
[operationArray addObject:operation];
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[aQueue addOperations:operationArray waitUntilFinished:YES];
// Output array now contains the updated words.
// Perform any UI updates on the main queue
});