iOS'te ML Kit ile resimlerdeki metinleri tanıyın

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

Resimler veya videolardaki bir sokak işareti metni gibi metinleri tanımak için ML Kit'i kullanabilirsiniz. Bu özelliğin temel özellikleri şunlardır:

Metin Tanıma API'sı
AçıklamaResimlerde veya videolarda Latin alfabesini tanıyın.
SDK adıGoogleMLKit/TextRecognition (version 2.2.0)
UygulamaÖğeler, oluşturma sırasında uygulamanıza statik olarak bağlanır.
Uygulama boyutu etkisiYaklaşık 20 MB
PerformansÇoğu cihazda gerçek zamanlı.

Başlamadan önce

  1. Aşağıdaki ML Kit kapsüllerini Podfile'ınıza dahil edin:
    pod 'GoogleMLKit/TextRecognition','2.2.0'
    
  2. Projenizin Pod'larını yükledikten veya güncelledikten sonra Xcode projenizi .xcworkspace kullanarak açın. ML Kit, Xcode'un 12.4 veya sonraki sürümlerinde desteklenir.

1. TextRecognizer örneği oluşturma

+textRecognizer çağrısı yaparak TextRecognizer örneğini oluşturun:

Swift

let textRecognizer = TextRecognizer.textRecognizer()
      

Objective-C

MLKTextRecognizer *textRecognizer = [MLKTextRecognizer textRecognizer];
      

2. Giriş resmini hazırlama

Resmi, TextRecognizer'in process(_:completion:) yöntemine UIImage veya CMSampleBufferRef olarak iletin:

UIImage veya CMSampleBuffer kullanarak bir VisionImage nesnesi oluşturun.

UIImage kullanıyorsanız şu adımları uygulayın:

  • UIImage ile bir VisionImage nesnesi oluşturun. Doğru .orientation değerini belirttiğinizden emin olun.

    Swift

    let image = VisionImage(image: UIImage)
    visionImage.orientation = image.imageOrientation

    Objective-C

    MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image];
    visionImage.orientation = image.imageOrientation;

CMSampleBuffer kullanıyorsanız şu adımları uygulayın:

  • CMSampleBuffer öğesinde bulunan resim verilerinin yönünü belirtin.

    Resmin yönünü görmek için:

    Swift

    func imageOrientation(
      deviceOrientation: UIDeviceOrientation,
      cameraPosition: AVCaptureDevice.Position
    ) -> UIImage.Orientation {
      switch deviceOrientation {
      case .portrait:
        return cameraPosition == .front ? .leftMirrored : .right
      case .landscapeLeft:
        return cameraPosition == .front ? .downMirrored : .up
      case .portraitUpsideDown:
        return cameraPosition == .front ? .rightMirrored : .left
      case .landscapeRight:
        return cameraPosition == .front ? .upMirrored : .down
      case .faceDown, .faceUp, .unknown:
        return .up
      }
    }
          

    Objective-C

    - (UIImageOrientation)
      imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                             cameraPosition:(AVCaptureDevicePosition)cameraPosition {
      switch (deviceOrientation) {
        case UIDeviceOrientationPortrait:
          return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored
                                                                : UIImageOrientationRight;
    
        case UIDeviceOrientationLandscapeLeft:
          return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored
                                                                : UIImageOrientationUp;
        case UIDeviceOrientationPortraitUpsideDown:
          return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored
                                                                : UIImageOrientationLeft;
        case UIDeviceOrientationLandscapeRight:
          return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored
                                                                : UIImageOrientationDown;
        case UIDeviceOrientationUnknown:
        case UIDeviceOrientationFaceUp:
        case UIDeviceOrientationFaceDown:
          return UIImageOrientationUp;
      }
    }
          
  • CMSampleBuffer nesnesini ve yönü kullanarak bir VisionImage nesnesi oluşturun:

    Swift

    let image = VisionImage(buffer: sampleBuffer)
    image.orientation = imageOrientation(
      deviceOrientation: UIDevice.current.orientation,
      cameraPosition: cameraPosition)

    Objective-C

     MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer];
     image.orientation =
       [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                    cameraPosition:cameraPosition];

3. Resmi işleyin

Ardından, resmi process(_:completion:) yöntemine geçirin:

Swift

textRecognizer.process(visionImage) { result, error in
  guard error == nil, let result = result else {
    // Error handling
    return
  }
  // Recognized text
}

Objective-C

[textRecognizer processImage:image
                  completion:^(MLKText *_Nullable result,
                               NSError *_Nullable error) {
  if (error != nil || result == nil) {
    // Error handling
    return;
  }
  // Recognized text
}];

4. Tanınan metin bloklarından metin çıkarma

Metin tanıma işlemi başarılı olursa Text nesnesi döndürür. Text nesnesi, resimde tanınan tam metni ve sıfır veya daha fazla TextBlock nesnesini içerir.

Her bir TextBlock, sıfır veya daha fazla TextLine nesne içeren dikdörtgen metin blokunu temsil eder. Her TextLine nesnesi sıfır kelime veya daha fazla TextElement nesnesi içerir. Bu nesnelerin yanı sıra tarih ve sayı gibi kelime benzeri öğeler temsil edilir.

Her bir TextBlock, TextLine ve TextElement nesnesi için metnin bölgede ve sınır koordinatlarında tanınmasını sağlayabilirsiniz.

Örnek:

Swift

let resultText = result.text
for block in result.blocks {
    let blockText = block.text
    let blockLanguages = block.recognizedLanguages
    let blockCornerPoints = block.cornerPoints
    let blockFrame = block.frame
    for line in block.lines {
        let lineText = line.text
        let lineLanguages = line.recognizedLanguages
        let lineCornerPoints = line.cornerPoints
        let lineFrame = line.frame
        for element in line.elements {
            let elementText = element.text
            let elementCornerPoints = element.cornerPoints
            let elementFrame = element.frame
        }
    }
}

Objective-C

NSString *resultText = result.text;
for (MLKTextBlock *block in result.blocks) {
  NSString *blockText = block.text;
  NSArray<MLKTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages;
  NSArray<NSValue *> *blockCornerPoints = block.cornerPoints;
  CGRect blockFrame = block.frame;
  for (MLKTextLine *line in block.lines) {
    NSString *lineText = line.text;
    NSArray<MLKTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages;
    NSArray<NSValue *> *lineCornerPoints = line.cornerPoints;
    CGRect lineFrame = line.frame;
    for (MLKTextElement *element in line.elements) {
      NSString *elementText = element.text;
      NSArray<NSValue *> *elementCornerPoints = element.cornerPoints;
      CGRect elementFrame = element.frame;
    }
  }
}

Giriş resmi yönergeleri

  • ML Kit'in metni doğru şekilde tanıması için giriş görüntüleri, yeterli piksel verileriyle temsil edilen metin içermelidir. Her bir karakterin en az 16x16 piksel olması önerilir. Karakterlerin genellikle 24x24 pikselden büyük olmasında doğruluk avantajı yoktur.

    Bu nedenle, 640x480 boyutlu bir resim, resmin tam genişliğinde kaplayan bir kartvizit taramak için iyi bir şekilde çalışabilir. Harf boyutunda kağıt üzerine basılı bir dokümanı taramak için 720x1280 piksel boyutunda bir resim gerekebilir.

  • Düşük resim odağı, metin tanıma doğruluğunu etkileyebilir. Kabul edilebilir sonuçlar elde edemiyorsanız kullanıcıdan resmi yeniden yakalamasını isteyin.

  • Gerçek zamanlı bir uygulamadaki metni tanıyorsanız giriş resimlerinin genel boyutlarını dikkate almanız gerekir. Küçük resimler daha hızlı işlenebilir. Gecikmeyi azaltmak için metnin resmin mümkün olduğunca fazla yer kaplamasına dikkat edin ve resimleri daha düşük çözünürlüklerde yakalayın (yukarıda belirtilen doğruluk gereksinimlerini göz önünde bulundurarak). Daha fazla bilgi için Performansı artırmaya yönelik ipuçları bölümünü inceleyin.

Performansı artırmaya yönelik ipuçları

  • Video çerçevelerini işlemek için algılayıcının results(in:) eşzamanlı API'sını kullanın. Belirtilen video çerçevesinden eşzamanlı olarak sonuç almak için bu yöntemi AVCaptureVideoDataOutputSampleBufferDelegate& captureOutput(_, didOutput:from:) işlevinden çağırın. Algılayıcının çağrılarını kısmak için AVCaptureVideoDataOutput alwaysDiscardsLateVideoFrames true olarak bırak. Algılayıcı çalışırken yeni bir video çerçevesi kullanılabilir hale gelirse atlanır.
  • Algılayıcının çıkışını giriş resmine bindirmek için kullanırsanız önce ML Kit'ten sonucu alın, ardından resmi ve yer paylaşımını tek adımda oluşturun. Bunu yaptığınızda, işlenen her bir giriş çerçevesi için görüntüleme yüzeyini yalnızca bir kez oluşturursunuz. Örnek için ML Kit hızlı başlangıç örneğindeki updatepreviewLayoutViewWithLastFrame bölümüne bakın.
  • Daha düşük çözünürlükte görüntüler yakalamayı düşünebilirsiniz. Ancak bu API'nin görüntü boyutu şartlarını da göz önünde bulundurun.