يمكنك استخدام ML Kit للتعرف على المعالم المعروفة في الصورة.
قبل ان تبدأ
- إذا لم تكن قد أضفت Firebase إلى تطبيقك بالفعل، فقم بذلك باتباع الخطوات الواردة في دليل البدء .
- قم بتضمين مكتبات ML Kit في ملف Podfile الخاص بك:
pod 'Firebase/MLVision', '6.25.0'
بعد تثبيت أو تحديث Pods لمشروعك، تأكد من فتح مشروع Xcode الخاص بك باستخدام.xcworkspace
. - في تطبيقك، قم باستيراد Firebase:
سويفت
import Firebase
ج موضوعية
@import Firebase;
إذا لم تكن قد قمت بالفعل بتمكين واجهات برمجة التطبيقات المستندة إلى السحابة لمشروعك، فقم بذلك الآن:
- افتح صفحة ML Kit APIs لوحدة تحكم Firebase.
إذا لم تكن قد قمت بالفعل بترقية مشروعك إلى خطة تسعير Blaze، فانقر فوق ترقية للقيام بذلك. (سيُطلب منك الترقية فقط إذا لم يكن مشروعك مدرجًا في خطة Blaze.)
يمكن فقط للمشاريع على مستوى Blaze استخدام واجهات برمجة التطبيقات المستندة إلى السحابة.
- إذا لم تكن واجهات برمجة التطبيقات المستندة إلى السحابة ممكّنة بالفعل، فانقر على تمكين واجهات برمجة التطبيقات المستندة إلى السحابة .
تكوين كاشف المعالم
افتراضيًا، يستخدم كاشف السحابة الإصدار الثابت من النموذج ويقوم بإرجاع ما يصل إلى 10 نتائج. إذا كنت تريد تغيير أي من هذه الإعدادات، فحددها باستخدام كائن VisionCloudDetectorOptions
كما في المثال التالي:
سويفت
let options = VisionCloudDetectorOptions() options.modelType = .latest options.maxResults = 20
ج موضوعية
FIRVisionCloudDetectorOptions *options = [[FIRVisionCloudDetectorOptions alloc] init]; options.modelType = FIRVisionCloudModelTypeLatest; options.maxResults = 20;
في الخطوة التالية، قم بتمرير كائن VisionCloudDetectorOptions
عند إنشاء كائن Cloud Detector.
قم بتشغيل كاشف المعالم
للتعرف على المعالم في صورة ما، قم بتمرير الصورة كـUIImage
أو CMSampleBufferRef
إلى طريقة detect(in:)
VisionCloudLandmarkDetector
:- احصل على مثيل
VisionCloudLandmarkDetector
:سويفت
lazy var vision = Vision.vision() let cloudDetector = vision.cloudLandmarkDetector(options: options) // Or, to use the default settings: // let cloudDetector = vision.cloudLandmarkDetector()
ج موضوعية
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
.سويفت
let image = VisionImage(image: uiImage)
ج موضوعية
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
لاستخدام
CMSampleBufferRef
:قم بإنشاء كائن
VisionImageMetadata
الذي يحدد اتجاه بيانات الصورة الموجودة في المخزن المؤقتCMSampleBufferRef
.للحصول على اتجاه الصورة:
سويفت
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 } }
ج موضوعية
- (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; } }
ثم قم بإنشاء كائن بيانات التعريف:
سويفت
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
ج موضوعية
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
وبيانات تعريف التدوير:سويفت
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
ج موضوعية
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- إذا لزم الأمر، قم بتدوير الصورة بحيث تكون خاصية
- ثم قم بتمرير الصورة إلى طريقة
detect(in:)
:سويفت
cloudDetector.detect(in: visionImage) { landmarks, error in guard error == nil, let landmarks = landmarks, !landmarks.isEmpty else { // ... return } // Recognized landmarks // ... }
ج موضوعية
[landmarkDetector detectInImage:image completion:^(NSArray<FIRVisionCloudLandmark *> *landmarks, NSError *error) { if (error != nil) { return; } else if (landmarks != nil) { // Got landmarks } }];
الحصول على معلومات حول المعالم المعترف بها
إذا نجح التعرف على المعالم، فسيتم تمرير مصفوفة من كائناتVisionCloudLandmark
إلى معالج الإكمال. من كل كائن، يمكنك الحصول على معلومات حول معلم معروف في الصورة.على سبيل المثال:
سويفت
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 }
ج موضوعية
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 .