คุณสามารถใช้ ML Kit เพื่อจดจำข้อความในภาพได้ ML Kit มีทั้ง API สำหรับใช้งานทั่วไปที่เหมาะสำหรับการจดจำข้อความในรูปภาพ เช่น ข้อความของป้ายถนน และ API ที่ปรับให้เหมาะสมสำหรับการจดจำข้อความของเอกสาร API วัตถุประสงค์ทั่วไปมีทั้งแบบในอุปกรณ์และแบบคลาวด์ การรู้จำข้อความในเอกสารมีให้ใช้งานในรูปแบบคลาวด์เท่านั้น ดู ภาพรวม สำหรับการเปรียบเทียบรุ่นคลาวด์และอุปกรณ์
ก่อนจะเริ่ม
- หากคุณยังไม่ได้เพิ่ม Firebase ในแอปของคุณ ให้ทำตามขั้นตอนในคู่มือ การเริ่มต้นใช้ งาน
- รวมไลบรารี ML Kit ใน Podfile ของคุณ:
pod 'Firebase/MLVision', '6.25.0' # If using an on-device API: pod 'Firebase/MLVisionTextModel', '6.25.0'
หลังจากที่คุณติดตั้งหรืออัปเดต Pod ของโปรเจ็กต์แล้ว อย่าลืมเปิดโปรเจ็กต์ Xcode โดยใช้ ..xcworkspace
- ในแอปของคุณ ให้นำเข้า Firebase:
Swift
import Firebase
วัตถุประสงค์-C
@import Firebase;
หากคุณต้องการใช้โมเดลบนคลาวด์ และคุณยังไม่ได้เปิดใช้งาน API แบบคลาวด์สำหรับโปรเจ็กต์ของคุณ ให้ทำตอนนี้:
- เปิดหน้า ML Kit APIs ของคอนโซล Firebase
หากคุณยังไม่ได้อัปเกรดโปรเจ็กต์ของคุณเป็นแผนราคา Blaze ให้คลิก อัปเกรด เพื่อดำเนินการดังกล่าว (คุณจะได้รับแจ้งให้อัปเกรดเฉพาะเมื่อโปรเจ็กต์ของคุณไม่อยู่ในแผน Blaze)
เฉพาะโปรเจ็กต์ระดับ Blaze เท่านั้นที่สามารถใช้ API แบบคลาวด์ได้
- หากยังไม่ได้เปิดใช้งาน API แบบคลาวด์ ให้คลิก เปิดใช้งาน API แบบคลาวด์
หากคุณต้องการใช้เฉพาะรุ่นในอุปกรณ์ ให้ข้ามขั้นตอนนี้
ตอนนี้คุณพร้อมที่จะเริ่มจดจำข้อความในภาพแล้ว
ป้อนหลักเกณฑ์เกี่ยวกับรูปภาพ
เพื่อให้ ML Kit จดจำข้อความได้อย่างแม่นยำ รูปภาพที่ป้อนต้องมีข้อความที่แสดงด้วยข้อมูลพิกเซลที่เพียงพอ ตามหลักการแล้วสำหรับข้อความภาษาละติน อักขระแต่ละตัวควรมีขนาดอย่างน้อย 16x16 พิกเซล สำหรับข้อความภาษาจีน ญี่ปุ่น และเกาหลี (รองรับโดย API ที่ใช้ระบบคลาวด์เท่านั้น) อักขระแต่ละตัวควรมีขนาด 24x24 พิกเซล สำหรับทุกภาษา โดยทั่วไปจะไม่มีประโยชน์ด้านความแม่นยำสำหรับอักขระที่มีขนาดใหญ่กว่า 24x24 พิกเซล
ตัวอย่างเช่น รูปภาพขนาด 640x480 อาจทำงานได้ดีในการสแกนนามบัตรที่ใช้ความกว้างเต็มของรูปภาพ ในการสแกนเอกสารที่พิมพ์บนกระดาษขนาด Letter อาจต้องใช้ภาพขนาด 720x1280 พิกเซล
การโฟกัสภาพไม่ดีอาจส่งผลเสียต่อความแม่นยำในการจดจำข้อความ หากคุณไม่ได้ผลลัพธ์ที่ยอมรับได้ ให้ลองขอให้ผู้ใช้จับภาพอีกครั้ง
หากคุณกำลังจดจำข้อความในแอปพลิเคชันแบบเรียลไทม์ คุณอาจต้องการพิจารณาขนาดโดยรวมของภาพที่ป้อนเข้า ภาพที่เล็กกว่าสามารถประมวลผลได้เร็วกว่า ดังนั้นเพื่อลดเวลาในการตอบสนอง จับภาพที่ความละเอียดต่ำ (โดยคำนึงถึงข้อกำหนดด้านความแม่นยำด้านบน) และตรวจสอบให้แน่ใจว่าข้อความใช้พื้นที่ภาพมากที่สุด โปรดดู เคล็ดลับในการปรับปรุงประสิทธิภาพแบบเรียลไทม์ ด้วย
จดจำข้อความในภาพ
หากต้องการจดจำข้อความในรูปภาพโดยใช้รูปแบบบนอุปกรณ์หรือบนคลาวด์ ให้เรียกใช้ตัวจำแนกข้อความตามที่อธิบายไว้ด้านล่าง
1. เรียกใช้ตัวจำแนกข้อความ
ส่งรูปภาพเป็น `UIImage` หรือ `CMSampleBufferRef` ไปยังเมธอด `VisionTextRecognizer`'s `process(_:completion:)`:- รับอินสแตนซ์ของ
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];
สร้างวัตถุ
VisionImage
โดยใช้UIImage
หรือCMSampleBufferRef
ในการใช้
UIImage
:- หากจำเป็น ให้หมุนรูปภาพเพื่อให้คุณสมบัติ
imageOrientation
เป็น ..up
- สร้างวัตถุ
VisionImage
โดยใช้UIImage
ที่หมุนอย่างถูกต้อง อย่าระบุข้อมูลเมตาการหมุนใดๆ ต้องใช้ค่าเริ่มต้น ..topLeft
Swift
let image = VisionImage(image: uiImage)
วัตถุประสงค์-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
ในการใช้
CMSampleBufferRef
:สร้างวัตถุ
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];
- สร้างวัตถุ
VisionImage
โดยใช้วัตถุCMSampleBufferRef
และข้อมูลเมตาของการหมุน:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
วัตถุประสงค์-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- หากจำเป็น ให้หมุนรูปภาพเพื่อให้คุณสมบัติ
- จากนั้นส่งภาพไปที่
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 นี้
ขั้นตอนถัดไป
- ก่อนที่คุณจะปรับใช้แอปที่ใช้งานจริงที่ใช้ Cloud API คุณควรดำเนินการขั้นตอนเพิ่มเติมบางอย่างเพื่อ ป้องกันและลดผลกระทบจากการเข้าถึง API ที่ไม่ได้รับอนุญาต
จดจำข้อความในรูปของเอกสาร
หากต้องการจดจำข้อความของเอกสาร ให้กำหนดค่าและเรียกใช้ตัวจำแนกข้อความในเอกสารบนระบบคลาวด์ตามที่อธิบายไว้ด้านล่าง
API การรู้จำข้อความของเอกสาร อธิบายไว้ด้านล่าง มีอินเทอร์เฟซที่ตั้งใจให้สะดวกยิ่งขึ้นสำหรับการทำงานกับรูปภาพของเอกสาร อย่างไรก็ตาม หากคุณต้องการอินเทอร์เฟซที่จัดเตรียมโดย sparse text API คุณสามารถใช้มันแทนการสแกนเอกสารโดยกำหนดค่าตัวจำแนกข้อความบนคลาวด์เพื่อ ใช้โมเดลข้อความหนาแน่น
ในการใช้ API การรู้จำข้อความของเอกสาร:
1. เรียกใช้ตัวจำแนกข้อความ
ส่งภาพเป็นUIImage
หรือ CMSampleBufferRef
ไปยังกระบวนการของ VisionDocumentTextRecognizer
process(_:completion:)
- รับอินสแตนซ์ของ
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];
สร้างวัตถุ
VisionImage
โดยใช้UIImage
หรือCMSampleBufferRef
ในการใช้
UIImage
:- หากจำเป็น ให้หมุนรูปภาพเพื่อให้คุณสมบัติ
imageOrientation
เป็น ..up
- สร้างวัตถุ
VisionImage
โดยใช้UIImage
ที่หมุนอย่างถูกต้อง อย่าระบุข้อมูลเมตาการหมุนใดๆ ต้องใช้ค่าเริ่มต้น ..topLeft
Swift
let image = VisionImage(image: uiImage)
วัตถุประสงค์-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
ในการใช้
CMSampleBufferRef
:สร้างวัตถุ
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];
- สร้างวัตถุ
VisionImage
โดยใช้วัตถุCMSampleBufferRef
และข้อมูลเมตาของการหมุน:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
วัตถุประสงค์-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- หากจำเป็น ให้หมุนรูปภาพเพื่อให้คุณสมบัติ
- จากนั้นส่งภาพไปที่
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; } } } }
ขั้นตอนถัดไป
- ก่อนที่คุณจะปรับใช้แอปที่ใช้งานจริงที่ใช้ Cloud API คุณควรดำเนินการขั้นตอนเพิ่มเติมบางอย่างเพื่อ ป้องกันและลดผลกระทบจากการเข้าถึง API ที่ไม่ได้รับอนุญาต