Skip to content
This repository was archived by the owner on Nov 19, 2024. It is now read-only.

Commit 2b06655

Browse files
tatiesmarsmithun-mondal
authored andcommitted
[firebase_ml_vision] Add support for cloud text recognizer (flutter#1847)
1 parent 71ad08c commit 2b06655

10 files changed

Lines changed: 342 additions & 10 deletions

File tree

packages/firebase_ml_vision/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.9.1
2+
3+
* Add support for cloud text recognizer.
4+
15
## 0.9.0+3
26

37
* Automatically use version from pubspec.yaml when reporting usage to Firebase.

packages/firebase_ml_vision/android/src/main/java/io/flutter/plugins/firebasemlvision/TextRecognizer.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,15 @@ public class TextRecognizer implements Detector {
2121
private final FirebaseVisionTextRecognizer recognizer;
2222

2323
TextRecognizer(FirebaseVision vision, Map<String, Object> options) {
24-
recognizer = vision.getOnDeviceTextRecognizer();
24+
final String modelType = (String) options.get("modelType");
25+
if (modelType.equals("onDevice")) {
26+
recognizer = vision.getOnDeviceTextRecognizer();
27+
} else if (modelType.equals("cloud")) {
28+
recognizer = vision.getCloudTextRecognizer();
29+
} else {
30+
final String message = String.format("No model for type: %s", modelType);
31+
throw new IllegalArgumentException(message);
32+
}
2533
}
2634

2735
@Override

packages/firebase_ml_vision/example/lib/camera_preview_scanner.dart

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class _CameraPreviewScannerState extends State<CameraPreviewScanner> {
2929
final ImageLabeler _cloudImageLabeler =
3030
FirebaseVision.instance.cloudImageLabeler();
3131
final TextRecognizer _recognizer = FirebaseVision.instance.textRecognizer();
32+
final TextRecognizer _cloudRecognizer =
33+
FirebaseVision.instance.cloudTextRecognizer();
3234

3335
@override
3436
void initState() {
@@ -72,6 +74,8 @@ class _CameraPreviewScannerState extends State<CameraPreviewScanner> {
7274
switch (_currentDetector) {
7375
case Detector.text:
7476
return _recognizer.processImage;
77+
case Detector.cloudText:
78+
return _cloudRecognizer.processImage;
7579
case Detector.barcode:
7680
return _barcodeDetector.detectInImage;
7781
case Detector.label:
@@ -119,7 +123,8 @@ class _CameraPreviewScannerState extends State<CameraPreviewScanner> {
119123
painter = LabelDetectorPainter(imageSize, _scanResults);
120124
break;
121125
default:
122-
assert(_currentDetector == Detector.text);
126+
assert(_currentDetector == Detector.text ||
127+
_currentDetector == Detector.cloudText);
123128
if (_scanResults is! VisionText) return noResultsText;
124129
painter = TextDetectorPainter(imageSize, _scanResults);
125130
}
@@ -200,6 +205,10 @@ class _CameraPreviewScannerState extends State<CameraPreviewScanner> {
200205
child: Text('Detect Text'),
201206
value: Detector.text,
202207
),
208+
const PopupMenuItem<Detector>(
209+
child: Text('Detect Cloud Text'),
210+
value: Detector.cloudText,
211+
),
203212
],
204213
),
205214
],
@@ -222,6 +231,7 @@ class _CameraPreviewScannerState extends State<CameraPreviewScanner> {
222231
_imageLabeler.close();
223232
_cloudImageLabeler.close();
224233
_recognizer.close();
234+
_cloudRecognizer.close();
225235
});
226236

227237
_currentDetector = null;

packages/firebase_ml_vision/example/lib/detector_painters.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'dart:ui' as ui;
77
import 'package:firebase_ml_vision/firebase_ml_vision.dart';
88
import 'package:flutter/material.dart';
99

10-
enum Detector { barcode, face, label, cloudLabel, text }
10+
enum Detector { barcode, face, label, cloudLabel, text, cloudText }
1111

1212
class BarcodeDetectorPainter extends CustomPainter {
1313
BarcodeDetectorPainter(this.absoluteImageSize, this.barcodeLocations);

packages/firebase_ml_vision/example/lib/picture_scanner.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class _PictureScannerState extends State<PictureScanner> {
2929
final ImageLabeler _cloudImageLabeler =
3030
FirebaseVision.instance.cloudImageLabeler();
3131
final TextRecognizer _recognizer = FirebaseVision.instance.textRecognizer();
32+
final TextRecognizer _cloudRecognizer =
33+
FirebaseVision.instance.cloudTextRecognizer();
3234

3335
Future<void> _getAndScanImage() async {
3436
setState(() {
@@ -93,6 +95,9 @@ class _PictureScannerState extends State<PictureScanner> {
9395
case Detector.text:
9496
results = await _recognizer.processImage(visionImage);
9597
break;
98+
case Detector.cloudText:
99+
results = await _cloudRecognizer.processImage(visionImage);
100+
break;
96101
default:
97102
return;
98103
}
@@ -121,6 +126,9 @@ class _PictureScannerState extends State<PictureScanner> {
121126
case Detector.text:
122127
painter = TextDetectorPainter(_imageSize, results);
123128
break;
129+
case Detector.cloudText:
130+
painter = TextDetectorPainter(_imageSize, results);
131+
break;
124132
default:
125133
break;
126134
}
@@ -185,6 +193,10 @@ class _PictureScannerState extends State<PictureScanner> {
185193
child: Text('Detect Text'),
186194
value: Detector.text,
187195
),
196+
const PopupMenuItem<Detector>(
197+
child: Text('Detect Cloud Text'),
198+
value: Detector.cloudText,
199+
),
188200
],
189201
),
190202
],
@@ -207,6 +219,7 @@ class _PictureScannerState extends State<PictureScanner> {
207219
_imageLabeler.close();
208220
_cloudImageLabeler.close();
209221
_recognizer.close();
222+
_cloudRecognizer.close();
210223
super.dispose();
211224
}
212225
}

packages/firebase_ml_vision/ios/Classes/TextRecognizer.m

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,17 @@ @implementation TextRecognizer
88
- (instancetype)initWithVision:(FIRVision *)vision options:(NSDictionary *)options {
99
self = [super init];
1010
if (self) {
11-
_recognizer = [vision onDeviceTextRecognizer];
11+
if ([@"onDevice" isEqualToString:options[@"modelType"]]) {
12+
_recognizer = [vision onDeviceTextRecognizer];
13+
} else if ([@"cloud" isEqualToString:options[@"modelType"]]) {
14+
_recognizer = [vision cloudTextRecognizer];
15+
} else {
16+
NSString *reason =
17+
[NSString stringWithFormat:@"Invalid model type: %@", options[@"modelType"]];
18+
@throw [[NSException alloc] initWithName:NSInvalidArgumentException
19+
reason:reason
20+
userInfo:nil];
21+
}
1222
}
1323
return self;
1424
}

packages/firebase_ml_vision/lib/src/firebase_vision.dart

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,12 @@ class FirebaseVision {
6767
}
6868

6969
/// Creates an instance of [TextRecognizer].
70-
TextRecognizer textRecognizer() => TextRecognizer._(nextHandle++);
70+
TextRecognizer textRecognizer() {
71+
return TextRecognizer._(
72+
modelType: ModelType.onDevice,
73+
handle: nextHandle++,
74+
);
75+
}
7176

7277
/// Creates a cloud instance of [ImageLabeler].
7378
ImageLabeler cloudImageLabeler([CloudImageLabelerOptions options]) {
@@ -77,6 +82,14 @@ class FirebaseVision {
7782
handle: nextHandle++,
7883
);
7984
}
85+
86+
/// Creates a cloud instance of [TextRecognizer].
87+
TextRecognizer cloudTextRecognizer() {
88+
return TextRecognizer._(
89+
modelType: ModelType.cloud,
90+
handle: nextHandle++,
91+
);
92+
}
8093
}
8194

8295
/// Represents an image object used for both on-device and cloud API detectors.

packages/firebase_ml_vision/lib/src/text_recognizer.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@ part of firebase_ml_vision;
1919
/// await textRecognizer.processImage(image);
2020
/// ```
2121
class TextRecognizer {
22-
TextRecognizer._(this._handle);
22+
TextRecognizer._({
23+
@required this.modelType,
24+
@required int handle,
25+
}) : _handle = handle,
26+
assert(modelType != null);
27+
28+
final ModelType modelType;
2329

2430
final int _handle;
2531
bool _hasBeenOpened = false;
@@ -35,7 +41,9 @@ class TextRecognizer {
3541
'TextRecognizer#processImage',
3642
<String, dynamic>{
3743
'handle': _handle,
38-
'options': <String, dynamic>{},
44+
'options': <String, dynamic>{
45+
'modelType': _enumToString(modelType),
46+
},
3947
}..addAll(visionImage._serialize()),
4048
);
4149

packages/firebase_ml_vision/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: firebase_ml_vision
22
description: Flutter plugin for Firebase machine learning vision services.
33
author: Flutter Team <flutter-dev@googlegroups.com>
44
homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_ml_vision
5-
version: 0.9.0+3
5+
version: 0.9.1
66

77
dependencies:
88
flutter:

0 commit comments

Comments
 (0)