Google 致力于为黑人社区推动种族平等。查看具体举措

التعرف على المعالم باستخدام ML Kit على iOS

يمكنك استخدام ML Kit للتعرف على المعالم المعروفة في الصورة.

قبل ان تبدأ

  1. إذا لم تكن قد أضفت Firebase بالفعل إلى تطبيقك ، فقم بذلك باتباع الخطوات الواردة في دليل البدء .
  2. تشمل المكتبات ML كيت في Podfile الخاص بك:
    pod 'Firebase/MLVision', '6.25.0'
    
    بعد تثبيت أو تحديث حاضن المشروع الخاص بك، ومن المؤكد أن فتح مشروع Xcode باستخدام لها .xcworkspace .
  3. في تطبيقك ، استورد Firebase:

    سويفت

    import Firebase

    ج موضوعية

    @import Firebase;
  4. إذا لم تكن قد قمت بالفعل بتمكين واجهات برمجة التطبيقات المستندة إلى السحابة لمشروعك ، فقم بذلك الآن:

    1. افتح صفحة ML Kit APIs بوحدة تحكم Firebase.
    2. إذا لم تكن قد قمت بالفعل بترقية مشروعك إلى خطة تسعير Blaze ، فانقر فوق ترقية للقيام بذلك. (ستتم مطالبتك بالترقية فقط إذا لم يكن مشروعك مدرجًا في خطة Blaze.)

      يمكن فقط للمشاريع على مستوى Blaze استخدام واجهات برمجة التطبيقات المستندة إلى السحابة.

    3. إذا لم تكن واجهات برمجة التطبيقات المستندة إلى السحابة ممكّنة بالفعل ، فانقر فوق تمكين واجهات برمجة التطبيقات المستندة إلى السحابة .

تكوين مكتشف المعالم

بشكل افتراضي ، يستخدم كاشف السحابة الإصدار الثابت من النموذج ويعيد ما يصل إلى 10 نتائج. إذا كنت تريد تغيير أي من هذه الإعدادات ، VisionCloudDetectorOptions كائن 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 إلى طريقة VisionCloudLandmarkDetector detect(in:) :

  1. احصل على مثيل من 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];
    
  2. قم VisionImage كائن VisionImage باستخدام UIImage أو CMSampleBufferRef .

    لاستخدام صورة UIImage :

    1. إذا لزم الأمر ، قم بتدوير الصورة بحيث تكون imageOrientation هي .up .
    2. قم VisionImage كائن VisionImage باستخدام UIImage تدويره بشكل صحيح. لا تحدد أي بيانات وصفية للتناوب - يجب استخدام القيمة الافتراضية ، .topLeft .

      سويفت

      let image = VisionImage(image: uiImage)

      ج موضوعية

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

    لاستخدام CMSampleBufferRef :

    1. قم VisionImageMetadata كائن VisionImageMetadata يحدد اتجاه بيانات الصورة الموجودة في المخزن المؤقت CMSampleBufferRef .

      للحصول على اتجاه الصورة:

      سويفت

      076 سيف 780

      ج موضوعية

      - (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];
    2. قم VisionImage كائن VisionImage باستخدام كائن CMSampleBufferRef وبيانات تعريف الدوران:

      سويفت

      let image = VisionImage(buffer: sampleBuffer)
      image.metadata = metadata

      ج موضوعية

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. بعد ذلك ، قم بتمرير الصورة إلى طريقة 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 إلى معالج الإكمال. من كل كائن ، يمكنك الحصول على معلومات حول معلم معروف في الصورة.

على سبيل المثال:

سويفت

0 درهم 38000

ج موضوعية

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];
}

الخطوات التالية