如何解决计算姿势检测 mlkit 中骨骼关键点之间的距离,然后存储在 Firebase 数据集中
我正在使用谷歌提供的示例在 Android 应用中进行姿势检测。 我会自动获得姿势放置的关键点之间的距离(例如从右膝到右踝)。我愿意将数据存储在 Firebase 数据库中
希望有人能帮帮忙
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 举报,一经查实,本站将立刻删除。