Added iOS Objective C hand landmarker tests
This commit is contained in:
		
							parent
							
								
									eff56045e4
								
							
						
					
					
						commit
						baa79046b9
					
				
							
								
								
									
										62
									
								
								mediapipe/tasks/ios/test/vision/hand_landmarker/BUILD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								mediapipe/tasks/ios/test/vision/hand_landmarker/BUILD
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,62 @@
 | 
			
		|||
load("@build_bazel_rules_apple//apple:ios.bzl", "ios_unit_test")
 | 
			
		||||
load(
 | 
			
		||||
    "//mediapipe/framework/tool:ios.bzl",
 | 
			
		||||
    "MPP_TASK_MINIMUM_OS_VERSION",
 | 
			
		||||
)
 | 
			
		||||
load(
 | 
			
		||||
    "@org_tensorflow//tensorflow/lite:special_rules.bzl",
 | 
			
		||||
    "tflite_ios_lab_runner",
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
package(default_visibility = ["//mediapipe/tasks:internal"])
 | 
			
		||||
 | 
			
		||||
licenses(["notice"])
 | 
			
		||||
 | 
			
		||||
# Default tags for filtering iOS targets. Targets are restricted to Apple platforms.
 | 
			
		||||
TFL_DEFAULT_TAGS = [
 | 
			
		||||
    "apple",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
# Following sanitizer tests are not supported by iOS test targets.
 | 
			
		||||
TFL_DISABLED_SANITIZER_TAGS = [
 | 
			
		||||
    "noasan",
 | 
			
		||||
    "nomsan",
 | 
			
		||||
    "notsan",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
objc_library(
 | 
			
		||||
    name = "MPPHandLandmarkerObjcTestLibrary",
 | 
			
		||||
    testonly = 1,
 | 
			
		||||
    srcs = ["MPPHandLandmarkerTests.m"],
 | 
			
		||||
    copts = [
 | 
			
		||||
        "-ObjC++",
 | 
			
		||||
        "-std=c++17",
 | 
			
		||||
        "-x objective-c++",
 | 
			
		||||
    ],
 | 
			
		||||
    data = [
 | 
			
		||||
        "//mediapipe/tasks/testdata/vision:test_models",
 | 
			
		||||
        "//mediapipe/tasks/testdata/vision:test_images",
 | 
			
		||||
        "//mediapipe/tasks/testdata/vision:test_protos",
 | 
			
		||||
    ],
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//mediapipe/tasks/ios/common:MPPCommon",
 | 
			
		||||
        "//mediapipe/tasks/ios/test/vision/hand_landmarker/utils:MPPHandLandmarkerResultProtobufHelpers",
 | 
			
		||||
        "//mediapipe/tasks/ios/test/vision/utils:MPPImageTestUtils",
 | 
			
		||||
        "//mediapipe/tasks/ios/vision/hand_landmarker:MPPHandLandmarker",
 | 
			
		||||
    ] + select({
 | 
			
		||||
        "//third_party:opencv_ios_sim_arm64_source_build": ["@ios_opencv_source//:opencv_xcframework"],
 | 
			
		||||
        "//third_party:opencv_ios_arm64_source_build": ["@ios_opencv_source//:opencv_xcframework"],
 | 
			
		||||
        "//third_party:opencv_ios_x86_64_source_build": ["@ios_opencv_source//:opencv_xcframework"],
 | 
			
		||||
        "//conditions:default": ["@ios_opencv//:OpencvFramework"],
 | 
			
		||||
    }),
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
ios_unit_test(
 | 
			
		||||
    name = "MPPHandLandmarkerObjcTest",
 | 
			
		||||
    minimum_os_version = MPP_TASK_MINIMUM_OS_VERSION,
 | 
			
		||||
    runner = tflite_ios_lab_runner("IOS_LATEST"),
 | 
			
		||||
    tags = TFL_DEFAULT_TAGS + TFL_DISABLED_SANITIZER_TAGS,
 | 
			
		||||
    deps = [
 | 
			
		||||
        ":MPPHandLandmarkerObjcTestLibrary",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,292 @@
 | 
			
		|||
// Copyright 2023 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 <XCTest/XCTest.h>
 | 
			
		||||
 | 
			
		||||
#import "mediapipe/tasks/ios/common/sources/MPPCommon.h"
 | 
			
		||||
#import "mediapipe/tasks/ios/test/vision/hand_landmarker/utils/sources/MPPHandLandmarkerResult+ProtobufHelpers.h"
 | 
			
		||||
#import "mediapipe/tasks/ios/test/vision/utils/sources/MPPImage+TestUtils.h"
 | 
			
		||||
#import "mediapipe/tasks/ios/vision/hand_landmarker/sources/MPPHandLandmarker.h"
 | 
			
		||||
 | 
			
		||||
static NSString *const kPbFileExtension = @"pbtxt";
 | 
			
		||||
 | 
			
		||||
typedef NSDictionary<NSString *, NSString *> ResourceFileInfo;
 | 
			
		||||
 | 
			
		||||
static ResourceFileInfo *const kHandLandmarkerBundleAssetFile =
 | 
			
		||||
    @{@"name" : @"hand_landmarker", @"type" : @"task"};
 | 
			
		||||
 | 
			
		||||
static ResourceFileInfo *const kTwoHandsImage = @{@"name" : @"right_hands", @"type" : @"jpg"};
 | 
			
		||||
static ResourceFileInfo *const kNoHandsImage = @{@"name" : @"cats_and_dogs", @"type" : @"jpg"};
 | 
			
		||||
static ResourceFileInfo *const kThumbUpImage = @{@"name" : @"thumb_up", @"type" : @"jpg"};
 | 
			
		||||
static ResourceFileInfo *const kPointingUpRotatedImage =
 | 
			
		||||
    @{@"name" : @"pointing_up_rotated", @"type" : @"jpg"};
 | 
			
		||||
 | 
			
		||||
static ResourceFileInfo *const kExpectedThumbUpLandmarksFile =
 | 
			
		||||
    @{@"name" : @"thumb_up_landmarks", @"type" : kPbFileExtension};
 | 
			
		||||
static ResourceFileInfo *const kExpectedPointingUpRotatedLandmarksFile =
 | 
			
		||||
    @{@"name" : @"pointing_up_rotated_landmarks", @"type" : kPbFileExtension};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static NSString *const kExpectedErrorDomain = @"com.google.mediapipe.tasks";
 | 
			
		||||
static const float kLandmarksErrorTolerance = 0.03f;
 | 
			
		||||
 | 
			
		||||
#define AssertEqualErrors(error, expectedError)              \
 | 
			
		||||
  XCTAssertNotNil(error);                                    \
 | 
			
		||||
  XCTAssertEqualObjects(error.domain, expectedError.domain); \
 | 
			
		||||
  XCTAssertEqual(error.code, expectedError.code);            \
 | 
			
		||||
  XCTAssertEqualObjects(error.localizedDescription, expectedError.localizedDescription)
 | 
			
		||||
 | 
			
		||||
#define AssertApproximatelyEqualLandmarks(landmark, expectedLandmark, handIndex, landmarkIndex)   \
 | 
			
		||||
  XCTAssertEqualWithAccuracy(landmark.x, expectedLandmark.x, kLandmarksErrorTolerance,            \
 | 
			
		||||
                             @"hand index = %d landmark index j = %d", handIndex, landmarkIndex); \
 | 
			
		||||
  XCTAssertEqualWithAccuracy(landmark.y, expectedLandmark.y, kLandmarksErrorTolerance,            \
 | 
			
		||||
                             @"hand index = %d landmark index j = %d", handIndex, landmarkIndex);
 | 
			
		||||
 | 
			
		||||
#define AssertHandLandmarkerResultIsEmpty(handLandmarkerResult) \
 | 
			
		||||
  XCTAssertTrue(handLandmarkerResult.handedness.count == 0);       \
 | 
			
		||||
  XCTAssertTrue(handLandmarkerResult.landmarks.count == 0);        \
 | 
			
		||||
  XCTAssertTrue(handLandmarkerResult.worldLandmarks.count == 0);
 | 
			
		||||
 | 
			
		||||
@interface MPPHandLandmarkerTests : XCTestCase
 | 
			
		||||
@end
 | 
			
		||||
 | 
			
		||||
@implementation MPPHandLandmarkerTests
 | 
			
		||||
 | 
			
		||||
#pragma mark Results
 | 
			
		||||
 | 
			
		||||
+ (MPPHandLandmarkerResult *)emptyHandLandmarkerResult {
 | 
			
		||||
  return [[MPPHandLandmarkerResult alloc] initWithLandmarks:@[]
 | 
			
		||||
                                                 worldLandmarks:@[]
 | 
			
		||||
                                                   handedness:@[]
 | 
			
		||||
                                  
 | 
			
		||||
                                      timestampInMilliseconds:0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
+ (MPPHandLandmarkerResult *)thumbUpHandLandmarkerResult {
 | 
			
		||||
  NSString *filePath =
 | 
			
		||||
      [MPPHandLandmarkerTests filePathWithFileInfo:kExpectedThumbUpLandmarksFile];
 | 
			
		||||
 | 
			
		||||
  return [MPPHandLandmarkerResult
 | 
			
		||||
      handLandmarkerResultFromTextEncodedProtobufFileWithName:filePath
 | 
			
		||||
                                            shouldRemoveZPosition:YES];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
+ (MPPHandLandmarkerResult *)pointingUpRotatedHandLandmarkerResult {
 | 
			
		||||
  NSString *filePath =
 | 
			
		||||
      [MPPHandLandmarkerTests filePathWithFileInfo:kExpectedPointingUpRotatedLandmarksFile];
 | 
			
		||||
 | 
			
		||||
  return [MPPHandLandmarkerResult
 | 
			
		||||
      handLandmarkerResultFromTextEncodedProtobufFileWithName:filePath
 | 
			
		||||
                                            shouldRemoveZPosition:YES];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
- (void)assertMultiHandLandmarks:(NSArray<NSArray<MPPNormalizedLandmark *> *> *)multiHandLandmarks
 | 
			
		||||
    areApproximatelyEqualToExpectedMultiHandLandmarks:
 | 
			
		||||
        (NSArray<NSArray<MPPNormalizedLandmark *> *> *)expectedMultiHandLandmarks {
 | 
			
		||||
  XCTAssertEqual(multiHandLandmarks.count, expectedMultiHandLandmarks.count);
 | 
			
		||||
  if (multiHandLandmarks.count == 0) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  NSArray<MPPNormalizedLandmark *> *topHandLandmarks = multiHandLandmarks[0];
 | 
			
		||||
  NSArray<MPPNormalizedLandmark *> *expectedTopHandLandmarks = expectedMultiHandLandmarks[0];
 | 
			
		||||
 | 
			
		||||
  XCTAssertEqual(topHandLandmarks.count, expectedTopHandLandmarks.count);
 | 
			
		||||
  for (int i = 0; i < expectedTopHandLandmarks.count; i++) {
 | 
			
		||||
    MPPNormalizedLandmark *landmark = topHandLandmarks[i];
 | 
			
		||||
    XCTAssertNotNil(landmark);
 | 
			
		||||
    AssertApproximatelyEqualLandmarks(landmark, expectedTopHandLandmarks[i], 0, i);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
- (void)assertMultiHandWorldLandmarks:(NSArray<NSArray<MPPLandmark *> *> *)multiHandWorldLandmarks
 | 
			
		||||
    areApproximatelyEqualToExpectedMultiHandWorldLandmarks:
 | 
			
		||||
        (NSArray<NSArray<MPPLandmark *> *> *)expectedMultiHandWorldLandmarks {
 | 
			
		||||
  XCTAssertEqual(multiHandWorldLandmarks.count, expectedMultiHandWorldLandmarks.count);
 | 
			
		||||
  if (expectedMultiHandWorldLandmarks.count == 0) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  NSArray<MPPLandmark *> *topHandWorldLandmarks = multiHandWorldLandmarks[0];
 | 
			
		||||
  NSArray<MPPLandmark *> *expectedTopHandWorldLandmarks = expectedMultiHandWorldLandmarks[0];
 | 
			
		||||
 | 
			
		||||
  XCTAssertEqual(topHandWorldLandmarks.count, expectedTopHandWorldLandmarks.count);
 | 
			
		||||
  for (int i = 0; i < expectedTopHandWorldLandmarks.count; i++) {
 | 
			
		||||
    MPPLandmark *landmark = topHandWorldLandmarks[i];
 | 
			
		||||
    XCTAssertNotNil(landmark);
 | 
			
		||||
    AssertApproximatelyEqualLandmarks(landmark, expectedTopHandWorldLandmarks[i], 0, i);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
- (void)assertHandLandmarkerResult:(MPPHandLandmarkerResult *)handLandmarkerResult
 | 
			
		||||
    isApproximatelyEqualToExpectedResult:
 | 
			
		||||
        (MPPHandLandmarkerResult *)expectedHandLandmarkerResult {
 | 
			
		||||
  [self assertMultiHandLandmarks:handLandmarkerResult.landmarks
 | 
			
		||||
      areApproximatelyEqualToExpectedMultiHandLandmarks:expectedHandLandmarkerResult.landmarks];
 | 
			
		||||
  [self assertMultiHandWorldLandmarks:handLandmarkerResult.worldLandmarks
 | 
			
		||||
      areApproximatelyEqualToExpectedMultiHandWorldLandmarks:expectedHandLandmarkerResult
 | 
			
		||||
                                                                 .worldLandmarks];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#pragma mark File
 | 
			
		||||
 | 
			
		||||
+ (NSString *)filePathWithFileInfo:(ResourceFileInfo *)fileInfo {
 | 
			
		||||
  NSString *filePath = [MPPHandLandmarkerTests filePathWithName:fileInfo[@"name"]
 | 
			
		||||
                                                         extension:fileInfo[@"type"]];
 | 
			
		||||
  return filePath;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
+ (NSString *)filePathWithName:(NSString *)fileName extension:(NSString *)extension {
 | 
			
		||||
  NSString *filePath = [[NSBundle bundleForClass:self.class] pathForResource:fileName
 | 
			
		||||
                                                                      ofType:extension];
 | 
			
		||||
  return filePath;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#pragma mark Gesture Recognizer Initializers
 | 
			
		||||
 | 
			
		||||
- (MPPHandLandmarkerOptions *)handLandmarkerOptionsWithModelFileInfo:
 | 
			
		||||
    (ResourceFileInfo *)modelFileInfo {
 | 
			
		||||
  NSString *modelPath = [MPPHandLandmarkerTests filePathWithFileInfo:modelFileInfo];
 | 
			
		||||
  MPPHandLandmarkerOptions *handLandmarkerOptions =
 | 
			
		||||
      [[MPPHandLandmarkerOptions alloc] init];
 | 
			
		||||
  handLandmarkerOptions.baseOptions.modelAssetPath = modelPath;
 | 
			
		||||
 | 
			
		||||
  return handLandmarkerOptions;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
- (MPPHandLandmarker *)createHandLandmarkerWithOptionsSucceeds:
 | 
			
		||||
    (MPPHandLandmarkerOptions *)handLandmarkerOptions {
 | 
			
		||||
  MPPHandLandmarker *handLandmarker =
 | 
			
		||||
      [[MPPHandLandmarker alloc] initWithOptions:handLandmarkerOptions error:nil];
 | 
			
		||||
  XCTAssertNotNil(handLandmarker);
 | 
			
		||||
 | 
			
		||||
  return handLandmarker;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
- (void)assertCreateHandLandmarkerWithOptions:
 | 
			
		||||
            (MPPHandLandmarkerOptions *)handLandmarkerOptions
 | 
			
		||||
                          failsWithExpectedError:(NSError *)expectedError {
 | 
			
		||||
  NSError *error = nil;
 | 
			
		||||
  MPPHandLandmarker *handLandmarker =
 | 
			
		||||
      [[MPPHandLandmarker alloc] initWithOptions:handLandmarkerOptions error:&error];
 | 
			
		||||
 | 
			
		||||
  XCTAssertNil(handLandmarkerOptions);
 | 
			
		||||
  AssertEqualErrors(error, expectedError);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#pragma mark Assert Gesture Recognizer Results
 | 
			
		||||
 | 
			
		||||
- (MPPImage *)imageWithFileInfo:(ResourceFileInfo *)fileInfo {
 | 
			
		||||
  MPPImage *image = [MPPImage imageFromBundleWithClass:[MPPHandLandmarkerTests class]
 | 
			
		||||
                                              fileName:fileInfo[@"name"]
 | 
			
		||||
                                                ofType:fileInfo[@"type"]];
 | 
			
		||||
  XCTAssertNotNil(image);
 | 
			
		||||
 | 
			
		||||
  return image;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
- (MPPImage *)imageWithFileInfo:(ResourceFileInfo *)fileInfo
 | 
			
		||||
                    orientation:(UIImageOrientation)orientation {
 | 
			
		||||
  MPPImage *image = [MPPImage imageFromBundleWithClass:[MPPHandLandmarkerTests class]
 | 
			
		||||
                                              fileName:fileInfo[@"name"]
 | 
			
		||||
                                                ofType:fileInfo[@"type"]
 | 
			
		||||
                                           orientation:orientation];
 | 
			
		||||
  XCTAssertNotNil(image);
 | 
			
		||||
 | 
			
		||||
  return image;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
- (MPPHandLandmarkerResult *)detectInImageWithFileInfo:(ResourceFileInfo *)imageFileInfo
 | 
			
		||||
                                    usingHandLandmarker:
 | 
			
		||||
                                        (MPPHandLandmarker *)handLandmarker {
 | 
			
		||||
  MPPImage *mppImage = [self imageWithFileInfo:imageFileInfo];
 | 
			
		||||
  MPPHandLandmarkerResult *handLandmarkerResult = [handLandmarker detectInImage:mppImage
 | 
			
		||||
                                                                                    error:nil];
 | 
			
		||||
  XCTAssertNotNil(handLandmarkerResult);
 | 
			
		||||
 | 
			
		||||
  return handLandmarkerResult;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
- (void)assertResultsOfDetectInImageWithFileInfo:(ResourceFileInfo *)fileInfo
 | 
			
		||||
                           usingHandLandmarker:(MPPHandLandmarker *)handLandmarker
 | 
			
		||||
       approximatelyEqualsHandLandmarkerResult:
 | 
			
		||||
           (MPPHandLandmarkerResult *)expectedHandLandmarkerResult {
 | 
			
		||||
  MPPHandLandmarkerResult *handLandmarkerResult =
 | 
			
		||||
      [self detectInImageWithFileInfo:fileInfo usingHandLandmarker:handLandmarker];
 | 
			
		||||
  [self assertHandLandmarkerResult:handLandmarkerResult
 | 
			
		||||
      isApproximatelyEqualToExpectedResult:expectedHandLandmarkerResult];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#pragma mark General Tests
 | 
			
		||||
 | 
			
		||||
- (void)testDetectWithModelPathSucceeds {
 | 
			
		||||
  NSString *modelPath =
 | 
			
		||||
      [MPPHandLandmarkerTests filePathWithFileInfo:kHandLandmarkerBundleAssetFile];
 | 
			
		||||
  MPPHandLandmarker *handLandmarker =
 | 
			
		||||
      [[MPPHandLandmarker alloc] initWithModelPath:modelPath error:nil];
 | 
			
		||||
  XCTAssertNotNil(handLandmarker);
 | 
			
		||||
 | 
			
		||||
  [self assertResultsOfDetectInImageWithFileInfo:kThumbUpImage
 | 
			
		||||
                           usingHandLandmarker:handLandmarker
 | 
			
		||||
       approximatelyEqualsHandLandmarkerResult:[MPPHandLandmarkerTests
 | 
			
		||||
                                                      thumbUpHandLandmarkerResult]];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
- (void)testDetectWithEmptyResultsSucceeds {
 | 
			
		||||
  MPPHandLandmarkerOptions *handLandmarkerOptions =
 | 
			
		||||
      [self handLandmarkerOptionsWithModelFileInfo:kHandLandmarkerBundleAssetFile];
 | 
			
		||||
 | 
			
		||||
  MPPHandLandmarker *handLandmarker =
 | 
			
		||||
      [self createHandLandmarkerWithOptionsSucceeds:handLandmarkerOptions];
 | 
			
		||||
 | 
			
		||||
  MPPHandLandmarkerResult *handLandmarkerResult =
 | 
			
		||||
      [self detectInImageWithFileInfo:kNoHandsImage usingHandLandmarker:handLandmarker];
 | 
			
		||||
  AssertHandLandmarkerResultIsEmpty(handLandmarkerResult);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
- (void)testDetectWithNumHandsSucceeds {
 | 
			
		||||
  MPPHandLandmarkerOptions *handLandmarkerOptions =
 | 
			
		||||
      [self handLandmarkerOptionsWithModelFileInfo:kHandLandmarkerBundleAssetFile];
 | 
			
		||||
 | 
			
		||||
  const NSInteger numHands = 2;
 | 
			
		||||
  handLandmarkerOptions.numHands = numHands;
 | 
			
		||||
 | 
			
		||||
  MPPHandLandmarker *handLandmarker =
 | 
			
		||||
      [self createHandLandmarkerWithOptionsSucceeds:handLandmarkerOptions];
 | 
			
		||||
 | 
			
		||||
  MPPHandLandmarkerResult *handLandmarkerResult =
 | 
			
		||||
      [self detectInImageWithFileInfo:kTwoHandsImage usingHandLandmarker:handLandmarker];
 | 
			
		||||
 | 
			
		||||
  XCTAssertTrue(handLandmarkerResult.handedness.count == numHands);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
- (void)testDetectWithRotationSucceeds {
 | 
			
		||||
  MPPHandLandmarkerOptions *handLandmarkerOptions =
 | 
			
		||||
      [self handLandmarkerOptionsWithModelFileInfo:kHandLandmarkerBundleAssetFile];
 | 
			
		||||
 | 
			
		||||
  MPPHandLandmarker *handLandmarker =
 | 
			
		||||
      [self createHandLandmarkerWithOptionsSucceeds:handLandmarkerOptions];
 | 
			
		||||
 | 
			
		||||
  MPPImage *mppImage = [self imageWithFileInfo:kPointingUpRotatedImage
 | 
			
		||||
                                   orientation:UIImageOrientationRight];
 | 
			
		||||
 | 
			
		||||
  MPPHandLandmarkerResult *handLandmarkerResult = [handLandmarker detectInImage:mppImage
 | 
			
		||||
                                                                          error:nil];
 | 
			
		||||
 | 
			
		||||
  [self assertHandLandmarkerResult:handLandmarkerResult
 | 
			
		||||
      isApproximatelyEqualToExpectedResult:[MPPHandLandmarkerTests pointingUpRotatedHandLandmarkerResult]];                                                                        
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@end
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user