Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

จดจำข้อความในรูปภาพด้วย ML Kit บน iOS

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

คุณสามารถใช้ ML Kit เพื่อจดจำข้อความในภาพได้ ML Kit มีทั้ง API สำหรับใช้งานทั่วไปที่เหมาะสำหรับการจดจำข้อความในรูปภาพ เช่น ข้อความของป้ายถนน และ API ที่ปรับให้เหมาะสมสำหรับการจดจำข้อความของเอกสาร API วัตถุประสงค์ทั่วไปมีทั้งแบบในอุปกรณ์และแบบคลาวด์ การรู้จำข้อความในเอกสารมีให้ใช้งานในรูปแบบคลาวด์เท่านั้น ดู ภาพรวม สำหรับการเปรียบเทียบรุ่นคลาวด์และอุปกรณ์

ก่อนจะเริ่ม

  1. หากคุณยังไม่ได้เพิ่ม Firebase ในแอปของคุณ ให้ทำตามขั้นตอนในคู่มือ การเริ่มต้นใช้ งาน
  2. รวมไลบรารี ML Kit ใน Podfile ของคุณ:
    pod 'Firebase/MLVision', '6.25.0'
    # If using an on-device API:
    pod 'Firebase/MLVisionTextModel', '6.25.0'
    
    หลังจากที่คุณติดตั้งหรืออัปเดต Pod ของโปรเจ็กต์แล้ว อย่าลืมเปิดโปรเจ็กต์ Xcode โดยใช้ . .xcworkspace
  3. ในแอปของคุณ ให้นำเข้า Firebase:

    Swift

    import Firebase

    วัตถุประสงค์-C

    @import Firebase;
  4. หากคุณต้องการใช้โมเดลบนคลาวด์ และคุณยังไม่ได้เปิดใช้งาน API แบบคลาวด์สำหรับโปรเจ็กต์ของคุณ ให้ทำตอนนี้:

    1. เปิดหน้า ML Kit APIs ของคอนโซล Firebase
    2. หากคุณยังไม่ได้อัปเกรดโปรเจ็กต์ของคุณเป็นแผนราคา Blaze ให้คลิก อัปเกรด เพื่อดำเนินการดังกล่าว (คุณจะได้รับแจ้งให้อัปเกรดเฉพาะเมื่อโปรเจ็กต์ของคุณไม่อยู่ในแผน Blaze)

      เฉพาะโปรเจ็กต์ระดับ Blaze เท่านั้นที่สามารถใช้ API แบบคลาวด์ได้

    3. หากยังไม่ได้เปิดใช้งาน API แบบคลาวด์ ให้คลิก เปิดใช้งาน API แบบคลาวด์

    หากคุณต้องการใช้เฉพาะรุ่นในอุปกรณ์ ให้ข้ามขั้นตอนนี้

ตอนนี้คุณพร้อมที่จะเริ่มจดจำข้อความในภาพแล้ว

ป้อนหลักเกณฑ์เกี่ยวกับรูปภาพ

  • เพื่อให้ ML Kit จดจำข้อความได้อย่างแม่นยำ รูปภาพที่ป้อนต้องมีข้อความที่แสดงด้วยข้อมูลพิกเซลที่เพียงพอ ตามหลักการแล้วสำหรับข้อความภาษาละติน อักขระแต่ละตัวควรมีขนาดอย่างน้อย 16x16 พิกเซล สำหรับข้อความภาษาจีน ญี่ปุ่น และเกาหลี (รองรับโดย API ที่ใช้ระบบคลาวด์เท่านั้น) อักขระแต่ละตัวควรมีขนาด 24x24 พิกเซล สำหรับทุกภาษา โดยทั่วไปจะไม่มีประโยชน์ด้านความแม่นยำสำหรับอักขระที่มีขนาดใหญ่กว่า 24x24 พิกเซล

    ตัวอย่างเช่น รูปภาพขนาด 640x480 อาจทำงานได้ดีในการสแกนนามบัตรที่ใช้ความกว้างเต็มของรูปภาพ ในการสแกนเอกสารที่พิมพ์บนกระดาษขนาด Letter อาจต้องใช้ภาพขนาด 720x1280 พิกเซล

  • การโฟกัสภาพไม่ดีอาจส่งผลเสียต่อความแม่นยำในการจดจำข้อความ หากคุณไม่ได้ผลลัพธ์ที่ยอมรับได้ ให้ลองขอให้ผู้ใช้จับภาพอีกครั้ง

  • หากคุณกำลังจดจำข้อความในแอปพลิเคชันแบบเรียลไทม์ คุณอาจต้องการพิจารณาขนาดโดยรวมของภาพที่ป้อนเข้า ภาพที่เล็กกว่าสามารถประมวลผลได้เร็วกว่า ดังนั้นเพื่อลดเวลาในการตอบสนอง จับภาพที่ความละเอียดต่ำ (โดยคำนึงถึงข้อกำหนดด้านความแม่นยำด้านบน) และตรวจสอบให้แน่ใจว่าข้อความใช้พื้นที่ภาพมากที่สุด โปรดดู เคล็ดลับในการปรับปรุงประสิทธิภาพแบบเรียลไทม์ ด้วย


จดจำข้อความในภาพ

หากต้องการจดจำข้อความในรูปภาพโดยใช้รูปแบบบนอุปกรณ์หรือบนคลาวด์ ให้เรียกใช้ตัวจำแนกข้อความตามที่อธิบายไว้ด้านล่าง

1. เรียกใช้ตัวจำแนกข้อความ

ส่งรูปภาพเป็น `UIImage` หรือ `CMSampleBufferRef` ไปยังเมธอด `VisionTextRecognizer`'s `process(_:completion:)`:
  1. รับอินสแตนซ์ของ VisionTextRecognizer โดยเรียก onDeviceTextRecognizer หรือ cloudTextRecognizer :

    Swift

    ในการใช้รุ่นบนอุปกรณ์:

    let vision = Vision.vision()
    let textRecognizer = vision.onDeviceTextRecognizer()
    

    ในการใช้โมเดลคลาวด์:

    let vision = Vision.vision()
    let textRecognizer = vision.cloudTextRecognizer()
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    let options = VisionCloudTextRecognizerOptions()
    options.languageHints = ["en", "hi"]
    let textRecognizer = vision.cloudTextRecognizer(options: options)
    

    วัตถุประสงค์-C

    ในการใช้รุ่นบนอุปกรณ์:

    FIRVision *vision = [FIRVision vision];
    FIRVisionTextRecognizer *textRecognizer = [vision onDeviceTextRecognizer];
    

    ในการใช้โมเดลคลาวด์:

    FIRVision *vision = [FIRVision vision];
    FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizer];
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    FIRVisionCloudTextRecognizerOptions *options =
            [[FIRVisionCloudTextRecognizerOptions alloc] init];
    options.languageHints = @[@"en", @"hi"];
    FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizerWithOptions:options];
    
  2. สร้างวัตถุ VisionImage โดยใช้ UIImage หรือ CMSampleBufferRef

    ในการใช้ UIImage :

    1. หากจำเป็น ให้หมุนรูปภาพเพื่อให้คุณสมบัติ imageOrientation เป็น . .up
    2. สร้างวัตถุ VisionImage โดยใช้ UIImage ที่หมุนอย่างถูกต้อง อย่าระบุข้อมูลเมตาการหมุนใดๆ ต้องใช้ค่าเริ่มต้น . .topLeft

      Swift

      let image = VisionImage(image: uiImage)

      วัตถุประสงค์-C

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

    ในการใช้ CMSampleBufferRef :

    1. สร้างวัตถุ VisionImageMetadata ที่ระบุการวางแนวของข้อมูลภาพที่มีอยู่ในบัฟเฟอร์ CMSampleBufferRef

      ในการรับการวางแนวของภาพ:

      Swift

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

      วัตถุประสงค์-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;
        }
      }

      จากนั้นสร้างวัตถุข้อมูลเมตา:

      Swift

      let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
      let metadata = VisionImageMetadata()
      metadata.orientation = imageOrientation(
          deviceOrientation: UIDevice.current.orientation,
          cameraPosition: cameraPosition
      )

      วัตถุประสงค์-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. สร้างวัตถุ VisionImage โดยใช้วัตถุ CMSampleBufferRef และข้อมูลเมตาของการหมุน:

      Swift

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

      วัตถุประสงค์-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. จากนั้นส่งภาพไปที่ process(_:completion:) method:

    Swift

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

    วัตถุประสงค์-C

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

2. แยกข้อความจากบล็อกของข้อความที่รู้จัก

หากการดำเนินการรู้จำข้อความสำเร็จ จะส่งคืนวัตถุ [`VisionText`][VisionText] ออบเจ็กต์ `VisionText` มีข้อความแบบเต็มที่รู้จักในรูปภาพและออบเจ็กต์ [`VisionTextBlock`][VisionTextBlock] ที่เป็นศูนย์หรือมากกว่า `VisionTextBlock' แต่ละอันแสดงถึงบล็อกข้อความสี่เหลี่ยมซึ่งมีออบเจ็กต์ [`VisionTextLine`][VisionTextLine] 0 หรือมากกว่า ออบเจ็กต์ `VisionTextLine' แต่ละรายการมีออบเจ็กต์ [`VisionTextElement`][VisionTextElement] ศูนย์หรือมากกว่า ซึ่งแสดงถึงคำและเอนทิตีที่เหมือนคำ (วันที่ ตัวเลข และอื่นๆ) สำหรับแต่ละออบเจ็กต์ `VisionTextBlock', 'VisionTextLine' และ 'VisionTextElement' คุณสามารถรับข้อความที่รู้จักในภูมิภาคและพิกัดขอบเขตของภูมิภาค ตัวอย่างเช่น:

Swift

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

วัตถุประสงค์-C

NSString *resultText = result.text;
for (FIRVisionTextBlock *block in result.blocks) {
  NSString *blockText = block.text;
  NSNumber *blockConfidence = block.confidence;
  NSArray<FIRVisionTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages;
  NSArray<NSValue *> *blockCornerPoints = block.cornerPoints;
  CGRect blockFrame = block.frame;
  for (FIRVisionTextLine *line in block.lines) {
    NSString *lineText = line.text;
    NSNumber *lineConfidence = line.confidence;
    NSArray<FIRVisionTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages;
    NSArray<NSValue *> *lineCornerPoints = line.cornerPoints;
    CGRect lineFrame = line.frame;
    for (FIRVisionTextElement *element in line.elements) {
      NSString *elementText = element.text;
      NSNumber *elementConfidence = element.confidence;
      NSArray<FIRVisionTextRecognizedLanguage *> *elementLanguages = element.recognizedLanguages;
      NSArray<NSValue *> *elementCornerPoints = element.cornerPoints;
      CGRect elementFrame = element.frame;
    }
  }
}

เคล็ดลับในการปรับปรุงประสิทธิภาพแบบเรียลไทม์

หากคุณต้องการใช้โมเดลในอุปกรณ์เพื่อจดจำข้อความในแอปพลิเคชันแบบเรียลไทม์ ให้ทำตามคำแนะนำเหล่านี้เพื่อให้ได้อัตราเฟรมที่ดีที่สุด:

  • เค้นโทรไปยังตัวจำแนกข้อความ หากเฟรมวิดีโอใหม่พร้อมใช้งานในขณะที่ตัวจำแนกข้อความกำลังทำงาน ให้วางเฟรม
  • หากคุณกำลังใช้เอาต์พุตของตัวจำแนกข้อความเพื่อซ้อนทับกราฟิกบนรูปภาพอินพุต ก่อนอื่นให้รับผลลัพธ์จาก ML Kit จากนั้นแสดงรูปภาพและโอเวอร์เลย์ในขั้นตอนเดียว เมื่อทำเช่นนั้น คุณจะแสดงผลไปยังพื้นผิวการแสดงผลเพียงครั้งเดียวสำหรับแต่ละเฟรมอินพุต ดูตัวอย่างคลาส PreviewOverlayView และ FIRDetectionOverlayView ในแอปตัวอย่าง Showcase
  • พิจารณาการถ่ายภาพด้วยความละเอียดที่ต่ำกว่า อย่างไรก็ตาม พึงระลึกไว้เสมอว่าข้อกำหนดด้านมิติภาพของ API นี้

ขั้นตอนถัดไป


จดจำข้อความในรูปของเอกสาร

หากต้องการจดจำข้อความของเอกสาร ให้กำหนดค่าและเรียกใช้ตัวจำแนกข้อความในเอกสารบนระบบคลาวด์ตามที่อธิบายไว้ด้านล่าง

API การรู้จำข้อความของเอกสาร อธิบายไว้ด้านล่าง มีอินเทอร์เฟซที่ตั้งใจให้สะดวกยิ่งขึ้นสำหรับการทำงานกับรูปภาพของเอกสาร อย่างไรก็ตาม หากคุณต้องการอินเทอร์เฟซที่จัดเตรียมโดย sparse text API คุณสามารถใช้มันแทนการสแกนเอกสารโดยกำหนดค่าตัวจำแนกข้อความบนคลาวด์เพื่อ ใช้โมเดลข้อความหนาแน่น

ในการใช้ API การรู้จำข้อความของเอกสาร:

1. เรียกใช้ตัวจำแนกข้อความ

ส่งภาพเป็น UIImage หรือ CMSampleBufferRef ไปยังกระบวนการของ VisionDocumentTextRecognizer process(_:completion:)

  1. รับอินสแตนซ์ของ VisionDocumentTextRecognizer โดยเรียก cloudDocumentTextRecognizer :

    Swift

    let vision = Vision.vision()
    let textRecognizer = vision.cloudDocumentTextRecognizer()
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    let options = VisionCloudDocumentTextRecognizerOptions()
    options.languageHints = ["en", "hi"]
    let textRecognizer = vision.cloudDocumentTextRecognizer(options: options)
    

    วัตถุประสงค์-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizer];
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    FIRVisionCloudDocumentTextRecognizerOptions *options =
            [[FIRVisionCloudDocumentTextRecognizerOptions alloc] init];
    options.languageHints = @[@"en", @"hi"];
    FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizerWithOptions:options];
    
  2. สร้างวัตถุ VisionImage โดยใช้ UIImage หรือ CMSampleBufferRef

    ในการใช้ UIImage :

    1. หากจำเป็น ให้หมุนรูปภาพเพื่อให้คุณสมบัติ imageOrientation เป็น . .up
    2. สร้างวัตถุ VisionImage โดยใช้ UIImage ที่หมุนอย่างถูกต้อง อย่าระบุข้อมูลเมตาการหมุนใดๆ ต้องใช้ค่าเริ่มต้น . .topLeft

      Swift

      let image = VisionImage(image: uiImage)

      วัตถุประสงค์-C

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

    ในการใช้ CMSampleBufferRef :

    1. สร้างวัตถุ VisionImageMetadata ที่ระบุการวางแนวของข้อมูลภาพที่มีอยู่ในบัฟเฟอร์ CMSampleBufferRef

      ในการรับการวางแนวของภาพ:

      Swift

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

      วัตถุประสงค์-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;
        }
      }

      จากนั้นสร้างวัตถุข้อมูลเมตา:

      Swift

      let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
      let metadata = VisionImageMetadata()
      metadata.orientation = imageOrientation(
          deviceOrientation: UIDevice.current.orientation,
          cameraPosition: cameraPosition
      )

      วัตถุประสงค์-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. สร้างวัตถุ VisionImage โดยใช้วัตถุ CMSampleBufferRef และข้อมูลเมตาของการหมุน:

      Swift

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

      วัตถุประสงค์-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. จากนั้นส่งภาพไปที่ process(_:completion:) method:

    Swift

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

    วัตถุประสงค์-C

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

2. แยกข้อความจากบล็อกของข้อความที่รู้จัก

หากการดำเนินการรู้จำข้อความสำเร็จ จะส่งคืนวัตถุ VisionDocumentText วัตถุ VisionDocumentText มีข้อความแบบเต็มที่รู้จักในรูปภาพและลำดับชั้นของวัตถุที่สะท้อนถึงโครงสร้างของเอกสารที่รู้จัก:

สำหรับแต่ละ VisionDocumentTextBlock , VisionDocumentTextParagraph , VisionDocumentTextWord และ VisionDocumentTextSymbol คุณสามารถรับข้อความที่รู้จักในภูมิภาคและพิกัดขอบเขตของภูมิภาค

ตัวอย่างเช่น:

Swift

let resultText = result.text
for block in result.blocks {
    let blockText = block.text
    let blockConfidence = block.confidence
    let blockRecognizedLanguages = block.recognizedLanguages
    let blockBreak = block.recognizedBreak
    let blockCornerPoints = block.cornerPoints
    let blockFrame = block.frame
    for paragraph in block.paragraphs {
        let paragraphText = paragraph.text
        let paragraphConfidence = paragraph.confidence
        let paragraphRecognizedLanguages = paragraph.recognizedLanguages
        let paragraphBreak = paragraph.recognizedBreak
        let paragraphCornerPoints = paragraph.cornerPoints
        let paragraphFrame = paragraph.frame
        for word in paragraph.words {
            let wordText = word.text
            let wordConfidence = word.confidence
            let wordRecognizedLanguages = word.recognizedLanguages
            let wordBreak = word.recognizedBreak
            let wordCornerPoints = word.cornerPoints
            let wordFrame = word.frame
            for symbol in word.symbols {
                let symbolText = symbol.text
                let symbolConfidence = symbol.confidence
                let symbolRecognizedLanguages = symbol.recognizedLanguages
                let symbolBreak = symbol.recognizedBreak
                let symbolCornerPoints = symbol.cornerPoints
                let symbolFrame = symbol.frame
            }
        }
    }
}

วัตถุประสงค์-C

NSString *resultText = result.text;
for (FIRVisionDocumentTextBlock *block in result.blocks) {
  NSString *blockText = block.text;
  NSNumber *blockConfidence = block.confidence;
  NSArray<FIRVisionTextRecognizedLanguage *> *blockRecognizedLanguages = block.recognizedLanguages;
  FIRVisionTextRecognizedBreak *blockBreak = block.recognizedBreak;
  CGRect blockFrame = block.frame;
  for (FIRVisionDocumentTextParagraph *paragraph in block.paragraphs) {
    NSString *paragraphText = paragraph.text;
    NSNumber *paragraphConfidence = paragraph.confidence;
    NSArray<FIRVisionTextRecognizedLanguage *> *paragraphRecognizedLanguages = paragraph.recognizedLanguages;
    FIRVisionTextRecognizedBreak *paragraphBreak = paragraph.recognizedBreak;
    CGRect paragraphFrame = paragraph.frame;
    for (FIRVisionDocumentTextWord *word in paragraph.words) {
      NSString *wordText = word.text;
      NSNumber *wordConfidence = word.confidence;
      NSArray<FIRVisionTextRecognizedLanguage *> *wordRecognizedLanguages = word.recognizedLanguages;
      FIRVisionTextRecognizedBreak *wordBreak = word.recognizedBreak;
      CGRect wordFrame = word.frame;
      for (FIRVisionDocumentTextSymbol *symbol in word.symbols) {
        NSString *symbolText = symbol.text;
        NSNumber *symbolConfidence = symbol.confidence;
        NSArray<FIRVisionTextRecognizedLanguage *> *symbolRecognizedLanguages = symbol.recognizedLanguages;
        FIRVisionTextRecognizedBreak *symbolBreak = symbol.recognizedBreak;
        CGRect symbolFrame = symbol.frame;
      }
    }
  }
}

ขั้นตอนถัดไป