|
|
@@ -0,0 +1,79 @@
|
|
|
+import 'dart:async';
|
|
|
+
|
|
|
+import 'package:body_detection/body_detection.dart';
|
|
|
+import 'package:body_detection/models/image_result.dart';
|
|
|
+import 'package:flutter/material.dart';
|
|
|
+
|
|
|
+class PoseDetector extends StatefulWidget {
|
|
|
+ const PoseDetector({Key? key}) : super(key: key);
|
|
|
+
|
|
|
+ @override
|
|
|
+ State<PoseDetector> createState() => _PoseDetectorState();
|
|
|
+}
|
|
|
+
|
|
|
+class _PoseDetectorState extends State<PoseDetector> {
|
|
|
+ Image? _cameraImage;
|
|
|
+ Size _imageSize = Size.zero;
|
|
|
+ late Future<void> _startCamera;
|
|
|
+
|
|
|
+ @override
|
|
|
+ initState() {
|
|
|
+ super.initState();
|
|
|
+ _startCamera = _startCameraStream();
|
|
|
+ }
|
|
|
+
|
|
|
+ Future<void> _startCameraStream() async {
|
|
|
+ await BodyDetection.startCameraStream(
|
|
|
+ onFrameAvailable: _handleCameraImage,
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ Future<void> _stopCameraStream() async {
|
|
|
+ await BodyDetection.stopCameraStream();
|
|
|
+ }
|
|
|
+
|
|
|
+ void _handleCameraImage(ImageResult result) {
|
|
|
+ // Ignore callback if navigated out of the page.
|
|
|
+ if (!mounted) return;
|
|
|
+
|
|
|
+ // To avoid a memory leak issue.
|
|
|
+ // https://github.com/flutter/flutter/issues/60160
|
|
|
+ PaintingBinding.instance?.imageCache?.clear();
|
|
|
+ PaintingBinding.instance?.imageCache?.clearLiveImages();
|
|
|
+
|
|
|
+ final image = Image.memory(
|
|
|
+ result.bytes,
|
|
|
+ gaplessPlayback: true,
|
|
|
+ fit: BoxFit.contain,
|
|
|
+ );
|
|
|
+
|
|
|
+ setState(() {
|
|
|
+ _cameraImage = image;
|
|
|
+ _imageSize = result.size;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ void dispose() {
|
|
|
+ _stopCameraStream();
|
|
|
+ super.dispose();
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ Widget build(BuildContext context) {
|
|
|
+ return FutureBuilder<void>(
|
|
|
+ future: _startCamera,
|
|
|
+ builder: (context, snapshot) {
|
|
|
+ if (snapshot.connectionState == ConnectionState.waiting) {
|
|
|
+ return const Center(child: CircularProgressIndicator());
|
|
|
+ }
|
|
|
+ return Center(
|
|
|
+ child: CustomPaint(
|
|
|
+ size: _imageSize,
|
|
|
+ child: _cameraImage,
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ },
|
|
|
+ );
|
|
|
+ }
|
|
|
+}
|