Skip to content

Instantly share code, notes, and snippets.

@acidsound
Created May 28, 2021 06:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save acidsound/24b8d28bd17be45de28849a0df06f58c to your computer and use it in GitHub Desktop.
Save acidsound/24b8d28bd17be45de28849a0df06f58c to your computer and use it in GitHub Desktop.
flutter - FutureBuilder를 사용한 camera 사용 예제
import 'dart:ffi';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
import 'package:tflite/tflite.dart';
List<CameraDescription> cameras = [];
void main() async {
WidgetsFlutterBinding.ensureInitialized();
cameras = await availableCameras();
runApp(DetectApp());
}
class DetectApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: DetectFace(title: 'Realtime Inference'),
);
}
}
class DetectFace extends StatefulWidget {
DetectFace({Key key, this.title}) : super(key: key);
final String title;
@override
_DetectFaceState createState() => _DetectFaceState();
}
class _DetectFaceState extends State<DetectFace> {
CameraController cameraController;
bool isDetecting = false;
List<dynamic> results = [];
Future<void> initRequisites() async {
Tflite.close();
/*
https://github.com/google/mediapipe/tree/master/mediapipe/modules/face_detection
*/
await Tflite.loadModel(
model: "assets/ssd_mobilenet.tflite",
labels: "assets/labels.txt",
);
var frontCamera =
cameras.firstWhere((camera) => camera.lensDirection.index == 0);
cameraController = CameraController(frontCamera, ResolutionPreset.high,
enableAudio: false);
await cameraController.initialize();
cameraController.startImageStream(processImage);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: FutureBuilder<void>(
future: initRequisites(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return Stack(
children: <Widget>[
CameraPreview(cameraController),
resultWidget(results)
],
);
} else {
return Center(child: CircularProgressIndicator());
}
}));
}
@override
void dispose() {
cameraController.dispose();
super.dispose();
}
processImage(CameraImage image) async {
if (isDetecting) {
return;
}
isDetecting = true;
var inputImage = image.planes.map((plane) => plane.bytes).toList();
var result = await Tflite.detectObjectOnFrame(
bytesList: inputImage,
model: "SSDMobileNet",
imageHeight: image.height,
imageWidth: image.width,
imageMean: 127.5,
imageStd: 127.5,
numResultsPerClass: 3,
threshold: 0.4);
results = result.map((e)=>e["detectedClass"]).toList();
print(results.join("/"));
isDetecting = false;
}
Widget resultWidget(List<dynamic> list) {
return Stack(
children: [
Text(
results.join(","),
style: TextStyle(color: Colors.black),
)
],
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment