diff --git a/mediapipe/examples/ios/posetrackingsolutiongpu/BUILD b/mediapipe/examples/ios/posetrackingsolutiongpu/BUILD new file mode 100644 index 000000000..bb33bf9a5 --- /dev/null +++ b/mediapipe/examples/ios/posetrackingsolutiongpu/BUILD @@ -0,0 +1,79 @@ +# Copyright 2020 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. + +load( + "@build_bazel_rules_apple//apple:ios.bzl", + "ios_application", +) +load( + "//mediapipe/examples/ios:bundle_id.bzl", + "BUNDLE_ID_PREFIX", + "example_provisioning", +) + +licenses(["notice"]) + +MIN_IOS_VERSION = "11.0" + +alias( + name = "posetrackingsolutiongpu", + actual = "PoseTrackingSolutionGpuApp", +) + +ios_application( + name = "PoseTrackingSolutionGpuApp", + app_icons = ["//mediapipe/examples/ios/common:AppIcon"], + bundle_id = BUNDLE_ID_PREFIX + ".PoseTrackingGpu", + families = [ + "iphone", + "ipad", + ], + infoplists = [ + "//mediapipe/examples/ios/common:Info.plist", + "Info.plist", + ], + minimum_os_version = MIN_IOS_VERSION, + provisioning_profile = example_provisioning(), + deps = [ + ":PoseTrackingGpuAppLibrary", + "@ios_opencv//:OpencvFramework", + ], +) + +objc_library( + name = "PoseTrackingGpuAppLibrary", + srcs = [ + "PoseTrackingViewController.mm", + ], + hdrs = [ + "PoseTrackingViewController.h", + ], + copts = ["-std=c++17"], + data = [ + "//mediapipe/graphs/pose_tracking:pose_tracking_gpu.binarypb", + "//mediapipe/modules/pose_detection:pose_detection.tflite", + "//mediapipe/modules/pose_landmark:pose_landmark_full.tflite", + ], + deps = [ + "//mediapipe/examples/ios/common:CommonMediaPipeAppLibrary", + "//mediapipe/objc/solutions/posetracking_gpu:posetracking_gpu_solution", + ] + select({ + "//mediapipe:ios_i386": [], + "//mediapipe:ios_x86_64": [], + "//conditions:default": [ + "//mediapipe/graphs/pose_tracking:pose_tracking_gpu_deps", + "//mediapipe/framework/formats:landmark_cc_proto", + ], + }), +) diff --git a/mediapipe/examples/ios/posetrackingsolutiongpu/Info.plist b/mediapipe/examples/ios/posetrackingsolutiongpu/Info.plist new file mode 100644 index 000000000..71e2e429e --- /dev/null +++ b/mediapipe/examples/ios/posetrackingsolutiongpu/Info.plist @@ -0,0 +1,16 @@ + + + + + CameraPosition + back + MainViewController + PoseTrackingViewController + GraphOutputStream + output_video + GraphInputStream + input_video + GraphName + pose_tracking_gpu + + diff --git a/mediapipe/examples/ios/posetrackingsolutiongpu/PoseTrackingViewController.h b/mediapipe/examples/ios/posetrackingsolutiongpu/PoseTrackingViewController.h new file mode 100644 index 000000000..f5dc4674a --- /dev/null +++ b/mediapipe/examples/ios/posetrackingsolutiongpu/PoseTrackingViewController.h @@ -0,0 +1,21 @@ +// Copyright 2020 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. + +#import + +#import "mediapipe/examples/ios/common/CommonViewController.h" + +@interface PoseTrackingViewController : CommonViewController + +@end diff --git a/mediapipe/examples/ios/posetrackingsolutiongpu/PoseTrackingViewController.mm b/mediapipe/examples/ios/posetrackingsolutiongpu/PoseTrackingViewController.mm new file mode 100644 index 000000000..0f082031c --- /dev/null +++ b/mediapipe/examples/ios/posetrackingsolutiongpu/PoseTrackingViewController.mm @@ -0,0 +1,53 @@ +// Copyright 2020 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. + +#import "PoseTrackingViewController.h" + +#include "mediapipe/framework/formats/landmark.pb.h" + +static const char* kLandmarksOutputStream = "pose_landmarks"; + +@implementation PoseTrackingViewController + +#pragma mark - UIViewController methods + +- (void)viewDidLoad { + [super viewDidLoad]; + + [self.mediapipeGraph addFrameOutputStream:kLandmarksOutputStream + outputPacketType:MPPPacketTypeRaw]; +} + +#pragma mark - MPPGraphDelegate methods + +// Receives a raw packet from the MediaPipe graph. Invoked on a MediaPipe worker thread. +- (void)mediapipeGraph:(MPPGraph*)graph + didOutputPacket:(const ::mediapipe::Packet&)packet + fromStream:(const std::string&)streamName { + if (streamName == kLandmarksOutputStream) { + if (packet.IsEmpty()) { + NSLog(@"[TS:%lld] No pose landmarks", packet.Timestamp().Value()); + return; + } + const auto& landmarks = packet.Get<::mediapipe::NormalizedLandmarkList>(); + NSLog(@"[TS:%lld] Number of pose landmarks: %d", packet.Timestamp().Value(), + landmarks.landmark_size()); + for (int i = 0; i < landmarks.landmark_size(); ++i) { + NSLog(@"\tLandmark[%d]: (%f, %f, %f)", i, landmarks.landmark(i).x(), + landmarks.landmark(i).y(), landmarks.landmark(i).z()); + } + } +} + +@end