ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

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

{٪ setvar ml_link٪} أحدث إصدار {٪ endsetvar٪}

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

قبل ان تبدأ

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

    سويفت

    import Firebase

    ج موضوعية

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

    1. افتح صفحة واجهات برمجة تطبيقات ML Kit لوحدة تحكم 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 عند إنشاء كائن كاشف السحابة.

قم بتشغيل كاشف المعالم

الاعتراف المعالم في صورة تمرير الصورة كما 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 الذي يحدد اتجاه بيانات الصورة الموجودة في المخزن المؤقت 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];
    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 إلى معالج الإكمال. من كل كائن ، يمكنك الحصول على معلومات حول معلم معروف في الصورة.

فمثلا:

سويفت

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

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