Advertisement
GolaNir

ml vision

Feb 3rd, 2020
772
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 3.98 KB | None | 0 0
  1. import 'dart:typed_data';
  2.  
  3. import 'package:camera/camera.dart';
  4. import 'package:firebase_ml_vision/firebase_ml_vision.dart';
  5. import 'package:flutter/foundation.dart';
  6. import 'package:flutter/material.dart';
  7.  
  8. class CameraPreviewScanner extends StatefulWidget {
  9.   @override
  10.   _CameraPreviewScannerState createState() => _CameraPreviewScannerState();
  11. }
  12.  
  13. class _CameraPreviewScannerState extends State<CameraPreviewScanner> {
  14.   List<CameraDescription> cameras;
  15.   CameraController controller;
  16.   bool isReady = false;
  17.  
  18. //  CameraController _camera;
  19.   bool _isDetecting = false;
  20.   final _barcodeDetector = FirebaseVision.instance.barcodeDetector();
  21.  
  22.   @override
  23.   void initState() {
  24.     super.initState();
  25.     _initializeCamera();
  26.   }
  27.  
  28.   void _initializeCamera() async {
  29.     cameras = await availableCameras();
  30.     controller = new CameraController(cameras[0], ResolutionPreset.medium);
  31.     await controller.initialize();
  32.     setState(() {
  33.       isReady = true;
  34.     });
  35.     startCameraForScanning(cameras[0]);
  36.   }
  37.  
  38.   Future<void> startCameraForScanning(CameraDescription description) {
  39.     return controller.startImageStream(
  40.       (CameraImage image) {
  41.         if (_isDetecting) return;
  42.  
  43.         FirebaseVisionImage firebaseImage = FirebaseVisionImage.fromBytes(
  44.           _concatenatePlanes(image.planes),
  45.           _buildMetaData(image,
  46.               _rotationIntToImageRotation(description.sensorOrientation)),
  47.         );
  48.  
  49.         _barcodeDetector.detectInImage(firebaseImage).then(
  50.           (List<Barcode> barcodes) {
  51.             if (barcodes.isNotEmpty) {
  52.               setState(() {
  53.                 _isDetecting = true;
  54.               });
  55.               Scaffold.of(context).showSnackBar(
  56.                   SnackBar(content: Text("${barcodes[0].rawValue}")));
  57.             }
  58.           },
  59.         ).whenComplete(() async {
  60.           await Future.delayed(Duration(seconds: 5));
  61.           setState(() {
  62.             _isDetecting = false;
  63.           });
  64.         });
  65.       },
  66.     );
  67.   }
  68.  
  69.   Future<CameraDescription> getCamera(CameraLensDirection dir) async {
  70.     return await availableCameras().then(
  71.       (List<CameraDescription> cameras) => cameras.firstWhere(
  72.         (CameraDescription camera) => camera.lensDirection == dir,
  73.       ),
  74.     );
  75.   }
  76.  
  77.   Uint8List _concatenatePlanes(List<Plane> planes) {
  78.     final WriteBuffer allBytes = WriteBuffer();
  79.     for (Plane plane in planes) {
  80.       allBytes.putUint8List(plane.bytes);
  81.     }
  82.     return allBytes.done().buffer.asUint8List();
  83.   }
  84.  
  85.   FirebaseVisionImageMetadata _buildMetaData(
  86.     CameraImage image,
  87.     ImageRotation rotation,
  88.   ) {
  89.     return FirebaseVisionImageMetadata(
  90.       rawFormat: image.format.raw,
  91.       size: Size(image.width.toDouble(), image.height.toDouble()),
  92.       rotation: rotation,
  93.       planeData: image.planes.map(
  94.         (Plane plane) {
  95.           return FirebaseVisionImagePlaneMetadata(
  96.             bytesPerRow: plane.bytesPerRow,
  97.             height: plane.height,
  98.             width: plane.width,
  99.           );
  100.         },
  101.       ).toList(),
  102.     );
  103.   }
  104.  
  105.   ImageRotation _rotationIntToImageRotation(int rotation) {
  106.     switch (rotation) {
  107.       case 0:
  108.         return ImageRotation.rotation0;
  109.       case 90:
  110.         return ImageRotation.rotation90;
  111.       case 180:
  112.         return ImageRotation.rotation180;
  113.       default:
  114.         assert(rotation == 270);
  115.         return ImageRotation.rotation270;
  116.     }
  117.   }
  118.  
  119.   Widget _buildImage() {
  120.     return AspectRatio(
  121.       aspectRatio: controller.value.aspectRatio,
  122.       child: CameraPreview(controller),
  123.     );
  124.   }
  125.  
  126.   @override
  127.   Widget build(BuildContext context) {
  128.     if (!isReady) {
  129.       return Container();
  130.     }
  131.     return Container(
  132.       child: _buildImage(),
  133.     );
  134.   }
  135.  
  136.   @override
  137.   void deactivate() {
  138.     controller.stopImageStream();
  139.     super.deactivate();
  140.   }
  141.  
  142.   @override
  143.   void dispose() {
  144.     controller.dispose().then((_) {
  145.       _barcodeDetector.close();
  146.     });
  147.     super.dispose();
  148.   }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement