Ikuti semua informasi yang diumumkan di Firebase Summit, dan pelajari bagaimana Firebase dapat membantu Anda mempercepat pengembangan aplikasi dan menjalankan aplikasi dengan percaya diri. Pelajari Lebih Lanjut

Kenali Tengara dengan ML Kit di iOS

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Anda dapat menggunakan ML Kit untuk mengenali landmark terkenal dalam sebuah gambar.

Sebelum kamu memulai

  1. Jika Anda belum menambahkan Firebase ke aplikasi Anda, lakukan dengan mengikuti langkah-langkah di panduan memulai .
  2. Sertakan library ML Kit di Podfile Anda: l10n
    pod 'Firebase/MLVision', '6.25.0'
    
    Setelah Anda menginstal atau memperbarui Pod proyek Anda, pastikan untuk membuka proyek Xcode Anda menggunakan .xcworkspace -nya.
  3. Di aplikasi Anda, impor Firebase:

    Cepat

    import Firebase

    Objective-C

    @import Firebase;
  4. Jika Anda belum mengaktifkan API berbasis Cloud untuk proyek Anda, lakukan sekarang:

    1. Buka halaman ML Kit API dari Firebase console.
    2. Jika Anda belum memutakhirkan proyek Anda ke paket harga Blaze, klik Tingkatkan untuk melakukannya. (Anda akan diminta untuk memutakhirkan hanya jika proyek Anda tidak ada dalam paket Blaze.)

      Hanya project level Blaze yang dapat menggunakan API berbasis Cloud.

    3. Jika Cloud-based APIs belum diaktifkan, klik Enable Cloud-based APIs .

Konfigurasikan detektor tengara

Secara default, detektor Cloud menggunakan versi model yang stabil dan menampilkan hingga 10 hasil. Jika Anda ingin mengubah salah satu dari pengaturan ini, tentukan dengan objek VisionCloudDetectorOptions seperti pada contoh berikut:

Cepat

let options = VisionCloudDetectorOptions()
options.modelType = .latest
options.maxResults = 20

Objective-C

  FIRVisionCloudDetectorOptions *options =
      [[FIRVisionCloudDetectorOptions alloc] init];
  options.modelType = FIRVisionCloudModelTypeLatest;
  options.maxResults = 20;
  

Pada langkah berikutnya, teruskan objek VisionCloudDetectorOptions saat Anda membuat objek Detektor Cloud.

Jalankan detektor tengara

Untuk mengenali tengara dalam gambar, teruskan gambar sebagai UIImage atau CMSampleBufferRef ke metode detect(in:) VisionCloudLandmarkDetector :

  1. Dapatkan instance VisionCloudLandmarkDetector :

    Cepat

    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];
    
  2. Buat objek VisionImage menggunakan UIImage atau CMSampleBufferRef .

    Untuk menggunakan UIImage :

    1. Jika perlu, putar gambar sehingga properti imageOrientation -nya menjadi .up .
    2. Buat objek VisionImage menggunakan UIImage yang diputar dengan benar. Jangan tentukan metadata rotasi apa pun—nilai default, .topLeft , harus digunakan.

      Cepat

      let image = VisionImage(image: uiImage)

      Objective-C

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

    Untuk menggunakan CMSampleBufferRef :

    1. Buat objek VisionImageMetadata yang menentukan orientasi data gambar yang terdapat dalam buffer CMSampleBufferRef .

      Untuk mendapatkan orientasi gambar:

      Cepat

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

      Kemudian, buat objek metadata:

      Cepat

      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];
    2. Buat objek VisionImage menggunakan objek CMSampleBufferRef dan metadata rotasi:

      Cepat

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

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. Kemudian, berikan gambar ke metode detect(in:) :

    Cepat

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

Dapatkan informasi tentang landmark yang dikenali

Jika pengenalan tengara berhasil, larik objek VisionCloudLandmark akan diteruskan ke pengendali penyelesaian. Dari setiap objek, Anda bisa mendapatkan informasi tentang tengara yang dikenali dalam gambar.

Sebagai contoh:

Cepat

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

Langkah selanjutnya