אפשר להשתמש ב-ML Kit כדי לזהות ציוני דרך מפורסמים בתמונה.
לפני שמתחילים
- אם עדיין לא הוספתם את Firebase לאפליקציה, צריך לבצע את הפעולות הבאות במדריך לתחילת העבודה.
- מוסיפים את ספריות ML Kit ל-Podfile:
אחרי שמתקינים או מעדכנים את קבוצות ה-Pod של הפרויקט, חשוב לפתוח את ה-Xcode באמצעות ה-pod 'Firebase/MLVision', '6.25.0'
.xcworkspace
שלו. - מייבאים את Firebase לאפליקציה:
Swift
import Firebase
Objective-C
@import Firebase;
-
אם עדיין לא הפעלתם ממשקי API מבוססי-Cloud בפרויקט, עליכם לעשות זאת עכשיו:
- פתיחת ML Kit דף ממשקי ה-API במסוף Firebase.
-
אם עדיין לא שדרגתם את הפרויקט לתוכנית תמחור ותשלומים של Blaze, לוחצים על כדי לעשות זאת, אפשר לשדרג. (תתבקש לשדרג רק אם הוא לא בתוכנית Blaze.)
רק בפרויקטים ברמת Blaze אפשר להשתמש בממשקי API מבוססי-Cloud.
- אם ממשקי API מבוססי-ענן עדיין לא מופעלים, לוחצים על הפעלת ממשקי API מבוססי-ענן. ממשקי API.
הגדרת המזהה של ציון הדרך
כברירת מחדל, מזהה הענן משתמש בגרסה היציבה של המודל,
מחזירה עד 10 תוצאות. אם רוצים לשנות אחת מההגדרות האלה,
לציין אותם באמצעות אובייקט VisionCloudDetectorOptions
בתור
בדוגמה הבאה:
Swift
let options = VisionCloudDetectorOptions() options.modelType = .latest options.maxResults = 20
Objective-C
FIRVisionCloudDetectorOptions *options = [[FIRVisionCloudDetectorOptions alloc] init]; options.modelType = FIRVisionCloudModelTypeLatest; options.maxResults = 20;
בשלב הבא, מעבירים את VisionCloudDetectorOptions
כשיוצרים את האובייקט CloudDetector.
הפעלת המזהה של ציון הדרך
כדי לזהות ציוני דרך בתמונה, יש להעביר את התמונה כ-UIImage
או כ-
CMSampleBufferRef
ל-detect(in:)
של VisionCloudLandmarkDetector
method:
- אחזור מופע של
VisionCloudLandmarkDetector
:Swift
lazy var vision = Vision.vision() let cloudDetector = vision.cloudLandmarkDetector(options: options) // Or, to use the default settings: // let cloudDetector = vision.cloudLandmarkDetector()
Objective-C
FIRVision *vision = [FIRVision vision]; FIRVisionCloudLandmarkDetector *landmarkDetector = [vision cloudLandmarkDetector]; // Or, to change the default settings: // FIRVisionCloudLandmarkDetector *landmarkDetector = // [vision cloudLandmarkDetectorWithOptions:options];
-
יצירת אובייקט
VisionImage
באמצעותUIImage
אוCMSampleBufferRef
כדי להשתמש ב-
UIImage
:- אם צריך, מסובבים את התמונה כך שהנכס
imageOrientation
יהיה.up
. - יצירת אובייקט
VisionImage
באמצעות סיבוב נכוןUIImage
. אין לציין מטא-נתונים של סיבוב – צריך להשתמש בערך ברירת המחדל,.topLeft
.Swift
let image = VisionImage(image: uiImage)
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
כדי להשתמש ב-
CMSampleBufferRef
:-
יוצרים אובייקט
VisionImageMetadata
שמציין את של נתוני התמונה שכלולים מאגר נתונים זמני שלCMSampleBufferRef
.כדי לקבל את הכיוון של התמונה:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
Objective-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
לאחר מכן, יוצרים את אובייקט המטא-נתונים:
Swift
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Objective-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
- יוצרים אובייקט
VisionImage
באמצעות האובייקטCMSampleBufferRef
והמטא-נתונים של הסיבוב:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- אם צריך, מסובבים את התמונה כך שהנכס
-
לאחר מכן, מעבירים את התמונה לשיטה
detect(in:)
:Swift
cloudDetector.detect(in: visionImage) { landmarks, error in guard error == nil, let landmarks = landmarks, !landmarks.isEmpty else { // ... return } // Recognized landmarks // ... }
Objective-C
[landmarkDetector detectInImage:image completion:^(NSArray<FIRVisionCloudLandmark *> *landmarks, NSError *error) { if (error != nil) { return; } else if (landmarks != nil) { // Got landmarks } }];
קבלת מידע על ציוני הדרך שזוהו
אם זיהוי ציון דרך יצליח, מערך שלVisionCloudLandmark
אובייקטים יועברו ל-handler של ההשלמה. מכל אובייקט אפשר לקבל מידע על ציון דרך שזוהה בתמונה.
לדוגמה:
Swift
for landmark in landmarks { let landmarkDesc = landmark.landmark let boundingPoly = landmark.frame let entityId = landmark.entityId // A landmark can have multiple locations: for example, the location the image // was taken, and the location of the landmark depicted. for location in landmark.locations { let latitude = location.latitude let longitude = location.longitude } let confidence = landmark.confidence }
Objective-C
for (FIRVisionCloudLandmark *landmark in landmarks) { NSString *landmarkDesc = landmark.landmark; CGRect frame = landmark.frame; NSString *entityId = landmark.entityId; // A landmark can have multiple locations: for example, the location the image // was taken, and the location of the landmark depicted. for (FIRVisionLatitudeLongitude *location in landmark.locations) { double latitude = [location.latitude doubleValue]; double longitude = [location.longitude doubleValue]; } float confidence = [landmark.confidence floatValue]; }
השלבים הבאים
- לפני שתפרסו לאוויר אפליקציה שמשתמשת ב-Cloud API, כדאי לבצע כמה פעולות נוספות כדי למנוע גישה לא מורשית ל-API ולצמצם את ההשפעה שלה.