Created
October 19, 2020 17:48
-
-
Save ravindu9701/efb94161be4facdabb6f6dc3307ed42c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/material.dart'; | |
import 'package:camera/camera.dart'; | |
import 'package:tflite/tflite.dart'; | |
import 'dart:math' as math; | |
typedef void Callback(List<dynamic> list, int h, int w); | |
class Camera extends StatefulWidget { | |
final List<CameraDescription> cameras; | |
final Callback setRecognitions; | |
final String model; | |
Camera(this.cameras, this.model, this.setRecognitions); | |
@override | |
_CameraState createState() => new _CameraState(); | |
} | |
class _CameraState extends State<Camera> { | |
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), | |
); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment