pose_painter.dart 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import 'package:body_detection/models/pose.dart';
  2. import 'package:body_detection/models/pose_landmark.dart';
  3. import 'package:body_detection/models/pose_landmark_type.dart';
  4. import 'package:flutter/widgets.dart';
  5. class PosePainter extends CustomPainter {
  6. final Pose? pose;
  7. final Size imageSize;
  8. PosePainter({required this.pose, required this.imageSize, Key? key});
  9. final pointPaint = Paint()..color = const Color.fromRGBO(255, 255, 255, 0.8);
  10. final leftPointPaint = Paint()..color = const Color.fromRGBO(223, 157, 80, 1);
  11. final rightPointPaint = Paint()..color = const Color.fromRGBO(100, 208, 218, 1);
  12. final linePaint = Paint()
  13. ..color = const Color.fromARGB(228, 0, 0, 0)
  14. ..strokeWidth = 3;
  15. @override
  16. void paint(Canvas canvas, Size size) {
  17. if (pose == null) return;
  18. final double hRatio = imageSize.width == 0 ? 1 : size.width / imageSize.width;
  19. final double vRatio = imageSize.height == 0 ? 1 : size.height / imageSize.height;
  20. offsetForPart(PoseLandmark part) => Offset(part.position.x * hRatio, part.position.y * vRatio);
  21. // Landmark connections
  22. final landmarksByType = {for (final it in pose!.landmarks) it.type: it};
  23. for (final connection in connections) {
  24. if (landmarksByType[connection[0]] != null &&
  25. landmarksByType[connection[1]] != null &&
  26. landmarksByType[connection[0]]!.inFrameLikelihood > 0.5 &&
  27. landmarksByType[connection[1]]!.inFrameLikelihood > 0.5) {
  28. final point1 = offsetForPart(landmarksByType[connection[0]]!);
  29. final point2 = offsetForPart(landmarksByType[connection[1]]!);
  30. canvas.drawLine(point1, point2, linePaint);
  31. }
  32. }
  33. }
  34. @override
  35. bool shouldRepaint(PosePainter oldDelegate) {
  36. return oldDelegate.pose != pose || oldDelegate.imageSize != imageSize;
  37. }
  38. static const List<List<PoseLandmarkType>> connections = [
  39. [PoseLandmarkType.leftShoulder, PoseLandmarkType.rightShoulder],
  40. [PoseLandmarkType.leftShoulder, PoseLandmarkType.leftHip],
  41. [PoseLandmarkType.rightShoulder, PoseLandmarkType.rightHip],
  42. [PoseLandmarkType.rightShoulder, PoseLandmarkType.rightElbow],
  43. [PoseLandmarkType.rightWrist, PoseLandmarkType.rightElbow],
  44. [PoseLandmarkType.leftHip, PoseLandmarkType.rightHip],
  45. [PoseLandmarkType.leftHip, PoseLandmarkType.leftKnee],
  46. [PoseLandmarkType.rightHip, PoseLandmarkType.rightKnee],
  47. [PoseLandmarkType.rightKnee, PoseLandmarkType.rightAnkle],
  48. [PoseLandmarkType.leftKnee, PoseLandmarkType.leftAnkle],
  49. [PoseLandmarkType.leftElbow, PoseLandmarkType.leftShoulder],
  50. [PoseLandmarkType.leftWrist, PoseLandmarkType.leftElbow],
  51. ];
  52. }