pose_detector.dart 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import 'dart:async';
  2. import 'package:body_detection/body_detection.dart';
  3. import 'package:body_detection/models/image_result.dart';
  4. import 'package:body_detection/models/pose.dart';
  5. import 'package:flutter/material.dart';
  6. import 'pose_painter.dart';
  7. class PoseDetector extends StatefulWidget {
  8. const PoseDetector({Key? key}) : super(key: key);
  9. @override
  10. State<PoseDetector> createState() => _PoseDetectorState();
  11. }
  12. class _PoseDetectorState extends State<PoseDetector> {
  13. Image? _cameraImage;
  14. Pose? _detectedPose;
  15. Size _imageSize = Size.zero;
  16. late Future<void> _startCamera;
  17. @override
  18. initState() {
  19. super.initState();
  20. _startCamera = _startCameraStream();
  21. }
  22. Future<void> _startCameraStream() async {
  23. await BodyDetection.startCameraStream(onFrameAvailable: _handleCameraImage, onPoseAvailable: _handlePose);
  24. await BodyDetection.enablePoseDetection();
  25. }
  26. Future<void> _stopCameraStream() async {
  27. await BodyDetection.disablePoseDetection();
  28. await BodyDetection.stopCameraStream();
  29. }
  30. void _handleCameraImage(ImageResult result) {
  31. // To avoid a memory leak issue.
  32. // https://github.com/flutter/flutter/issues/60160
  33. PaintingBinding.instance?.imageCache?.clear();
  34. PaintingBinding.instance?.imageCache?.clearLiveImages();
  35. final image = Image.memory(
  36. result.bytes,
  37. gaplessPlayback: true,
  38. fit: BoxFit.contain,
  39. );
  40. setState(() {
  41. _cameraImage = image;
  42. _imageSize = result.size;
  43. });
  44. }
  45. void _handlePose(Pose? pose) {
  46. setState(() {
  47. _detectedPose = pose;
  48. });
  49. }
  50. @override
  51. void dispose() {
  52. _stopCameraStream();
  53. super.dispose();
  54. }
  55. @override
  56. Widget build(BuildContext context) {
  57. return FutureBuilder<void>(
  58. future: _startCamera,
  59. builder: (context, snapshot) {
  60. if (snapshot.connectionState == ConnectionState.waiting) {
  61. return const Center(child: CircularProgressIndicator());
  62. }
  63. return Center(
  64. child: CustomPaint(
  65. size: _imageSize,
  66. child: _cameraImage,
  67. foregroundPainter: PosePainter(
  68. pose: _detectedPose,
  69. imageSize: _imageSize,
  70. ),
  71. ),
  72. );
  73. },
  74. );
  75. }
  76. }