Updated iOS gesture recognizer results to initialize hand gestures with a default index

This commit is contained in:
Prianka Liz Kariat 2023-05-25 20:42:24 +05:30
parent 3ac903787a
commit 9483ac4651
4 changed files with 52 additions and 14 deletions

View File

@ -19,8 +19,30 @@ NS_ASSUME_NONNULL_BEGIN
@interface MPPCategory (Helpers) @interface MPPCategory (Helpers)
/**
* Creates an `MPPCategory` with the given MediaPipe `Classification` proto.
*
* @param classificationProto A MediaPipe `Classification` proto.
* @return An `MPPCategory` object that with the given MediaPipe `Classification` proto.
*/
+ (MPPCategory *)categoryWithProto:(const ::mediapipe::Classification &)classificationProto; + (MPPCategory *)categoryWithProto:(const ::mediapipe::Classification &)classificationProto;
/**
* Creates an `MPPCategory` with the given MediaPipe `Classification` proto and the given category
* index. The resulting `MPPCategory` is created with the given category index instead of the
* category index specified in the `Classification` proto. This method is useful for tasks like
* gesture recognizer which always returns a default index for the recognized gestures.
*
* @param classificationProto A MediaPipe `Classification` proto.
* @param index The index to be used for creating the `MPPCategory` instead of the category index
* specified in the `Classification` proto.
*
* @return An `MPPGestureRecognizerResult` object that contains the hand gesture recognition
* results.
*/
+ (MPPCategory *)categoryWithProto:(const ::mediapipe::Classification &)classificationProto
index:(NSInteger)index;
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

View File

@ -21,7 +21,8 @@ using ClassificationProto = ::mediapipe::Classification;
@implementation MPPCategory (Helpers) @implementation MPPCategory (Helpers)
+ (MPPCategory *)categoryWithProto:(const ClassificationProto &)classificationProto { + (MPPCategory *)categoryWithProto:(const ClassificationProto &)classificationProto
index:(NSInteger)index {
NSString *categoryName; NSString *categoryName;
NSString *displayName; NSString *displayName;
@ -33,10 +34,14 @@ using ClassificationProto = ::mediapipe::Classification;
displayName = [NSString stringWithCppString:classificationProto.display_name()]; displayName = [NSString stringWithCppString:classificationProto.display_name()];
} }
return [[MPPCategory alloc] initWithIndex:classificationProto.index() return [[MPPCategory alloc] initWithIndex:index
score:classificationProto.score() score:classificationProto.score()
categoryName:categoryName categoryName:categoryName
displayName:displayName]; displayName:displayName];
} }
+ (MPPCategory *)categoryWithProto:(const ClassificationProto &)classificationProto {
return [MPPCategory categoryWithProto:classificationProto index:classificationProto.index()];
}
@end @end

View File

@ -14,6 +14,8 @@
#import "mediapipe/tasks/ios/vision/gesture_recognizer/sources/MPPGestureRecognizerResult.h" #import "mediapipe/tasks/ios/vision/gesture_recognizer/sources/MPPGestureRecognizerResult.h"
#include "mediapipe/framework/formats/classification.pb.h"
#include "mediapipe/framework/formats/landmark.pb.h"
#include "mediapipe/framework/packet.h" #include "mediapipe/framework/packet.h"
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@ -26,11 +28,11 @@ static const int kMicroSecondsPerMilliSecond = 1000;
* Creates an `MPPGestureRecognizerResult` from hand gestures, handedness, hand landmarks and world * Creates an `MPPGestureRecognizerResult` from hand gestures, handedness, hand landmarks and world
* landmarks packets. * landmarks packets.
* *
* @param handGesturesPacket a MediaPipe packet wrapping a`std::vector<ClassificationListProto>`. * @param handGesturesPacket A MediaPipe packet wrapping a`std::vector<ClassificationListProto>`.
* @param handednessPacket a MediaPipe packet wrapping a`std::vector<ClassificationListProto>`. * @param handednessPacket A MediaPipe packet wrapping a`std::vector<ClassificationListProto>`.
* @param handLandmarksPacket a MediaPipe packet wrapping * @param handLandmarksPacket A MediaPipe packet wrapping
* a`std::vector<NormalizedlandmarkListProto>`. * a`std::vector<NormalizedlandmarkListProto>`.
* @param handLandmarksPacket a MediaPipe packet wrapping a`std::vector<LandmarkListProto>`. * @param worldLandmarksPacket A MediaPipe packet wrapping a`std::vector<LandmarkListProto>`.
* *
* @return An `MPPGestureRecognizerResult` object that contains the hand gesture recognition * @return An `MPPGestureRecognizerResult` object that contains the hand gesture recognition
* results. * results.

View File

@ -21,6 +21,8 @@
#include "mediapipe/framework/formats/landmark.pb.h" #include "mediapipe/framework/formats/landmark.pb.h"
#include "mediapipe/framework/packet.h" #include "mediapipe/framework/packet.h"
static const NSInteger kDefaultGestureIndex = -1;
namespace { namespace {
using ClassificationListProto = ::mediapipe::ClassificationList; using ClassificationListProto = ::mediapipe::ClassificationList;
using LandmarkListProto = ::mediapipe::LandmarkList; using LandmarkListProto = ::mediapipe::LandmarkList;
@ -30,6 +32,15 @@ using ::mediapipe::Packet;
@implementation MPPGestureRecognizerResult (Helpers) @implementation MPPGestureRecognizerResult (Helpers)
+ (MPPGestureRecognizerResult *)emptyGestureRecognizerResultWithTimestampInMilliseconds:
(NSInteger)timestampInMilliseconds {
return [[MPPGestureRecognizerResult alloc] initWithGestures:@[]
handedness:@[]
landmarks:@[]
worldLandmarks:@[]
timestampInMilliseconds:timestampInMilliseconds];
}
+ (MPPGestureRecognizerResult *) + (MPPGestureRecognizerResult *)
gestureRecognizerResultWithHandGesturesPacket:(const Packet &)handGesturesPacket gestureRecognizerResultWithHandGesturesPacket:(const Packet &)handGesturesPacket
handednessPacket:(const Packet &)handednessPacket handednessPacket:(const Packet &)handednessPacket
@ -39,18 +50,16 @@ using ::mediapipe::Packet;
(NSInteger)(handGesturesPacket.Timestamp().Value() / kMicroSecondsPerMilliSecond); (NSInteger)(handGesturesPacket.Timestamp().Value() / kMicroSecondsPerMilliSecond);
if (handGesturesPacket.IsEmpty()) { if (handGesturesPacket.IsEmpty()) {
return [[MPPGestureRecognizerResult alloc] initWithGestures:@[] return [MPPGestureRecognizerResult
handedness:@[] emptyGestureRecognizerResultWithTimestampInMilliseconds:timestampInMilliseconds];
landmarks:@[]
worldLandmarks:@[]
timestampInMilliseconds:timestampInMilliseconds];
} }
if (!handGesturesPacket.ValidateAsType<std::vector<ClassificationListProto>>().ok() || if (!handGesturesPacket.ValidateAsType<std::vector<ClassificationListProto>>().ok() ||
!handednessPacket.ValidateAsType<std::vector<ClassificationListProto>>().ok() || !handednessPacket.ValidateAsType<std::vector<ClassificationListProto>>().ok() ||
!handLandmarksPacket.ValidateAsType<std::vector<NormalizedLandmarkListProto>>().ok() || !handLandmarksPacket.ValidateAsType<std::vector<NormalizedLandmarkListProto>>().ok() ||
!worldLandmarksPacket.ValidateAsType<std::vector<LandmarkListProto>>().ok()) { !worldLandmarksPacket.ValidateAsType<std::vector<LandmarkListProto>>().ok()) {
return nil; return [MPPGestureRecognizerResult
emptyGestureRecognizerResultWithTimestampInMilliseconds:timestampInMilliseconds];
} }
const std::vector<ClassificationListProto> &handGesturesClassificationListProtos = const std::vector<ClassificationListProto> &handGesturesClassificationListProtos =
@ -62,7 +71,7 @@ using ::mediapipe::Packet;
NSMutableArray<MPPCategory *> *gestures = [NSMutableArray NSMutableArray<MPPCategory *> *gestures = [NSMutableArray
arrayWithCapacity:(NSUInteger)classificationListProto.classification().size()]; arrayWithCapacity:(NSUInteger)classificationListProto.classification().size()];
for (const auto &classificationProto : classificationListProto.classification()) { for (const auto &classificationProto : classificationListProto.classification()) {
MPPCategory *category = [MPPCategory categoryWithProto:classificationProto]; MPPCategory *category = [MPPCategory categoryWithProto:classificationProto index:kDefaultGestureIndex];
[gestures addObject:category]; [gestures addObject:category];
} }
[multiHandGestures addObject:gestures]; [multiHandGestures addObject:gestures];