计算姿势检测 mlkit 中骨骼关键点之间的距离,然后存储在 Firebase 数据集中

问题描述

我正在使用谷歌提供的示例在 Android 应用中进行姿势检测。 我会自动获得姿势放置的关键点之间的距离(例如从右膝到右踝)。我愿意将数据存储在 Firebase 数据库中

我认为这是我应该修改的java类

希望有人能帮帮忙

public class PoseGraphic extends Graphic {

  private static final float DOT_RADIUS = 10.0f;
  private static final float IN_FRAME_LIKELIHOOD_TEXT_SIZE = 30.0f;
  private static final float STROKE_WIDTH = 8.0f;

  private final Pose pose;
  private final boolean showInFrameLikelihood;
  private final boolean visualizeZ;
  private final boolean rescaleZForVisualization;
  private float zMin = Float.MAX_VALUE;
  private float zMax = Float.MIN_VALUE;

  private final Paint leftPaint;
  private final Paint rightPaint;
  private final Paint whitePaint;
  PoseGraphic(
      GraphicOverlay overlay,Pose pose,boolean showInFrameLikelihood,boolean visualizeZ,boolean rescaleZForVisualization) {
    super(overlay);
    this.pose = pose;
    this.showInFrameLikelihood = showInFrameLikelihood;
    this.visualizeZ = visualizeZ;
    this.rescaleZForVisualization = rescaleZForVisualization;

    whitePaint = new Paint();
    whitePaint.setStrokeWidth(STROKE_WIDTH);
    whitePaint.setColor(Color.WHITE);
    whitePaint.setTextSize(IN_FRAME_LIKELIHOOD_TEXT_SIZE);
    whitePaint.setDither(true);
    whitePaint.setARGB(255,0);
    whitePaint.setStyle(Paint.Style.STROKE);
    whitePaint.setPathEffect(new DashPathEffect(new float[]{10,40,},0));



    leftPaint = new Paint();
    leftPaint.setDither(true);
    leftPaint.setARGB(255,0);
    leftPaint.setStyle(Paint.Style.STROKE);
    leftPaint.setPathEffect(new DashPathEffect(new float[]{10,0));
    leftPaint.setStrokeWidth(STROKE_WIDTH);
    leftPaint.setColor(Color.GREEN);


    rightPaint = new Paint();
    rightPaint.setStrokeWidth(STROKE_WIDTH);
    rightPaint.setColor(Color.YELLOW);
    rightPaint.setDither(true);
    rightPaint.setARGB(255,0);
    rightPaint.setStyle(Paint.Style.STROKE);
    rightPaint.setPathEffect(new DashPathEffect(new float[]{10,0));
  }

  @Override
  public void draw(Canvas canvas) {
    List<PoseLandmark> landmarks = pose.getAllPoseLandmarks();
    if (landmarks.isEmpty()) {
      return;
    }

    // Draw all the points
    for (PoseLandmark landmark : landmarks) {
      drawPoint(canvas,landmark,whitePaint);
      if (visualizeZ && rescaleZForVisualization) {
        zMin = min(zMin,landmark.getPosition3D().getZ());
        zMax = max(zMax,landmark.getPosition3D().getZ());
      }
    }

    PoseLandmark leftShoulder = pose.getPoseLandmark(PoseLandmark.LEFT_SHOULDER);
    PoseLandmark rightShoulder = pose.getPoseLandmark(PoseLandmark.RIGHT_SHOULDER);
    PoseLandmark leftElbow = pose.getPoseLandmark(PoseLandmark.LEFT_ELBOW);
    PoseLandmark rightElbow = pose.getPoseLandmark(PoseLandmark.RIGHT_ELBOW);
    PoseLandmark leftWrist = pose.getPoseLandmark(PoseLandmark.LEFT_WRIST);
    PoseLandmark rightWrist = pose.getPoseLandmark(PoseLandmark.RIGHT_WRIST);
    PoseLandmark leftHip = pose.getPoseLandmark(PoseLandmark.LEFT_HIP);
    PoseLandmark rightHip = pose.getPoseLandmark(PoseLandmark.RIGHT_HIP);
    PoseLandmark leftKnee = pose.getPoseLandmark(PoseLandmark.LEFT_KNEE);
    PoseLandmark rightKnee = pose.getPoseLandmark(PoseLandmark.RIGHT_KNEE);
    PoseLandmark leftAnkle = pose.getPoseLandmark(PoseLandmark.LEFT_ANKLE);
    PoseLandmark rightAnkle = pose.getPoseLandmark(PoseLandmark.RIGHT_ANKLE);

    PoseLandmark leftPinky = pose.getPoseLandmark(PoseLandmark.LEFT_PINKY);
    PoseLandmark rightPinky = pose.getPoseLandmark(PoseLandmark.RIGHT_PINKY);
    PoseLandmark leftIndex = pose.getPoseLandmark(PoseLandmark.LEFT_INDEX);
    PoseLandmark rightIndex = pose.getPoseLandmark(PoseLandmark.RIGHT_INDEX);
    PoseLandmark leftThumb = pose.getPoseLandmark(PoseLandmark.LEFT_THUMB);
    PoseLandmark rightThumb = pose.getPoseLandmark(PoseLandmark.RIGHT_THUMB);
    PoseLandmark leftHeel = pose.getPoseLandmark(PoseLandmark.LEFT_HEEL);
    PoseLandmark rightHeel = pose.getPoseLandmark(PoseLandmark.RIGHT_HEEL);
    PoseLandmark leftFootIndex = pose.getPoseLandmark(PoseLandmark.LEFT_FOOT_INDEX);
    PoseLandmark rightFootIndex = pose.getPoseLandmark(PoseLandmark.RIGHT_FOOT_INDEX);

    drawLine(canvas,leftShoulder,rightShoulder,whitePaint);
    drawLine(canvas,leftHip,rightHip,whitePaint);

    // Left body
    drawLine(canvas,leftElbow,leftPaint);
    drawLine(canvas,leftWrist,leftKnee,leftAnkle,leftThumb,leftPinky,leftIndex,leftHeel,leftFootIndex,leftPaint);

    // Right body
    drawLine(canvas,rightElbow,rightPaint);
    drawLine(canvas,rightWrist,rightKnee,rightAnkle,rightThumb,rightPinky,rightIndex,rightHeel,rightFootIndex,rightPaint);

    // Draw inFrameLikelihood for all points
    if (showInFrameLikelihood) {
      for (PoseLandmark landmark : landmarks) {
        canvas.drawText(
            String.format(Locale.US,"%.2f",landmark.getInFrameLikelihood()),translateX(landmark.getPosition().x),translateY(landmark.getPosition().y),whitePaint);
      }
    }
  }

  void drawPoint(Canvas canvas,PoseLandmark landmark,Paint paint) {
    PointF point = landmark.getPosition();
    canvas.drawCircle(translateX(point.x),translateY(point.y),DOT_RADIUS,paint);
  }

  void drawLine(Canvas canvas,PoseLandmark startLandmark,PoseLandmark endLandmark,Paint paint) {
    // When visualizeZ is true,sets up the paint to draw body line in different colors based on
    // their z values.
    if (visualizeZ) {
      PointF3D start = startLandmark.getPosition3D();
      PointF3D end = endLandmark.getPosition3D();

      // Gets the range of z value.
      float zLowerBoundInScreenPixel;
      float zUpperBoundInScreenPixel;

      if (rescaleZForVisualization) {
        zLowerBoundInScreenPixel = min(-0.001f,scale(zMin));
        zUpperBoundInScreenPixel = max(0.001f,scale(zMax));
      } else {
        // By default,assume the range of z value in screen pixel is [-canvasWidth,canvasWidth].
        float defaultRangeFactor = 1f;
        zLowerBoundInScreenPixel = -defaultRangeFactor * canvas.getWidth();
        zUpperBoundInScreenPixel = defaultRangeFactor * canvas.getWidth();
      }

      // Gets average z for the current body line
      float avgZInImagePixel = (start.getZ() + end.getZ()) / 2;
      float zInScreenPixel = scale(avgZInImagePixel);

      if (zInScreenPixel < 0) {
        // Sets up the paint to draw the body line in red if it is in front of the z origin.
        // Maps values within [zLowerBoundInScreenPixel,0) to [255,0) and use it to control the
        // color. The larger the value is,the more red it will be.
        int v = (int) (zInScreenPixel / zLowerBoundInScreenPixel * 255);
        v = Ints.constrainToRange(v,255);
        paint.setARGB(255,255,255 - v,255 - v);
      } else {
        // Sets up the paint to draw the body line in blue if it is behind the z origin.
        // Maps values within [0,zUpperBoundInScreenPixel] to [0,255] and use it to control the
        // color. The larger the value is,the more blue it will be.
        int v = (int) (zInScreenPixel / zUpperBoundInScreenPixel * 255);
        v = Ints.constrainToRange(v,255);
      }

      canvas.drawLine(
          translateX(start.getX()),translateY(start.getY()),translateX(end.getX()),translateY(end.getY()),paint);

    } else {
      PointF start = startLandmark.getPosition();
      PointF end = endLandmark.getPosition();
      canvas.drawLine(
          translateX(start.x),translateY(start.y),translateX(end.x),translateY(end.y),paint);
    }
  }
}```




解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...