1
- #import < ExecutorchLib/ETModel.h>
2
- #import < React/RCTBridgeModule.h>
3
1
#import " OCR.h"
4
- #import " utils/Fetcher.h"
5
- #import " utils/ImageProcessor.h"
6
2
#import " models/ocr/Detector.h"
7
3
#import " models/ocr/RecognitionHandler.h"
4
+ #import " utils/Fetcher.h"
5
+ #import " utils/ImageProcessor.h"
6
+ #import < ExecutorchLib/ETModel.h>
7
+ #import < React/RCTBridgeModule.h>
8
8
9
9
@implementation OCR {
10
10
Detector *detector;
@@ -14,70 +14,103 @@ @implementation OCR {
14
14
RCT_EXPORT_MODULE ()
15
15
16
16
- (void )loadModule:(NSString *)detectorSource
17
- recognizerSourceLarge:(NSString *)recognizerSourceLarge
18
- recognizerSourceMedium:(NSString *)recognizerSourceMedium
19
- recognizerSourceSmall:(NSString *)recognizerSourceSmall
20
- symbols:(NSString *)symbols
21
- languageDictPath:(NSString *)languageDictPath
22
- resolve:(RCTPromiseResolveBlock)resolve
23
- reject:(RCTPromiseRejectBlock)reject {
17
+ recognizerSourceLarge:(NSString *)recognizerSourceLarge
18
+ recognizerSourceMedium:(NSString *)recognizerSourceMedium
19
+ recognizerSourceSmall:(NSString *)recognizerSourceSmall
20
+ symbols:(NSString *)symbols
21
+ languageDictPath:(NSString *)languageDictPath
22
+ resolve:(RCTPromiseResolveBlock)resolve
23
+ reject:(RCTPromiseRejectBlock)reject {
24
24
detector = [[Detector alloc ] init ];
25
- [detector loadModel: [NSURL URLWithString: detectorSource] completion: ^(BOOL success, NSNumber *errorCode) {
26
- if (!success) {
27
- NSError *error = [NSError errorWithDomain: @" OCRErrorDomain"
28
- code: [errorCode intValue ]
29
- userInfo: @{NSLocalizedDescriptionKey : [NSString stringWithFormat: @" %ld " , (long )[errorCode longValue ]]}];
30
- reject (@" init_module_error" , @" Failed to initialize detector module" , error);
31
- return ;
32
- }
33
- [Fetcher fetchResource: [NSURL URLWithString: languageDictPath] resourceType:ResourceType: :TXT completionHandler: ^(NSString *filePath, NSError *error) {
34
- if (error) {
35
- reject (@" init_module_error" , @" Failed to initialize converter module" , error);
36
- return ;
37
- }
38
-
39
- self->recognitionHandler = [[RecognitionHandler alloc ] initWithSymbols: symbols languageDictPath: filePath];
40
- [self ->recognitionHandler loadRecognizers: recognizerSourceLarge mediumRecognizerPath: recognizerSourceMedium smallRecognizerPath: recognizerSourceSmall completion: ^(BOOL allModelsLoaded, NSNumber *errorCode) {
41
- if (allModelsLoaded) {
42
- resolve (@(YES ));
43
- } else {
44
- NSError *error = [NSError errorWithDomain: @" OCRErrorDomain"
45
- code: [errorCode intValue ]
46
- userInfo: @{NSLocalizedDescriptionKey : [NSString stringWithFormat: @" %ld " , (long )[errorCode longValue ]]}];
47
- reject (@" init_recognizer_error" , @" Failed to initialize one or more recognizer models" , error);
25
+ [detector
26
+ loadModel: [NSURL URLWithString: detectorSource]
27
+ completion: ^(BOOL success, NSNumber *errorCode) {
28
+ if (!success) {
29
+ NSError *error = [NSError
30
+ errorWithDomain: @" OCRErrorDomain"
31
+ code: [errorCode intValue ]
32
+ userInfo: @{
33
+ NSLocalizedDescriptionKey : [NSString
34
+ stringWithFormat: @" %ld " , (long )[errorCode longValue ]]
35
+ }];
36
+ reject (@" init_module_error" , @" Failed to initialize detector module" ,
37
+ error);
38
+ return ;
48
39
}
40
+ [Fetcher fetchResource: [NSURL URLWithString: languageDictPath]
41
+ resourceType:ResourceType: :TXT
42
+ completionHandler: ^(NSString *filePath, NSError *error) {
43
+ if (error) {
44
+ reject (@" init_module_error" ,
45
+ @" Failed to initialize converter module" , error);
46
+ return ;
47
+ }
48
+
49
+ self->recognitionHandler =
50
+ [[RecognitionHandler alloc ] initWithSymbols: symbols
51
+ languageDictPath: filePath];
52
+ [self ->recognitionHandler
53
+ loadRecognizers: recognizerSourceLarge
54
+ mediumRecognizerPath: recognizerSourceMedium
55
+ smallRecognizerPath: recognizerSourceSmall
56
+ completion: ^(BOOL allModelsLoaded,
57
+ NSNumber *errorCode) {
58
+ if (allModelsLoaded) {
59
+ resolve (@(YES ));
60
+ } else {
61
+ NSError *error = [NSError
62
+ errorWithDomain: @" OCRErrorDomain"
63
+ code: [errorCode intValue ]
64
+ userInfo: @{
65
+ NSLocalizedDescriptionKey :
66
+ [NSString stringWithFormat:
67
+ @" %ld " ,
68
+ (long )[errorCode
69
+ longValue ]]
70
+ }];
71
+ reject (@" init_recognizer_error" ,
72
+ @" Failed to initialize one or more "
73
+ @" recognizer models" ,
74
+ error);
75
+ }
76
+ }];
77
+ }];
49
78
}];
50
- }];
51
- }];
52
79
}
53
80
54
81
- (void )forward : (NSString *)input
55
82
resolve : (RCTPromiseResolveBlock)resolve
56
83
reject : (RCTPromiseRejectBlock)reject {
57
84
/*
58
85
The OCR consists of two phases:
59
- 1. Detection - detecting text regions in the image, the result of this phase is a list of bounding boxes.
60
- 2. Recognition - recognizing the text in the bounding boxes, the result is a list of strings and corresponding confidence scores.
61
-
62
- Recognition uses three models, each model is resposible for recognizing text of different sizes (e.g. large - 512x64, medium - 256x64, small - 128x64).
86
+ 1. Detection - detecting text regions in the image, the result of this phase
87
+ is a list of bounding boxes.
88
+ 2. Recognition - recognizing the text in the bounding boxes, the result is a
89
+ list of strings and corresponding confidence scores.
90
+
91
+ Recognition uses three models, each model is resposible for recognizing text
92
+ of different sizes (e.g. large - 512x64, medium - 256x64, small - 128x64).
63
93
*/
64
94
@try {
65
95
cv::Mat image = [ImageProcessor readImage: input];
66
- NSArray * result = [detector runModel: image];
96
+ NSArray * result = [detector runModel: image];
67
97
cv::Size detectorSize = [detector getModelImageSize ];
68
98
cv::cvtColor (image, image, cv::COLOR_BGR2GRAY);
69
- result = [self ->recognitionHandler recognize: result imgGray: image desiredWidth: detectorSize.width * recognizerRatio desiredHeight: detectorSize.height * recognizerRatio];
99
+ result = [self ->recognitionHandler
100
+ recognize: result
101
+ imgGray: image
102
+ desiredWidth: detectorSize.width * recognizerRatio
103
+ desiredHeight: detectorSize.height * recognizerRatio];
70
104
resolve (result);
71
105
} @catch (NSException *exception ) {
72
- reject (@" forward_error" , [ NSString stringWithFormat: @" %@ " , exception .reason],
73
- nil );
106
+ reject (@" forward_error" ,
107
+ [ NSString stringWithFormat: @" %@ " , exception .reason], nil );
74
108
}
75
109
}
76
110
77
111
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule :
78
- (const facebook::react::ObjCTurboModule::InitParams &)params {
79
- return std::make_shared<facebook::react::NativeOCRSpecJSI>(
80
- params);
112
+ (const facebook::react::ObjCTurboModule::InitParams &)params {
113
+ return std::make_shared<facebook::react::NativeOCRSpecJSI>(params);
81
114
}
82
115
83
116
@end
0 commit comments