// Based on https://github.com/shaqian/flutter_realtime_detection import 'package:flutter/material.dart' show BuildContext, Container, MediaQuery, OverflowBox, State, StatefulWidget, Widget; import 'package:camera/camera.dart'; import 'package:tflite/tflite.dart'; import 'dart:math' as math; typedef void Callback(List list, int h, int w); class Camera extends StatefulWidget { final List cameras; final Callback setRecognitions; Camera(this.cameras, this.setRecognitions); @override _CameraState createState() => new _CameraState(); } class _CameraState extends State { CameraController controller; bool isDetecting = false; @override void initState() { super.initState(); if (widget.cameras == null || widget.cameras.length < 1) { print('No camera is found'); } else { controller = new CameraController( widget.cameras[0], ResolutionPreset.high, ); controller.initialize().then((_) { if (!mounted) { return; } setState(() {}); controller.startImageStream((CameraImage img) { if (!isDetecting) { isDetecting = true; int startTime = new DateTime.now().millisecondsSinceEpoch; Tflite.detectObjectOnFrame( bytesList: img.planes.map((plane) { return plane.bytes; }).toList(), model: "SSDMobileNet", imageHeight: img.height, imageWidth: img.width, imageMean: 127.5, imageStd: 127.5, numResultsPerClass: 1, threshold: 0.4, ).then((recognitions) { int endTime = new DateTime.now().millisecondsSinceEpoch; print("Detection took ${endTime - startTime}"); widget.setRecognitions(recognitions, img.height, img.width); isDetecting = false; }); } }); }); } } @override void dispose() { controller?.dispose(); super.dispose(); } @override Widget build(BuildContext context) { if (controller == null || !controller.value.isInitialized) { return Container(); } var tmp = MediaQuery.of(context).size; var screenH = math.max(tmp.height, tmp.width); var screenW = math.min(tmp.height, tmp.width); tmp = controller.value.previewSize; var previewH = math.max(tmp.height, tmp.width); var previewW = math.min(tmp.height, tmp.width); var screenRatio = screenH / screenW; var previewRatio = previewH / previewW; return OverflowBox( maxHeight: screenRatio > previewRatio ? screenH : screenW / previewW * previewH, maxWidth: screenRatio > previewRatio ? screenH / previewH * previewW : screenW, child: CameraPreview(controller), ); } }