|
8 | 8 |
|
9 | 9 | #import "G8RecognitionTestsHelper.h" |
10 | 10 |
|
| 11 | +static NSString *const kG8Languages = @"eng"; |
| 12 | + |
| 13 | +@interface G8RecognitionTestsHelper () |
| 14 | + |
| 15 | +@property (nonatomic, strong, readwrite) G8Tesseract *tesseract; |
| 16 | + |
| 17 | +@end |
| 18 | + |
11 | 19 | @implementation G8RecognitionTestsHelper |
12 | 20 |
|
13 | 21 | - (id)init |
14 | 22 | { |
15 | 23 | self = [super init]; |
16 | 24 | if (self != nil) { |
| 25 | + _engineMode = G8OCREngineModeTesseractOnly; |
| 26 | + _pageSegmentationMode = G8PageSegmentationModeAuto; |
| 27 | + _charWhitelist = @""; |
| 28 | + _waitDeadline = 180.0; |
| 29 | + _maxExpectedRecognitionTime = 185.0; |
| 30 | + _rect = CGRectZero; |
| 31 | + _sourceResolution = 0; |
| 32 | + |
17 | 33 | _customPreprocessingType = G8CustomPreprocessingNone; |
18 | 34 | _boundingSizeForResizing = CGSizeMake(700.0f, 700.0f); |
19 | 35 | } |
20 | 36 | return self; |
21 | 37 | } |
22 | 38 |
|
| 39 | +- (void)waitTimeLmit:(NSTimeInterval)maximumWait whileTrue:(BOOL (^)())shouldKeepRunning |
| 40 | +{ |
| 41 | + NSDate *deadlineDate = [NSDate dateWithTimeInterval:maximumWait sinceDate:[NSDate date]]; |
| 42 | + BOOL isDeadline = NO; |
| 43 | + while (shouldKeepRunning != nil && shouldKeepRunning() && isDeadline == NO) { |
| 44 | + if ([[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:deadlineDate] == NO) { |
| 45 | + break; |
| 46 | + } |
| 47 | + isDeadline = [[NSDate date] compare:deadlineDate] == NSOrderedDescending; |
| 48 | + } |
| 49 | +}; |
| 50 | + |
| 51 | +- (void)setupTesseract |
| 52 | +{ |
| 53 | + self.tesseract.delegate = self; |
| 54 | + |
| 55 | + self.tesseract.language = kG8Languages; |
| 56 | + self.tesseract.engineMode = self.engineMode; |
| 57 | + self.tesseract.pageSegmentationMode = self.pageSegmentationMode; |
| 58 | + |
| 59 | + self.tesseract.charWhitelist = self.charWhitelist; |
| 60 | + self.tesseract.maximumRecognitionTime = self.waitDeadline; |
| 61 | +}; |
| 62 | + |
| 63 | +- (void)setupImage |
| 64 | +{ |
| 65 | + self.tesseract.image = [self.image g8_blackAndWhite]; |
| 66 | + |
| 67 | + if (CGRectEqualToRect(self.rect, CGRectZero) == NO) { |
| 68 | + self.tesseract.rect = self.rect; |
| 69 | + } |
| 70 | + |
| 71 | + if (self.sourceResolution > 0) { |
| 72 | + self.tesseract.sourceResolution = self.sourceResolution; |
| 73 | + } |
| 74 | +} |
| 75 | + |
| 76 | +- (void)recognizeImage |
| 77 | +{ |
| 78 | + self.tesseract = [[G8Tesseract alloc] init]; |
| 79 | + [self setupTesseract]; |
| 80 | + [self setupImage]; |
| 81 | + |
| 82 | + [self.tesseract recognize]; |
| 83 | +}; |
| 84 | + |
| 85 | +- (void)recognizeImageUsingOperation |
| 86 | +{ |
| 87 | + G8RecognitionOperation *operation = [[G8RecognitionOperation alloc] init]; |
| 88 | + self.tesseract = operation.tesseract; |
| 89 | + [self setupTesseract]; |
| 90 | + |
| 91 | + [self setupImage]; |
| 92 | + |
| 93 | + __weak __typeof(self) weakSelf = self; |
| 94 | + |
| 95 | + self.tesseract = nil; |
| 96 | + operation.recognitionCompleteBlock = ^(G8Tesseract *recognizedTesseract) { |
| 97 | + __strong __typeof(weakSelf) strongSelf = weakSelf; |
| 98 | + |
| 99 | + strongSelf.tesseract = recognizedTesseract; |
| 100 | + }; |
| 101 | + |
| 102 | + NSOperationQueue *queue = [[NSOperationQueue alloc] init]; |
| 103 | + [queue addOperation:operation]; |
| 104 | + |
| 105 | + [self waitTimeLmit:self.maxExpectedRecognitionTime whileTrue:^BOOL{ |
| 106 | + __strong __typeof(weakSelf) strongSelf = weakSelf; |
| 107 | + |
| 108 | + return (BOOL)(strongSelf.tesseract == nil); |
| 109 | + }]; |
| 110 | + |
| 111 | + if (self.tesseract == nil) { |
| 112 | + [NSException raise:@"Tesseract stopped" format:@"Tesseract worked too long"]; |
| 113 | + } |
| 114 | +}; |
| 115 | + |
| 116 | +- (UIImage *)thresholdedImageForImage:(UIImage *)sourceImage |
| 117 | +{ |
| 118 | + self.tesseract = [[G8Tesseract alloc] init]; |
| 119 | + [self setupTesseract]; |
| 120 | + |
| 121 | + self.tesseract.image = [sourceImage g8_blackAndWhite]; |
| 122 | + |
| 123 | + return self.tesseract.thresholdedImage; |
| 124 | +}; |
| 125 | + |
23 | 126 | - (UIImage *)preprocessedImageForTesseract:(G8Tesseract *)tesseract sourceImage:(UIImage *)sourceImage |
24 | 127 | { |
25 | 128 | switch (self.customPreprocessingType) { |
|
0 commit comments