From 39d6041f03040847459c7229ab151fa900ffd033 Mon Sep 17 00:00:00 2001 From: Mautisim Munir Date: Mon, 24 Oct 2022 06:30:16 +0500 Subject: [PATCH] json format conversion working --- .../posetracking-lindera/src/main/BUILD | 1 + .../ComputerVisionPluginImpl.java | 110 +++++++++++++++++- .../posetracking_lindera/MainActivity.java | 82 ++++++++++++- .../src/main/res/layout/activity_main.xml | 10 +- 4 files changed, 195 insertions(+), 8 deletions(-) diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/BUILD b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/BUILD index 93d0fb0bf..3bd9f445f 100644 --- a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/BUILD +++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/BUILD @@ -49,6 +49,7 @@ android_binary( "@maven//:androidx_fragment_fragment", "@maven//:com_google_guava_guava", "@maven//:com_afollestad_material_dialogs_core", + "@maven//:androidx_annotation_annotation", ], ) diff --git a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/java/com/google/mediapipe/examples/posetracking_lindera/ComputerVisionPluginImpl.java b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/java/com/google/mediapipe/examples/posetracking_lindera/ComputerVisionPluginImpl.java index f48c7da8a..88d1e0f45 100644 --- a/mediapipe/examples/android/solutions/posetracking-lindera/src/main/java/com/google/mediapipe/examples/posetracking_lindera/ComputerVisionPluginImpl.java +++ b/mediapipe/examples/android/solutions/posetracking-lindera/src/main/java/com/google/mediapipe/examples/posetracking_lindera/ComputerVisionPluginImpl.java @@ -1,18 +1,118 @@ package com.google.mediapipe.examples.posetracking_lindera; -import android.util.Log; - import com.google.mediapipe.solutions.lindera.BodyJoints; import com.google.mediapipe.solutions.lindera.ComputerVisionPlugin; import com.google.mediapipe.solutions.lindera.XYZPointWithConfidence; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.lang.reflect.Field; +import java.util.LinkedList; +import java.util.Locale; + public class ComputerVisionPluginImpl implements ComputerVisionPlugin { + LinkedList bodyJointsEventList = new LinkedList<>(); + static class BodyJointsEvent{ + BodyJoints bodyJoints; + Long timestamp; + + public BodyJointsEvent(long timestamp, BodyJoints bodyJoints) { + this.bodyJoints = bodyJoints; + this.timestamp = timestamp; + } + } + + + + + boolean isLogging = false; + + public void startLogging(){ + isLogging = true; + bodyJointsEventList = new LinkedList<>(); + } + + public JSONObject stopLoggingAndDumpOutput() throws JSONException, IllegalAccessException { + isLogging = false; + // base json string + String json = "{\n" + + " \"identifier\": \"some_name_here.Capture\",\n" + + " \"metaData\": {\n" + + " \"userIdentifier\": \"unknown user\",\n" + + " \"originatingEquipment\": \"Apperture\",\n" + + " \"activityName\": \"exercise name\",\n" + + " \"activityDescription\": \"\",\n" + + " \"tags\": [\n" + + " \n" + + " ]\n" + + " },\n" + + " \"bodyObjects\": [\n" + + " \n" + + " ]}"; + + JSONObject eLog = new JSONObject(json); + JSONArray bodyJointsArr = new JSONArray(); + for (BodyJointsEvent bodyJointsEvent:bodyJointsEventList){ + JSONObject jBodyJointEvent = new JSONObject(); + jBodyJointEvent.put("ts",bodyJointsEvent.timestamp); + BodyJoints bodyJoints = bodyJointsEvent.bodyJoints; + String bodyJointsString = ""; + // iterate over fields of BodyJoints and put them in json format + for (Field field : BodyJoints.class.getDeclaredFields()) { + Class type = field.getType(); + + if (type == XYZPointWithConfidence.class) { + + String name = field.getName(); + // get abbreviation of name for example leftShoulder -> LS + String abbrev = String.valueOf(name.charAt(0)); + for (int i = 1;i cameras = lindera.getAvailableCameras(); // FRONT or BACK @@ -89,7 +116,9 @@ public class MainActivity extends AppCompatActivity { Button startDetectionButton = findViewById(R.id.button_start_detection); Button toggleLandmarks = findViewById(R.id.button_toggle_landmarks); Button modelComplexity = findViewById(R.id.button_set_model); + Button startCapture = findViewById(R.id.button_start_capture); FrameLayout frameLayout = findViewById(R.id.preview_display_layout); + startDetectionButton.setOnClickListener( v -> { // startCameraButton.setVisibility(View.GONE); @@ -100,6 +129,8 @@ public class MainActivity extends AppCompatActivity { startDetectionButton.setVisibility(View.GONE); findViewById(R.id.button_set_model).setVisibility(View.VISIBLE); findViewById(R.id.button_toggle_landmarks).setVisibility(View.VISIBLE); + findViewById(R.id.button_start_capture).setVisibility(View.VISIBLE); + updateLandmarkButtonText(); updateModelComplexityButtonText(); }); @@ -118,6 +149,54 @@ public class MainActivity extends AppCompatActivity { } ); + startCapture.setOnClickListener(v->{ + + if (isLoggingStarted){ + startCapture.setText("Start Capture"); + isLoggingStarted = false; + try { + JSONObject jsonObject = plugin.stopLoggingAndDumpOutput(); + // save to downloads folder + final ContentValues values = new ContentValues(); + values.put(MediaStore.MediaColumns.DISPLAY_NAME, "data.json"); + values.put(MediaStore.MediaColumns.MIME_TYPE, "application/json"); + values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS); + + final ContentResolver resolver = getContentResolver(); + Uri uri = null; + final Uri contentUri = MediaStore.Downloads.EXTERNAL_CONTENT_URI; + uri = resolver.insert(contentUri, values); + final OutputStream stream = resolver.openOutputStream(uri); + stream.write(jsonObject.toString().getBytes(StandardCharsets.UTF_8)); + stream.close(); + Toast.makeText(getApplicationContext(), "data.json saved to Downloads", Toast.LENGTH_LONG).show(); + + + } catch (JSONException | IllegalAccessException | IOException e) { + e.printStackTrace(); + Toast.makeText(getApplicationContext(), "Failed to save data", Toast.LENGTH_LONG).show(); + + } + } + else { + ProgressBar pbar = new ProgressBar(this); + frameLayout.addView(pbar); + final Handler handler = new Handler(Looper.getMainLooper()); + startCapture.setEnabled(false); + + handler.postDelayed(new Runnable() { + @Override + public void run() { + frameLayout.removeView(pbar); + startCapture.setEnabled(true); + startCapture.setText("Stop Capture"); + plugin.startLogging(); + } + }, 5000); + isLoggingStarted = true; + } + }); + modelComplexity.setOnClickListener(v->{ int modelComplexityVal = lindera.getModelComplexity(); @@ -207,4 +286,5 @@ public class MainActivity extends AppCompatActivity { + } 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 index 1200f79ce..84418b5b3 100644 --- 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 @@ -10,8 +10,7 @@ style="?android:attr/buttonBarStyle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="center" - android:orientation="horizontal"> + android:gravity="center">