Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/firebase_ml_vision/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 0.9.1

* Add support for cloud text recognizer.

## 0.9.0+3

* Automatically use version from pubspec.yaml when reporting usage to Firebase.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,15 @@ public class TextRecognizer implements Detector {
private final FirebaseVisionTextRecognizer recognizer;

TextRecognizer(FirebaseVision vision, Map<String, Object> options) {
recognizer = vision.getOnDeviceTextRecognizer();
final String modelType = (String) options.get("modelType");
if (modelType.equals("onDevice")) {
recognizer = vision.getOnDeviceTextRecognizer();
} else if (modelType.equals("cloud")) {
recognizer = vision.getCloudTextRecognizer();
} else {
final String message = String.format("No model for type: %s", modelType);
throw new IllegalArgumentException(message);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ class _CameraPreviewScannerState extends State<CameraPreviewScanner> {
final ImageLabeler _cloudImageLabeler =
FirebaseVision.instance.cloudImageLabeler();
final TextRecognizer _recognizer = FirebaseVision.instance.textRecognizer();
final TextRecognizer _cloudRecognizer =
FirebaseVision.instance.cloudTextRecognizer();

@override
void initState() {
Expand Down Expand Up @@ -72,6 +74,8 @@ class _CameraPreviewScannerState extends State<CameraPreviewScanner> {
switch (_currentDetector) {
case Detector.text:
return _recognizer.processImage;
case Detector.cloudText:
return _cloudRecognizer.processImage;
case Detector.barcode:
return _barcodeDetector.detectInImage;
case Detector.label:
Expand Down Expand Up @@ -119,7 +123,8 @@ class _CameraPreviewScannerState extends State<CameraPreviewScanner> {
painter = LabelDetectorPainter(imageSize, _scanResults);
break;
default:
assert(_currentDetector == Detector.text);
assert(_currentDetector == Detector.text ||
_currentDetector == Detector.cloudText);
if (_scanResults is! VisionText) return noResultsText;
painter = TextDetectorPainter(imageSize, _scanResults);
}
Expand Down Expand Up @@ -200,6 +205,10 @@ class _CameraPreviewScannerState extends State<CameraPreviewScanner> {
child: Text('Detect Text'),
value: Detector.text,
),
const PopupMenuItem<Detector>(
child: Text('Detect Cloud Text'),
value: Detector.cloudText,
),
],
),
],
Expand All @@ -222,6 +231,7 @@ class _CameraPreviewScannerState extends State<CameraPreviewScanner> {
_imageLabeler.close();
_cloudImageLabeler.close();
_recognizer.close();
_cloudRecognizer.close();
});

_currentDetector = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import 'dart:ui' as ui;
import 'package:firebase_ml_vision/firebase_ml_vision.dart';
import 'package:flutter/material.dart';

enum Detector { barcode, face, label, cloudLabel, text }
enum Detector { barcode, face, label, cloudLabel, text, cloudText }

class BarcodeDetectorPainter extends CustomPainter {
BarcodeDetectorPainter(this.absoluteImageSize, this.barcodeLocations);
Expand Down
13 changes: 13 additions & 0 deletions packages/firebase_ml_vision/example/lib/picture_scanner.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ class _PictureScannerState extends State<PictureScanner> {
final ImageLabeler _cloudImageLabeler =
FirebaseVision.instance.cloudImageLabeler();
final TextRecognizer _recognizer = FirebaseVision.instance.textRecognizer();
final TextRecognizer _cloudRecognizer =
FirebaseVision.instance.cloudTextRecognizer();

Future<void> _getAndScanImage() async {
setState(() {
Expand Down Expand Up @@ -93,6 +95,9 @@ class _PictureScannerState extends State<PictureScanner> {
case Detector.text:
results = await _recognizer.processImage(visionImage);
break;
case Detector.cloudText:
results = await _cloudRecognizer.processImage(visionImage);
break;
default:
return;
}
Expand Down Expand Up @@ -121,6 +126,9 @@ class _PictureScannerState extends State<PictureScanner> {
case Detector.text:
painter = TextDetectorPainter(_imageSize, results);
break;
case Detector.cloudText:
painter = TextDetectorPainter(_imageSize, results);
break;
default:
break;
}
Expand Down Expand Up @@ -185,6 +193,10 @@ class _PictureScannerState extends State<PictureScanner> {
child: Text('Detect Text'),
value: Detector.text,
),
const PopupMenuItem<Detector>(
child: Text('Detect Cloud Text'),
value: Detector.cloudText,
),
],
),
],
Expand All @@ -207,6 +219,7 @@ class _PictureScannerState extends State<PictureScanner> {
_imageLabeler.close();
_cloudImageLabeler.close();
_recognizer.close();
_cloudRecognizer.close();
super.dispose();
}
}
12 changes: 11 additions & 1 deletion packages/firebase_ml_vision/ios/Classes/TextRecognizer.m
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,17 @@ @implementation TextRecognizer
- (instancetype)initWithVision:(FIRVision *)vision options:(NSDictionary *)options {
self = [super init];
if (self) {
_recognizer = [vision onDeviceTextRecognizer];
if ([@"onDevice" isEqualToString:options[@"modelType"]]) {
_recognizer = [vision onDeviceTextRecognizer];
} else if ([@"cloud" isEqualToString:options[@"modelType"]]) {
_recognizer = [vision cloudTextRecognizer];
} else {
NSString *reason =
[NSString stringWithFormat:@"Invalid model type: %@", options[@"modelType"]];
@throw [[NSException alloc] initWithName:NSInvalidArgumentException
reason:reason
userInfo:nil];
}
}
return self;
}
Expand Down
15 changes: 14 additions & 1 deletion packages/firebase_ml_vision/lib/src/firebase_vision.dart
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,12 @@ class FirebaseVision {
}

/// Creates an instance of [TextRecognizer].
TextRecognizer textRecognizer() => TextRecognizer._(nextHandle++);
TextRecognizer textRecognizer() {
return TextRecognizer._(
modelType: ModelType.onDevice,
handle: nextHandle++,
);
}

/// Creates a cloud instance of [ImageLabeler].
ImageLabeler cloudImageLabeler([CloudImageLabelerOptions options]) {
Expand All @@ -77,6 +82,14 @@ class FirebaseVision {
handle: nextHandle++,
);
}

/// Creates a cloud instance of [TextRecognizer].
TextRecognizer cloudTextRecognizer() {
return TextRecognizer._(
modelType: ModelType.cloud,
handle: nextHandle++,
);
}
}

/// Represents an image object used for both on-device and cloud API detectors.
Expand Down
12 changes: 10 additions & 2 deletions packages/firebase_ml_vision/lib/src/text_recognizer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,13 @@ part of firebase_ml_vision;
/// await textRecognizer.processImage(image);
/// ```
class TextRecognizer {
TextRecognizer._(this._handle);
TextRecognizer._({
@required this.modelType,
@required int handle,
}) : _handle = handle,
assert(modelType != null);

final ModelType modelType;

final int _handle;
bool _hasBeenOpened = false;
Expand All @@ -35,7 +41,9 @@ class TextRecognizer {
'TextRecognizer#processImage',
<String, dynamic>{
'handle': _handle,
'options': <String, dynamic>{},
'options': <String, dynamic>{
'modelType': _enumToString(modelType),
},
}..addAll(visionImage._serialize()),
);

Expand Down
2 changes: 1 addition & 1 deletion packages/firebase_ml_vision/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: firebase_ml_vision
description: Flutter plugin for Firebase machine learning vision services.
author: Flutter Team <[email protected]>
homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_ml_vision
version: 0.9.0+3
version: 0.9.1

dependencies:
flutter:
Expand Down
Loading