Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Nhận dạng các mốc với ML Kit trên iOS

Bạn có thể sử dụng ML Kit để nhận ra các địa danh nổi tiếng trong hình ảnh.

Trước khi bắt đầu

  1. Nếu bạn chưa thêm căn cứ hỏa lực để ứng dụng của bạn, làm như vậy bằng cách làm theo các bước trong hướng dẫn bắt đầu .
  2. Bao gồm các thư viện ML Kit trong Podfile của bạn:
    pod 'Firebase/MLVision', '6.25.0'
    
    Sau khi bạn cài đặt hoặc cập nhật Pods của dự án của bạn, hãy chắc chắn để mở dự án Xcode của bạn sử dụng nó .xcworkspace .
  3. Trong ứng dụng của bạn, hãy nhập Firebase:

    Nhanh

    import Firebase

    Objective-C

    @import Firebase;
  4. Nếu bạn chưa bật API dựa trên đám mây cho dự án của mình, hãy làm như vậy ngay bây giờ:

    1. Mở trang ML Kit API của các firebase console.
    2. Nếu bạn chưa nâng cấp dự án của bạn sang gói giá Blaze, bấm Nâng cấp để làm như vậy. (Bạn sẽ chỉ được nhắc nâng cấp nếu dự án của bạn không nằm trong gói Blaze.)

      Chỉ các dự án cấp Blaze mới có thể sử dụng API dựa trên đám mây.

    3. Nếu API dựa trên đám mây chưa được kích hoạt, nhấp chuột Enable API dựa trên đám mây.

Định cấu hình máy dò mốc

Theo mặc định, trình phát hiện Đám mây sử dụng phiên bản ổn định của mô hình và trả về tối đa 10 kết quả. Nếu bạn muốn thay đổi một trong các thiết lập này, xác định chúng với một VisionCloudDetectorOptions đối tượng như trong ví dụ sau:

Nhanh

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

Objective-C

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

Trong bước tiếp theo, vượt qua VisionCloudDetectorOptions phản đối khi bạn tạo đối tượng dò Cloud.

Chạy máy dò mốc

Để nhận ra các địa danh tại một hình ảnh, vượt qua hình ảnh như một UIImage hoặc một CMSampleBufferRef đến VisionCloudLandmarkDetector 's detect(in:) phương pháp:

  1. Nhận một thể hiện của VisionCloudLandmarkDetector :

    Nhanh

    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. Tạo một VisionImage đối tượng sử dụng một UIImage hoặc một CMSampleBufferRef .

    Để sử dụng một UIImage :

    1. Nếu cần thiết, xoay hình ảnh để nó imageOrientation tài sản là .up .
    2. Tạo một VisionImage đối tượng bằng cách sử dụng một cách chính xác-xoay UIImage . Không chỉ định bất kỳ luân chuyển siêu dữ liệu giá trị mặc định, .topLeft , phải được sử dụng.

      Nhanh

      let image = VisionImage(image: uiImage)

      Objective-C

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

    Để sử dụng một CMSampleBufferRef :

    1. Tạo một VisionImageMetadata đối tượng quy định cụ thể định hướng của dữ liệu hình ảnh chứa trong CMSampleBufferRef đệm.

      Để có được hướng hình ảnh:

      Nhanh

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

      Sau đó, tạo đối tượng siêu dữ liệu:

      Nhanh

      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. Tạo một VisionImage đối tượng sử dụng CMSampleBufferRef đối tượng và siêu dữ liệu luân chuyển:

      Nhanh

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

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. Sau đó, thông qua các hình ảnh vào detect(in:) phương pháp:

    Nhanh

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

Nhận thông tin về các địa danh được công nhận

Nếu công nhận mang tính bước ngoặt thành công, một mảng của VisionCloudLandmark đối tượng sẽ được chuyển đến xử lý hoàn thành. Từ mỗi đối tượng, bạn có thể nhận được thông tin về một điểm mốc được nhận dạng trong hình ảnh.

Ví dụ:

Nhanh

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

Bước tiếp theo