diff --git a/WORKSPACE b/WORKSPACE
index 82d3c12b3..0639591ff 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -415,6 +415,7 @@ maven_install(
"com.google.guava:listenablefuture:1.0",
"junit:junit:4.12",
"org.hamcrest:hamcrest-library:1.3",
+ "com.afollestad.material-dialogs:core:0.9.6.0",
],
fetch_sources = True,
repositories = [
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/BUILD b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/BUILD
index c473aca26..93d0fb0bf 100644
--- a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/BUILD
+++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/BUILD
@@ -25,7 +25,7 @@ android_binary(
"applicationId": "com.google.mediapipe.examples.posetracking_lindera",
},
multidex = "native",
- resource_files = ["//mediapipe/examples/android/solutions:resource_files"],
+ resource_files = [":resource_files"],
deps = [
"//mediapipe/framework/formats:detection_java_proto_lite",
"//mediapipe/framework/formats:landmark_java_proto_lite",
@@ -48,5 +48,12 @@ android_binary(
"@maven//:androidx_exifinterface_exifinterface",
"@maven//:androidx_fragment_fragment",
"@maven//:com_google_guava_guava",
+ "@maven//:com_afollestad_material_dialogs_core",
],
)
+
+filegroup(
+ name = "resource_files",
+ srcs = glob(["res/**"]),
+ # visibility = ["//mediapipe/examples/android/solutions:__subpackages__"],
+)
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/java/com/google/mediapipe/examples/posetracking_lindera/MainActivity.java b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/java/com/google/mediapipe/examples/posetracking_lindera/MainActivity.java
index c7ae4a98d..304c4bacc 100644
--- a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/java/com/google/mediapipe/examples/posetracking_lindera/MainActivity.java
+++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/java/com/google/mediapipe/examples/posetracking_lindera/MainActivity.java
@@ -15,17 +15,24 @@
package com.google.mediapipe.examples.posetracking_lindera;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
+import android.widget.ProgressBar;
import androidx.appcompat.app.AppCompatActivity;
+import com.afollestad.materialdialogs.MaterialDialog;
import com.google.mediapipe.solutions.lindera.CameraRotation;
import com.google.mediapipe.solutions.lindera.ComputerVisionPlugin;
import com.google.mediapipe.solutions.lindera.Lindera;
+import java.util.Arrays;
import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
/**
@@ -47,8 +54,8 @@ public class MainActivity extends AppCompatActivity {
setContentView(R.layout.activity_main);
- disableRedundantUI();
-
+ findViewById(R.id.button_set_model).setVisibility(View.GONE);
+ findViewById(R.id.button_toggle_landmarks).setVisibility(View.GONE);
setupLiveDemoUiComponents();
plugin = new ComputerVisionPluginImpl();
lindera = new Lindera(plugin);
@@ -65,45 +72,125 @@ public class MainActivity extends AppCompatActivity {
*/
private void setupLiveDemoUiComponents() {
- Button startCameraButton = findViewById(R.id.button_start_camera);
+ Button startDetectionButton = findViewById(R.id.button_start_detection);
+ Button toggleLandmarks = findViewById(R.id.button_toggle_landmarks);
+ Button modelComplexity = findViewById(R.id.button_set_model);
FrameLayout frameLayout = findViewById(R.id.preview_display_layout);
-
- startCameraButton.setOnClickListener(
+ startDetectionButton.setOnClickListener(
v -> {
// startCameraButton.setVisibility(View.GONE);
if (!isLinderaInitialized) {
- lindera.initialize(frameLayout, MainActivity.this);
- isLinderaInitialized = true;
- startCameraButton.setText("STOP CAMERA");
+ modelLoadAsyncDialogue(()->{
+ lindera.initialize(frameLayout, MainActivity.this);
+ isLinderaInitialized = true;
+ startDetectionButton.setVisibility(View.GONE);
+ findViewById(R.id.button_set_model).setVisibility(View.VISIBLE);
+ findViewById(R.id.button_toggle_landmarks).setVisibility(View.VISIBLE);
+ updateLandmarkButtonText();
+ updateModelComplexityButtonText();
+ });
- } else {
-
- if (isDetectionStarted) {
- startCameraButton.setText(R.string.start_camera);
-
-
- lindera.stopDetection();
- } else {
- lindera.startDetection();
- startCameraButton.setText("STOP CAMERA");
-
- }
}
isDetectionStarted = !isDetectionStarted;
});
- }
- /**
- * Disables unecesary UI buttons
- */
- private void disableRedundantUI() {
- findViewById(R.id.button_load_picture).setVisibility(View.GONE);
- findViewById(R.id.button_load_video).setVisibility(View.GONE);
+ toggleLandmarks.setOnClickListener(
+ v ->{
+ this.lindera.setLandmarksVisibility(!this.lindera.getLandmarkVisibility());
+ updateLandmarkButtonText();
+ }
+ );
+
+ modelComplexity.setOnClickListener(v->{
+ int modelComplexityVal = lindera.getModelComplexity();
+
+ new MaterialDialog.Builder(this)
+ .title("Choose Model Complexity")
+ .items(Arrays.asList("Lite","Full","Heavy"))
+ .itemsCallbackSingleChoice(modelComplexityVal, new MaterialDialog.ListCallbackSingleChoice() {
+ @Override
+ public boolean onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
+ /**
+ * If you use alwaysCallSingleChoiceCallback(), which is discussed below,
+ * returning false here won't allow the newly selected radio button to actually be selected.
+ **/
+ if (which != modelComplexityVal){
+ modelLoadAsyncDialogue(()-> {
+ lindera.setModelComplexity(which);
+ lindera.restartDetection();
+ updateModelComplexityButtonText();
+ });
+ }
+ return true;
+ }
+ })
+ .positiveText("choose")
+ .show();
+// listItemsSingleChoice(R.array.my_items, initialSelection = 1);
+
+
+
+ });
}
+ void updateLandmarkButtonText(){
+ Button toggleLandmarks = findViewById(R.id.button_toggle_landmarks);
+
+ if (this.lindera.getLandmarkVisibility()) {
+ toggleLandmarks.setText("Show Landmarks (On)");
+ }else{
+ toggleLandmarks.setText("Show Landmarks (Off)");
+
+ }
+ }
+
+ void updateModelComplexityButtonText(){
+ String text = "Select Model ";
+ switch (this.lindera.getModelComplexity()){
+ case 0:
+ text += "(lite)";
+ break;
+ case 1:
+ text += "(full)";
+ break;
+ case 2:
+ text += "(heavy)";
+ break;
+
+ }
+ Button setModel = findViewById(R.id.button_set_model);
+ setModel.setText(text);
+
+ }
+
+ void modelLoadAsyncDialogue(Runnable loader){
+ ProgressBar pbar = new ProgressBar(this);
+ MaterialDialog dialog = new MaterialDialog.Builder(this)
+ .title("Loading Model")
+ .customView(pbar, false)
+ .build();
+ dialog.show();
+ ExecutorService executor = Executors.newSingleThreadExecutor();
+ Handler handler = new Handler(Looper.getMainLooper());
+
+ executor.execute(new Runnable() {
+ @Override
+ public void run() {
+ //Background work here
+ handler.post(loader);
+ dialog.dismiss();
+ }
+ });
+ }
+
+
+
+
+
+
}
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res
deleted file mode 120000
index fc8850136..000000000
--- a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res
+++ /dev/null
@@ -1 +0,0 @@
-../../../res
\ No newline at end of file
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/drawable-v24/ic_launcher_foreground.xml b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 000000000..c7bd21dbd
--- /dev/null
+++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/drawable/ic_launcher_background.xml b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 000000000..01f0af0ad
--- /dev/null
+++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/layout/activity_main.xml b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/layout/activity_main.xml
new file mode 100644
index 000000000..ceca64dea
--- /dev/null
+++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/layout/activity_main.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 000000000..d372a4fca
--- /dev/null
+++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 000000000..d372a4fca
--- /dev/null
+++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-hdpi/ic_launcher.png b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..920cbf3f1
Binary files /dev/null and b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..7dfa35f78
Binary files /dev/null and b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-hdpi/ic_launcher_round.png b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 000000000..20dfc6c13
Binary files /dev/null and b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-mdpi/ic_launcher.png b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..3813caa21
Binary files /dev/null and b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..d49232778
Binary files /dev/null and b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-mdpi/ic_launcher_round.png b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 000000000..18f9ac5e7
Binary files /dev/null and b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xhdpi/ic_launcher.png b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..b79cc77a0
Binary files /dev/null and b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..811b17cee
Binary files /dev/null and b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 000000000..2f3c752e5
Binary files /dev/null and b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxhdpi/ic_launcher.png b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..05585e4c6
Binary files /dev/null and b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..46b77639c
Binary files /dev/null and b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 000000000..f87332424
Binary files /dev/null and b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..8ccd6c840
Binary files /dev/null and b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..06b982e31
Binary files /dev/null and b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 000000000..501748acc
Binary files /dev/null and b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/values/colors.xml b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/values/colors.xml
new file mode 100644
index 000000000..69b22338c
--- /dev/null
+++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #008577
+ #00574B
+ #D81B60
+
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/values/strings.xml b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/values/strings.xml
new file mode 100644
index 000000000..1e6b68a9f
--- /dev/null
+++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/values/strings.xml
@@ -0,0 +1,6 @@
+
+ Load Picture
+ Load Video
+ Start Camera
+ Please press any button above to start
+
diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/values/styles.xml b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/values/styles.xml
new file mode 100644
index 000000000..5885930df
--- /dev/null
+++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/res/values/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/mediapipe/java/com/google/mediapipe/solutions/lindera/Lindera.java b/mediapipe/java/com/google/mediapipe/solutions/lindera/Lindera.java
index 07e2ee235..68244797b 100644
--- a/mediapipe/java/com/google/mediapipe/solutions/lindera/Lindera.java
+++ b/mediapipe/java/com/google/mediapipe/solutions/lindera/Lindera.java
@@ -37,6 +37,33 @@ public class Lindera {
this.plugin = plugin;
}
+ public void setLandmarksVisibility(boolean visible){
+ this.poseTracking.options = PoseTrackingOptions.builder().withPoseTrackingOptions(this.poseTracking
+ .options).setLandmarkVisibility(visible).build();
+ }
+ public boolean getLandmarkVisibility(){
+ return this.poseTracking.options.landmarkVisibility();
+ }
+
+ public int getModelComplexity(){
+ return this.poseTracking.options.modelComplexity();
+
+ }
+ public void setModelComplexity(int complexity){
+ this.poseTracking.options = PoseTrackingOptions.builder().withPoseTrackingOptions(this.poseTracking
+ .options).setModelComplexity(complexity).build();
+ }
+
+ public void restartDetection(){
+ if (poseTracking!=null) {
+ stopDetection();
+ startDetection(poseTracking.options);
+ }else{
+ startDetection();
+ }
+
+ }
+
public void initialize (ViewGroup computerVisionContainerView , AppCompatActivity appCompatActivity){
this.computerVisionContainerView = computerVisionContainerView;
@@ -101,6 +128,7 @@ public class Lindera {
);
}
+
public void startDetection(PoseTrackingOptions options){
// ensure that class is initalized
assert (appCompatActivity != null);
diff --git a/mediapipe/java/com/google/mediapipe/solutions/posetracking/PoseTracking.java b/mediapipe/java/com/google/mediapipe/solutions/posetracking/PoseTracking.java
index a9cd64518..9796a8f6a 100644
--- a/mediapipe/java/com/google/mediapipe/solutions/posetracking/PoseTracking.java
+++ b/mediapipe/java/com/google/mediapipe/solutions/posetracking/PoseTracking.java
@@ -53,14 +53,15 @@ public class PoseTracking extends ImageSolutionBase {
private static final int OUTPUT_IMAGE_INDEX = 2;
private static final int LANDMARKS_INDEX = 3;
private final OutputHandler outputHandler;
-
+ public PoseTrackingOptions options;
/**
* Initializes MediaPipe Face Detection solution.
*
* @param context an Android {@link Context}.
- * @param options the configuration options defined in {@link PoseTrackingOptions}.
+ * @param poseTrackingOptions the configuration options defined in {@link PoseTrackingOptions}.
*/
- public PoseTracking(Context context, PoseTrackingOptions options) {
+ public PoseTracking(Context context, PoseTrackingOptions poseTrackingOptions) {
+ options = poseTrackingOptions;
outputHandler = new OutputHandler<>();
outputHandler.setOutputConverter(
packets -> {
diff --git a/mediapipe/java/com/google/mediapipe/solutions/posetracking/PoseTrackingOptions.java b/mediapipe/java/com/google/mediapipe/solutions/posetracking/PoseTrackingOptions.java
index f5ec60bab..f87902185 100644
--- a/mediapipe/java/com/google/mediapipe/solutions/posetracking/PoseTrackingOptions.java
+++ b/mediapipe/java/com/google/mediapipe/solutions/posetracking/PoseTrackingOptions.java
@@ -56,6 +56,13 @@ public abstract class PoseTrackingOptions {
.setMinDetectionConfidence(0.5f)
.setSmoothLandmarks(true);
}
+ public Builder withPoseTrackingOptions(PoseTrackingOptions options){
+ return setStaticImageMode(options.staticImageMode())
+ .setModelComplexity(options.modelComplexity())
+ .setMinDetectionConfidence(options.minDetectionConfidence())
+ .setSmoothLandmarks(options.smoothLandmarks())
+ .setLandmarkVisibility(options.landmarkVisibility());
+ }
public abstract Builder setStaticImageMode(boolean value);