Skip to content

Commit

Permalink
[firebase_ml_vision] Prepare example app to include Live Camera Previ…
Browse files Browse the repository at this point in the history
…ew demo and Material Barcode Scanner demo (flutter#1713)
  • Loading branch information
bparrishMines committed Jun 13, 2019
1 parent d9e07fe commit b556116
Show file tree
Hide file tree
Showing 2 changed files with 242 additions and 193 deletions.
223 changes: 30 additions & 193 deletions packages/firebase_ml_vision/example/lib/main.dart
Expand Up @@ -2,212 +2,49 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';
import 'dart:io';

import 'package:firebase_ml_vision/firebase_ml_vision.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';

import 'detector_painters.dart';

void main() => runApp(MaterialApp(home: _MyHomePage()));
import 'picture_scanner.dart';

void main() {
runApp(
MaterialApp(
routes: <String, WidgetBuilder>{
'/': (BuildContext context) => _ExampleList(),
'/$PictureScanner': (BuildContext context) => PictureScanner(),
},
),
);
}

class _MyHomePage extends StatefulWidget {
class _ExampleList extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
State<StatefulWidget> createState() => _ExampleListState();
}

class _MyHomePageState extends State<_MyHomePage> {
File _imageFile;
Size _imageSize;
dynamic _scanResults;
Detector _currentDetector = Detector.text;
final BarcodeDetector _barcodeDetector =
FirebaseVision.instance.barcodeDetector();
final FaceDetector _faceDetector = FirebaseVision.instance.faceDetector();
final ImageLabeler _imageLabeler = FirebaseVision.instance.imageLabeler();
final ImageLabeler _cloudImageLabeler =
FirebaseVision.instance.cloudImageLabeler();
final TextRecognizer _recognizer = FirebaseVision.instance.textRecognizer();

Future<void> _getAndScanImage() async {
setState(() {
_imageFile = null;
_imageSize = null;
});

final File imageFile =
await ImagePicker.pickImage(source: ImageSource.gallery);

if (imageFile != null) {
_getImageSize(imageFile);
_scanImage(imageFile);
}

setState(() {
_imageFile = imageFile;
});
}

Future<void> _getImageSize(File imageFile) async {
final Completer<Size> completer = Completer<Size>();

final Image image = Image.file(imageFile);
image.image.resolve(const ImageConfiguration()).addListener(
ImageStreamListener((ImageInfo info, bool _) {
completer.complete(Size(
info.image.width.toDouble(),
info.image.height.toDouble(),
));
}),
);

final Size imageSize = await completer.future;
setState(() {
_imageSize = imageSize;
});
}

Future<void> _scanImage(File imageFile) async {
setState(() {
_scanResults = null;
});

final FirebaseVisionImage visionImage =
FirebaseVisionImage.fromFile(imageFile);

dynamic results;
switch (_currentDetector) {
case Detector.barcode:
results = await _barcodeDetector.detectInImage(visionImage);
break;
case Detector.face:
results = await _faceDetector.processImage(visionImage);
break;
case Detector.label:
results = await _imageLabeler.processImage(visionImage);
break;
case Detector.cloudLabel:
results = await _cloudImageLabeler.processImage(visionImage);
break;
case Detector.text:
results = await _recognizer.processImage(visionImage);
break;
default:
return;
}

setState(() {
_scanResults = results;
});
}

CustomPaint _buildResults(Size imageSize, dynamic results) {
CustomPainter painter;

switch (_currentDetector) {
case Detector.barcode:
painter = BarcodeDetectorPainter(_imageSize, results);
break;
case Detector.face:
painter = FaceDetectorPainter(_imageSize, results);
break;
case Detector.label:
painter = LabelDetectorPainter(_imageSize, results);
break;
case Detector.cloudLabel:
painter = LabelDetectorPainter(_imageSize, results);
break;
case Detector.text:
painter = TextDetectorPainter(_imageSize, results);
break;
default:
break;
}

return CustomPaint(
painter: painter,
);
}

Widget _buildImage() {
return Container(
constraints: const BoxConstraints.expand(),
decoration: BoxDecoration(
image: DecorationImage(
image: Image.file(_imageFile).image,
fit: BoxFit.fill,
),
),
child: _imageSize == null || _scanResults == null
? const Center(
child: Text(
'Scanning...',
style: TextStyle(
color: Colors.green,
fontSize: 30.0,
),
),
)
: _buildResults(_imageSize, _scanResults),
);
}
class _ExampleListState extends State<_ExampleList> {
static final List<String> _exampleWidgetNames = <String>['$PictureScanner'];

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('ML Vision Example'),
actions: <Widget>[
PopupMenuButton<Detector>(
onSelected: (Detector result) {
_currentDetector = result;
if (_imageFile != null) _scanImage(_imageFile);
},
itemBuilder: (BuildContext context) => <PopupMenuEntry<Detector>>[
const PopupMenuItem<Detector>(
child: Text('Detect Barcode'),
value: Detector.barcode,
),
const PopupMenuItem<Detector>(
child: Text('Detect Face'),
value: Detector.face,
),
const PopupMenuItem<Detector>(
child: Text('Detect Label'),
value: Detector.label,
),
const PopupMenuItem<Detector>(
child: Text('Detect Cloud Label'),
value: Detector.cloudLabel,
),
const PopupMenuItem<Detector>(
child: Text('Detect Text'),
value: Detector.text,
),
],
),
],
title: const Text('Example List'),
),
body: _imageFile == null
? const Center(child: Text('No image selected.'))
: _buildImage(),
floatingActionButton: FloatingActionButton(
onPressed: _getAndScanImage,
tooltip: 'Pick Image',
child: const Icon(Icons.add_a_photo),
body: ListView.builder(
itemCount: _exampleWidgetNames.length,
itemBuilder: (BuildContext context, int index) {
final String widgetName = _exampleWidgetNames[index];

return Container(
decoration: BoxDecoration(border: Border.all(color: Colors.grey)),
child: ListTile(
title: Text(widgetName),
onTap: () => Navigator.pushNamed(context, '/$widgetName'),
),
);
},
),
);
}

@override
void dispose() {
_barcodeDetector.close();
_faceDetector.close();
_imageLabeler.close();
_cloudImageLabeler.close();
_recognizer.close();
super.dispose();
}
}

0 comments on commit b556116

Please sign in to comment.