Create shared utilities to construct landmark lists
PiperOrigin-RevId: 581970043
This commit is contained in:
		
							parent
							
								
									939a9c2a37
								
							
						
					
					
						commit
						d504d3bf22
					
				| 
						 | 
					@ -96,6 +96,7 @@ android_library(
 | 
				
			||||||
        "-Xep:AndroidJdkLibsChecker:OFF",
 | 
					        "-Xep:AndroidJdkLibsChecker:OFF",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
 | 
					        "//mediapipe/framework/formats:landmark_java_proto_lite",
 | 
				
			||||||
        "//third_party:autovalue",
 | 
					        "//third_party:autovalue",
 | 
				
			||||||
        "@maven//:com_google_guava_guava",
 | 
					        "@maven//:com_google_guava_guava",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
| 
						 | 
					@ -108,6 +109,7 @@ android_library(
 | 
				
			||||||
        "-Xep:AndroidJdkLibsChecker:OFF",
 | 
					        "-Xep:AndroidJdkLibsChecker:OFF",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
 | 
					        "//mediapipe/framework/formats:landmark_java_proto_lite",
 | 
				
			||||||
        "//third_party:autovalue",
 | 
					        "//third_party:autovalue",
 | 
				
			||||||
        "@maven//:com_google_guava_guava",
 | 
					        "@maven//:com_google_guava_guava",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,11 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package com.google.mediapipe.tasks.components.containers;
 | 
					package com.google.mediapipe.tasks.components.containers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.annotation.TargetApi;
 | 
				
			||||||
import com.google.auto.value.AutoValue;
 | 
					import com.google.auto.value.AutoValue;
 | 
				
			||||||
 | 
					import com.google.mediapipe.formats.proto.LandmarkProto;
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Objects;
 | 
					import java.util.Objects;
 | 
				
			||||||
import java.util.Optional;
 | 
					import java.util.Optional;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,18 +28,44 @@ import java.util.Optional;
 | 
				
			||||||
 * is to the camera.
 | 
					 * is to the camera.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@AutoValue
 | 
					@AutoValue
 | 
				
			||||||
 | 
					@TargetApi(31)
 | 
				
			||||||
public abstract class Landmark {
 | 
					public abstract class Landmark {
 | 
				
			||||||
  private static final float TOLERANCE = 1e-6f;
 | 
					  private static final float TOLERANCE = 1e-6f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** Creates a landmark from x, y, z coordinates. */
 | 
				
			||||||
  public static Landmark create(float x, float y, float z) {
 | 
					  public static Landmark create(float x, float y, float z) {
 | 
				
			||||||
    return new AutoValue_Landmark(x, y, z, Optional.empty(), Optional.empty());
 | 
					    return new AutoValue_Landmark(x, y, z, Optional.empty(), Optional.empty());
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Creates a normalized landmark from x, y, z coordinates with optional visibility and presence.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
  public static Landmark create(
 | 
					  public static Landmark create(
 | 
				
			||||||
      float x, float y, float z, Optional<Float> visibility, Optional<Float> presence) {
 | 
					      float x, float y, float z, Optional<Float> visibility, Optional<Float> presence) {
 | 
				
			||||||
    return new AutoValue_Landmark(x, y, z, visibility, presence);
 | 
					    return new AutoValue_Landmark(x, y, z, visibility, presence);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** Creates a landmark from a landmark proto. */
 | 
				
			||||||
 | 
					  public static Landmark createFromProto(LandmarkProto.Landmark landmarkProto) {
 | 
				
			||||||
 | 
					    return Landmark.create(
 | 
				
			||||||
 | 
					        landmarkProto.getX(),
 | 
				
			||||||
 | 
					        landmarkProto.getY(),
 | 
				
			||||||
 | 
					        landmarkProto.getZ(),
 | 
				
			||||||
 | 
					        landmarkProto.hasVisibility()
 | 
				
			||||||
 | 
					            ? Optional.of(landmarkProto.getVisibility())
 | 
				
			||||||
 | 
					            : Optional.empty(),
 | 
				
			||||||
 | 
					        landmarkProto.hasPresence() ? Optional.of(landmarkProto.getPresence()) : Optional.empty());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** Creates a list of landmarks from a {@link LandmarkList}. */
 | 
				
			||||||
 | 
					  public static List<Landmark> createListFromProto(LandmarkProto.LandmarkList landmarkListProto) {
 | 
				
			||||||
 | 
					    List<Landmark> landmarkList = new ArrayList<>();
 | 
				
			||||||
 | 
					    for (LandmarkProto.Landmark landmarkProto : landmarkListProto.getLandmarkList()) {
 | 
				
			||||||
 | 
					      landmarkList.add(createFromProto(landmarkProto));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return landmarkList;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // The x coordinates of the landmark.
 | 
					  // The x coordinates of the landmark.
 | 
				
			||||||
  public abstract float x();
 | 
					  public abstract float x();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,11 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package com.google.mediapipe.tasks.components.containers;
 | 
					package com.google.mediapipe.tasks.components.containers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.annotation.TargetApi;
 | 
				
			||||||
import com.google.auto.value.AutoValue;
 | 
					import com.google.auto.value.AutoValue;
 | 
				
			||||||
 | 
					import com.google.mediapipe.formats.proto.LandmarkProto;
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Objects;
 | 
					import java.util.Objects;
 | 
				
			||||||
import java.util.Optional;
 | 
					import java.util.Optional;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,18 +29,45 @@ import java.util.Optional;
 | 
				
			||||||
 * uses roughly the same scale as x.
 | 
					 * uses roughly the same scale as x.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@AutoValue
 | 
					@AutoValue
 | 
				
			||||||
 | 
					@TargetApi(31)
 | 
				
			||||||
public abstract class NormalizedLandmark {
 | 
					public abstract class NormalizedLandmark {
 | 
				
			||||||
  private static final float TOLERANCE = 1e-6f;
 | 
					  private static final float TOLERANCE = 1e-6f;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** Creates a normalized landmark from x, y, z coordinates. */
 | 
				
			||||||
  public static NormalizedLandmark create(float x, float y, float z) {
 | 
					  public static NormalizedLandmark create(float x, float y, float z) {
 | 
				
			||||||
    return new AutoValue_NormalizedLandmark(x, y, z, Optional.empty(), Optional.empty());
 | 
					    return new AutoValue_NormalizedLandmark(x, y, z, Optional.empty(), Optional.empty());
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Creates a normalized landmark from x, y, z coordinates with optional visibility and presence.
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
  public static NormalizedLandmark create(
 | 
					  public static NormalizedLandmark create(
 | 
				
			||||||
      float x, float y, float z, Optional<Float> visibility, Optional<Float> presence) {
 | 
					      float x, float y, float z, Optional<Float> visibility, Optional<Float> presence) {
 | 
				
			||||||
    return new AutoValue_NormalizedLandmark(x, y, z, visibility, presence);
 | 
					    return new AutoValue_NormalizedLandmark(x, y, z, visibility, presence);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** Creates a normalized landmark from a normalized landmark proto. */
 | 
				
			||||||
 | 
					  public static NormalizedLandmark createFromProto(LandmarkProto.NormalizedLandmark landmarkProto) {
 | 
				
			||||||
 | 
					    return NormalizedLandmark.create(
 | 
				
			||||||
 | 
					        landmarkProto.getX(),
 | 
				
			||||||
 | 
					        landmarkProto.getY(),
 | 
				
			||||||
 | 
					        landmarkProto.getZ(),
 | 
				
			||||||
 | 
					        landmarkProto.hasVisibility()
 | 
				
			||||||
 | 
					            ? Optional.of(landmarkProto.getVisibility())
 | 
				
			||||||
 | 
					            : Optional.empty(),
 | 
				
			||||||
 | 
					        landmarkProto.hasPresence() ? Optional.of(landmarkProto.getPresence()) : Optional.empty());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** Creates a list of normalized landmarks from a {@link NormalizedLandmarkList}. */
 | 
				
			||||||
 | 
					  public static List<NormalizedLandmark> createListFromProto(
 | 
				
			||||||
 | 
					      LandmarkProto.NormalizedLandmarkList landmarkListProto) {
 | 
				
			||||||
 | 
					    List<NormalizedLandmark> landmarkList = new ArrayList<>();
 | 
				
			||||||
 | 
					    for (LandmarkProto.NormalizedLandmark landmarkProto : landmarkListProto.getLandmarkList()) {
 | 
				
			||||||
 | 
					      landmarkList.add(createFromProto(landmarkProto));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return landmarkList;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // The x coordinates of the normalized landmark.
 | 
					  // The x coordinates of the normalized landmark.
 | 
				
			||||||
  public abstract float x();
 | 
					  public abstract float x();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,23 +46,11 @@ public abstract class FaceLandmarkerResult implements TaskResult {
 | 
				
			||||||
      long timestampMs) {
 | 
					      long timestampMs) {
 | 
				
			||||||
    List<List<NormalizedLandmark>> multiFaceLandmarks = new ArrayList<>();
 | 
					    List<List<NormalizedLandmark>> multiFaceLandmarks = new ArrayList<>();
 | 
				
			||||||
    for (LandmarkProto.NormalizedLandmarkList faceLandmarksProto : multiFaceLandmarksProto) {
 | 
					    for (LandmarkProto.NormalizedLandmarkList faceLandmarksProto : multiFaceLandmarksProto) {
 | 
				
			||||||
      List<NormalizedLandmark> faceLandmarks = new ArrayList<>();
 | 
					      List<NormalizedLandmark> faceLandmarks =
 | 
				
			||||||
      multiFaceLandmarks.add(faceLandmarks);
 | 
					          NormalizedLandmark.createListFromProto(faceLandmarksProto);
 | 
				
			||||||
      for (LandmarkProto.NormalizedLandmark faceLandmarkProto :
 | 
					      multiFaceLandmarks.add(Collections.unmodifiableList(faceLandmarks));
 | 
				
			||||||
          faceLandmarksProto.getLandmarkList()) {
 | 
					 | 
				
			||||||
        faceLandmarks.add(
 | 
					 | 
				
			||||||
            NormalizedLandmark.create(
 | 
					 | 
				
			||||||
                faceLandmarkProto.getX(),
 | 
					 | 
				
			||||||
                faceLandmarkProto.getY(),
 | 
					 | 
				
			||||||
                faceLandmarkProto.getZ(),
 | 
					 | 
				
			||||||
                faceLandmarkProto.hasVisibility()
 | 
					 | 
				
			||||||
                    ? Optional.of(faceLandmarkProto.getVisibility())
 | 
					 | 
				
			||||||
                    : Optional.empty(),
 | 
					 | 
				
			||||||
                faceLandmarkProto.hasPresence()
 | 
					 | 
				
			||||||
                    ? Optional.of(faceLandmarkProto.getPresence())
 | 
					 | 
				
			||||||
                    : Optional.empty()));
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Optional<List<List<Category>>> multiFaceBlendshapes = Optional.empty();
 | 
					    Optional<List<List<Category>>> multiFaceBlendshapes = Optional.empty();
 | 
				
			||||||
    if (multiFaceBendshapesProto.isPresent()) {
 | 
					    if (multiFaceBendshapesProto.isPresent()) {
 | 
				
			||||||
      List<List<Category>> blendshapes = new ArrayList<>();
 | 
					      List<List<Category>> blendshapes = new ArrayList<>();
 | 
				
			||||||
| 
						 | 
					@ -72,6 +60,7 @@ public abstract class FaceLandmarkerResult implements TaskResult {
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      multiFaceBlendshapes = Optional.of(Collections.unmodifiableList(blendshapes));
 | 
					      multiFaceBlendshapes = Optional.of(Collections.unmodifiableList(blendshapes));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Optional<List<float[]>> multiFaceTransformationMatrixes = Optional.empty();
 | 
					    Optional<List<float[]>> multiFaceTransformationMatrixes = Optional.empty();
 | 
				
			||||||
    if (multiFaceTransformationMatrixesProto.isPresent()) {
 | 
					    if (multiFaceTransformationMatrixesProto.isPresent()) {
 | 
				
			||||||
      List<float[]> matrixes = new ArrayList<>();
 | 
					      List<float[]> matrixes = new ArrayList<>();
 | 
				
			||||||
| 
						 | 
					@ -90,6 +79,7 @@ public abstract class FaceLandmarkerResult implements TaskResult {
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      multiFaceTransformationMatrixes = Optional.of(Collections.unmodifiableList(matrixes));
 | 
					      multiFaceTransformationMatrixes = Optional.of(Collections.unmodifiableList(matrixes));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return new AutoValue_FaceLandmarkerResult(
 | 
					    return new AutoValue_FaceLandmarkerResult(
 | 
				
			||||||
        timestampMs,
 | 
					        timestampMs,
 | 
				
			||||||
        Collections.unmodifiableList(multiFaceLandmarks),
 | 
					        Collections.unmodifiableList(multiFaceLandmarks),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,7 +24,6 @@ import com.google.mediapipe.tasks.core.TaskResult;
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
import java.util.Collections;
 | 
					import java.util.Collections;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Optional;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Represents the hand landmarks deection results generated by {@link HandLandmarker}. */
 | 
					/** Represents the hand landmarks deection results generated by {@link HandLandmarker}. */
 | 
				
			||||||
@AutoValue
 | 
					@AutoValue
 | 
				
			||||||
| 
						 | 
					@ -34,63 +33,38 @@ public abstract class HandLandmarkerResult implements TaskResult {
 | 
				
			||||||
   * Creates a {@link HandLandmarkerResult} instance from the lists of landmarks and handedness
 | 
					   * Creates a {@link HandLandmarkerResult} instance from the lists of landmarks and handedness
 | 
				
			||||||
   * protobuf messages.
 | 
					   * protobuf messages.
 | 
				
			||||||
   *
 | 
					   *
 | 
				
			||||||
   * @param landmarksProto a List of {@link NormalizedLandmarkList}
 | 
					   * @param landmarksProtos a List of {@link NormalizedLandmarkList}
 | 
				
			||||||
   * @param worldLandmarksProto a List of {@link LandmarkList}
 | 
					   * @param worldLandmarksProtos a List of {@link LandmarkList}
 | 
				
			||||||
   * @param handednessesProto a List of {@link ClassificationList}
 | 
					   * @param handednessesProtos a List of {@link ClassificationList}
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
  static HandLandmarkerResult create(
 | 
					  static HandLandmarkerResult create(
 | 
				
			||||||
      List<LandmarkProto.NormalizedLandmarkList> landmarksProto,
 | 
					      List<LandmarkProto.NormalizedLandmarkList> landmarksProtos,
 | 
				
			||||||
      List<LandmarkProto.LandmarkList> worldLandmarksProto,
 | 
					      List<LandmarkProto.LandmarkList> worldLandmarksProtos,
 | 
				
			||||||
      List<ClassificationList> handednessesProto,
 | 
					      List<ClassificationList> handednessesProtos,
 | 
				
			||||||
      long timestampMs) {
 | 
					      long timestampMs) {
 | 
				
			||||||
    List<List<NormalizedLandmark>> multiHandLandmarks = new ArrayList<>();
 | 
					    List<List<NormalizedLandmark>> handLandmarks = new ArrayList<>();
 | 
				
			||||||
    List<List<Landmark>> multiHandWorldLandmarks = new ArrayList<>();
 | 
					    for (LandmarkProto.NormalizedLandmarkList handLandmarksProto : landmarksProtos) {
 | 
				
			||||||
    List<List<Category>> multiHandHandednesses = new ArrayList<>();
 | 
					 | 
				
			||||||
    for (LandmarkProto.NormalizedLandmarkList handLandmarksProto : landmarksProto) {
 | 
					 | 
				
			||||||
      List<NormalizedLandmark> handLandmarks = new ArrayList<>();
 | 
					 | 
				
			||||||
      multiHandLandmarks.add(handLandmarks);
 | 
					 | 
				
			||||||
      for (LandmarkProto.NormalizedLandmark handLandmarkProto :
 | 
					 | 
				
			||||||
          handLandmarksProto.getLandmarkList()) {
 | 
					 | 
				
			||||||
      handLandmarks.add(
 | 
					      handLandmarks.add(
 | 
				
			||||||
            NormalizedLandmark.create(
 | 
					          Collections.unmodifiableList(NormalizedLandmark.createListFromProto(handLandmarksProto)));
 | 
				
			||||||
                handLandmarkProto.getX(),
 | 
					 | 
				
			||||||
                handLandmarkProto.getY(),
 | 
					 | 
				
			||||||
                handLandmarkProto.getZ(),
 | 
					 | 
				
			||||||
                handLandmarkProto.hasVisibility()
 | 
					 | 
				
			||||||
                    ? Optional.of(handLandmarkProto.getVisibility())
 | 
					 | 
				
			||||||
                    : Optional.empty(),
 | 
					 | 
				
			||||||
                handLandmarkProto.hasPresence()
 | 
					 | 
				
			||||||
                    ? Optional.of(handLandmarkProto.getPresence())
 | 
					 | 
				
			||||||
                    : Optional.empty()));
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    }
 | 
					
 | 
				
			||||||
    for (LandmarkProto.LandmarkList handWorldLandmarksProto : worldLandmarksProto) {
 | 
					    List<List<Landmark>> handWorldLandmarks = new ArrayList<>();
 | 
				
			||||||
      List<Landmark> handWorldLandmarks = new ArrayList<>();
 | 
					    for (LandmarkProto.LandmarkList handWorldLandmarksProto : worldLandmarksProtos) {
 | 
				
			||||||
      multiHandWorldLandmarks.add(handWorldLandmarks);
 | 
					 | 
				
			||||||
      for (LandmarkProto.Landmark handWorldLandmarkProto :
 | 
					 | 
				
			||||||
          handWorldLandmarksProto.getLandmarkList()) {
 | 
					 | 
				
			||||||
      handWorldLandmarks.add(
 | 
					      handWorldLandmarks.add(
 | 
				
			||||||
            com.google.mediapipe.tasks.components.containers.Landmark.create(
 | 
					          Collections.unmodifiableList(Landmark.createListFromProto(handWorldLandmarksProto)));
 | 
				
			||||||
                handWorldLandmarkProto.getX(),
 | 
					 | 
				
			||||||
                handWorldLandmarkProto.getY(),
 | 
					 | 
				
			||||||
                handWorldLandmarkProto.getZ(),
 | 
					 | 
				
			||||||
                handWorldLandmarkProto.hasVisibility()
 | 
					 | 
				
			||||||
                    ? Optional.of(handWorldLandmarkProto.getVisibility())
 | 
					 | 
				
			||||||
                    : Optional.empty(),
 | 
					 | 
				
			||||||
                handWorldLandmarkProto.hasPresence()
 | 
					 | 
				
			||||||
                    ? Optional.of(handWorldLandmarkProto.getPresence())
 | 
					 | 
				
			||||||
                    : Optional.empty()));
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    List<List<Category>> handHandednesses = new ArrayList<>();
 | 
				
			||||||
 | 
					    for (ClassificationList handednessProto : handednessesProtos) {
 | 
				
			||||||
 | 
					      handHandednesses.add(
 | 
				
			||||||
 | 
					          Collections.unmodifiableList(Category.createListFromProto(handednessProto)));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    for (ClassificationList handednessProto : handednessesProto) {
 | 
					
 | 
				
			||||||
      List<Category> handedness = Category.createListFromProto(handednessProto);
 | 
					 | 
				
			||||||
      multiHandHandednesses.add(Collections.unmodifiableList(handedness));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return new AutoValue_HandLandmarkerResult(
 | 
					    return new AutoValue_HandLandmarkerResult(
 | 
				
			||||||
        timestampMs,
 | 
					        timestampMs,
 | 
				
			||||||
        Collections.unmodifiableList(multiHandLandmarks),
 | 
					        Collections.unmodifiableList(handLandmarks),
 | 
				
			||||||
        Collections.unmodifiableList(multiHandWorldLandmarks),
 | 
					        Collections.unmodifiableList(handWorldLandmarks),
 | 
				
			||||||
        Collections.unmodifiableList(multiHandHandednesses));
 | 
					        Collections.unmodifiableList(handHandednesses));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Override
 | 
					  @Override
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -50,43 +50,18 @@ public abstract class PoseLandmarkerResult implements TaskResult {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    List<List<NormalizedLandmark>> multiPoseLandmarks = new ArrayList<>();
 | 
					    List<List<NormalizedLandmark>> multiPoseLandmarks = new ArrayList<>();
 | 
				
			||||||
 | 
					    for (LandmarkProto.NormalizedLandmarkList handLandmarksProto : landmarksProto) {
 | 
				
			||||||
 | 
					      List<NormalizedLandmark> poseLandmarks =
 | 
				
			||||||
 | 
					          NormalizedLandmark.createListFromProto(handLandmarksProto);
 | 
				
			||||||
 | 
					      multiPoseLandmarks.add(Collections.unmodifiableList(poseLandmarks));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    List<List<Landmark>> multiPoseWorldLandmarks = new ArrayList<>();
 | 
					    List<List<Landmark>> multiPoseWorldLandmarks = new ArrayList<>();
 | 
				
			||||||
    for (LandmarkProto.NormalizedLandmarkList poseLandmarksProto : landmarksProto) {
 | 
					 | 
				
			||||||
      List<NormalizedLandmark> poseLandmarks = new ArrayList<>();
 | 
					 | 
				
			||||||
      multiPoseLandmarks.add(poseLandmarks);
 | 
					 | 
				
			||||||
      for (LandmarkProto.NormalizedLandmark poseLandmarkProto :
 | 
					 | 
				
			||||||
          poseLandmarksProto.getLandmarkList()) {
 | 
					 | 
				
			||||||
        poseLandmarks.add(
 | 
					 | 
				
			||||||
            NormalizedLandmark.create(
 | 
					 | 
				
			||||||
                poseLandmarkProto.getX(),
 | 
					 | 
				
			||||||
                poseLandmarkProto.getY(),
 | 
					 | 
				
			||||||
                poseLandmarkProto.getZ(),
 | 
					 | 
				
			||||||
                poseLandmarkProto.hasVisibility()
 | 
					 | 
				
			||||||
                    ? Optional.of(poseLandmarkProto.getVisibility())
 | 
					 | 
				
			||||||
                    : Optional.empty(),
 | 
					 | 
				
			||||||
                poseLandmarkProto.hasPresence()
 | 
					 | 
				
			||||||
                    ? Optional.of(poseLandmarkProto.getPresence())
 | 
					 | 
				
			||||||
                    : Optional.empty()));
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    for (LandmarkProto.LandmarkList poseWorldLandmarksProto : worldLandmarksProto) {
 | 
					    for (LandmarkProto.LandmarkList poseWorldLandmarksProto : worldLandmarksProto) {
 | 
				
			||||||
      List<Landmark> poseWorldLandmarks = new ArrayList<>();
 | 
					      List<Landmark> poseWorldLandmarks = Landmark.createListFromProto(poseWorldLandmarksProto);
 | 
				
			||||||
      multiPoseWorldLandmarks.add(poseWorldLandmarks);
 | 
					      multiPoseWorldLandmarks.add(Collections.unmodifiableList(poseWorldLandmarks));
 | 
				
			||||||
      for (LandmarkProto.Landmark poseWorldLandmarkProto :
 | 
					 | 
				
			||||||
          poseWorldLandmarksProto.getLandmarkList()) {
 | 
					 | 
				
			||||||
        poseWorldLandmarks.add(
 | 
					 | 
				
			||||||
            Landmark.create(
 | 
					 | 
				
			||||||
                poseWorldLandmarkProto.getX(),
 | 
					 | 
				
			||||||
                poseWorldLandmarkProto.getY(),
 | 
					 | 
				
			||||||
                poseWorldLandmarkProto.getZ(),
 | 
					 | 
				
			||||||
                poseWorldLandmarkProto.hasVisibility()
 | 
					 | 
				
			||||||
                    ? Optional.of(poseWorldLandmarkProto.getVisibility())
 | 
					 | 
				
			||||||
                    : Optional.empty(),
 | 
					 | 
				
			||||||
                poseWorldLandmarkProto.hasPresence()
 | 
					 | 
				
			||||||
                    ? Optional.of(poseWorldLandmarkProto.getPresence())
 | 
					 | 
				
			||||||
                    : Optional.empty()));
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return new AutoValue_PoseLandmarkerResult(
 | 
					    return new AutoValue_PoseLandmarkerResult(
 | 
				
			||||||
        timestampMs,
 | 
					        timestampMs,
 | 
				
			||||||
        Collections.unmodifiableList(multiPoseLandmarks),
 | 
					        Collections.unmodifiableList(multiPoseLandmarks),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,62 @@
 | 
				
			||||||
 | 
					// Copyright 2022 The MediaPipe Authors.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					// you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					// You may obtain a copy of the License at
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//      http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					// distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					// See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					// limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package com.google.mediapipe.tasks.components.containers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static com.google.common.truth.Truth.assertThat;
 | 
				
			||||||
 | 
					import static org.junit.Assert.assertFalse;
 | 
				
			||||||
 | 
					import static org.junit.Assert.assertTrue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import androidx.test.ext.junit.runners.AndroidJUnit4;
 | 
				
			||||||
 | 
					import com.google.mediapipe.formats.proto.LandmarkProto;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import org.junit.Test;
 | 
				
			||||||
 | 
					import org.junit.runner.RunWith;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@RunWith(AndroidJUnit4.class)
 | 
				
			||||||
 | 
					public final class LandmarkTest {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void createFromProto_succeedsWithCoordinates() {
 | 
				
			||||||
 | 
					    LandmarkProto.Landmark input =
 | 
				
			||||||
 | 
					        LandmarkProto.Landmark.newBuilder().setX(1.0f).setY(2.0f).setZ(3.0f).build();
 | 
				
			||||||
 | 
					    Landmark output = Landmark.createFromProto(input);
 | 
				
			||||||
 | 
					    assertThat(output.x()).isEqualTo(1.0f);
 | 
				
			||||||
 | 
					    assertThat(output.y()).isEqualTo(2.0f);
 | 
				
			||||||
 | 
					    assertThat(output.z()).isEqualTo(3.0f);
 | 
				
			||||||
 | 
					    assertFalse(output.visibility().isPresent());
 | 
				
			||||||
 | 
					    assertFalse(output.presence().isPresent());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void createFromProto_succeedsWithVisibility() {
 | 
				
			||||||
 | 
					    LandmarkProto.Landmark input =
 | 
				
			||||||
 | 
					        LandmarkProto.Landmark.newBuilder().setVisibility(0.4f).setPresence(0.5f).build();
 | 
				
			||||||
 | 
					    Landmark output = Landmark.createFromProto(input);
 | 
				
			||||||
 | 
					    assertTrue(output.visibility().isPresent());
 | 
				
			||||||
 | 
					    assertThat(output.visibility().get()).isEqualTo(0.4f);
 | 
				
			||||||
 | 
					    assertTrue(output.presence().isPresent());
 | 
				
			||||||
 | 
					    assertThat(output.presence().get()).isEqualTo(0.5f);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void createListFromProto_succeeds() {
 | 
				
			||||||
 | 
					    LandmarkProto.Landmark element =
 | 
				
			||||||
 | 
					        LandmarkProto.Landmark.newBuilder().setX(1.0f).setY(2.0f).setZ(3.0f).build();
 | 
				
			||||||
 | 
					    LandmarkProto.LandmarkList input =
 | 
				
			||||||
 | 
					        LandmarkProto.LandmarkList.newBuilder().addLandmark(element).build();
 | 
				
			||||||
 | 
					    List<Landmark> output = Landmark.createListFromProto(input);
 | 
				
			||||||
 | 
					    assertThat(output).hasSize(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,62 @@
 | 
				
			||||||
 | 
					// Copyright 2022 The MediaPipe Authors.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					// you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					// You may obtain a copy of the License at
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//      http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					// distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					// See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					// limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package com.google.mediapipe.tasks.components.containers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static com.google.common.truth.Truth.assertThat;
 | 
				
			||||||
 | 
					import static org.junit.Assert.assertFalse;
 | 
				
			||||||
 | 
					import static org.junit.Assert.assertTrue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import androidx.test.ext.junit.runners.AndroidJUnit4;
 | 
				
			||||||
 | 
					import com.google.mediapipe.formats.proto.LandmarkProto;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import org.junit.Test;
 | 
				
			||||||
 | 
					import org.junit.runner.RunWith;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@RunWith(AndroidJUnit4.class)
 | 
				
			||||||
 | 
					public final class NormalizedLandmarkTest {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void createFromProto_succeedsWithCoordinates() {
 | 
				
			||||||
 | 
					    LandmarkProto.NormalizedLandmark input =
 | 
				
			||||||
 | 
					        LandmarkProto.NormalizedLandmark.newBuilder().setX(0.1f).setY(0.2f).setZ(0.3f).build();
 | 
				
			||||||
 | 
					    NormalizedLandmark output = NormalizedLandmark.createFromProto(input);
 | 
				
			||||||
 | 
					    assertThat(output.x()).isEqualTo(0.1f);
 | 
				
			||||||
 | 
					    assertThat(output.y()).isEqualTo(0.2f);
 | 
				
			||||||
 | 
					    assertThat(output.z()).isEqualTo(0.3f);
 | 
				
			||||||
 | 
					    assertFalse(output.visibility().isPresent());
 | 
				
			||||||
 | 
					    assertFalse(output.presence().isPresent());
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void createFromProto_succeedsWithVisibility() {
 | 
				
			||||||
 | 
					    LandmarkProto.NormalizedLandmark input =
 | 
				
			||||||
 | 
					        LandmarkProto.NormalizedLandmark.newBuilder().setVisibility(0.4f).setPresence(0.5f).build();
 | 
				
			||||||
 | 
					    NormalizedLandmark output = NormalizedLandmark.createFromProto(input);
 | 
				
			||||||
 | 
					    assertTrue(output.visibility().isPresent());
 | 
				
			||||||
 | 
					    assertThat(output.visibility().get()).isEqualTo(0.4f);
 | 
				
			||||||
 | 
					    assertTrue(output.presence().isPresent());
 | 
				
			||||||
 | 
					    assertThat(output.presence().get()).isEqualTo(0.5f);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void createListFromProto_succeeds() {
 | 
				
			||||||
 | 
					    LandmarkProto.NormalizedLandmark element =
 | 
				
			||||||
 | 
					        LandmarkProto.NormalizedLandmark.newBuilder().setX(0.1f).setY(0.2f).setZ(0.3f).build();
 | 
				
			||||||
 | 
					    LandmarkProto.NormalizedLandmarkList input =
 | 
				
			||||||
 | 
					        LandmarkProto.NormalizedLandmarkList.newBuilder().addLandmark(element).build();
 | 
				
			||||||
 | 
					    List<NormalizedLandmark> output = NormalizedLandmark.createListFromProto(input);
 | 
				
			||||||
 | 
					    assertThat(output).hasSize(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user