iOS Swift/iOS Swift - 예제

[iOS/Swift] Google MLKit Vision OCR Api 예제

주니어코더 2023. 2. 1. 17:56

 

 

 

 

 

 

Swift 언어를 사용하여

Google MLKit Vision OCR Api 를사용하는 예제를 포스팅

 

이전에 포스팅 했던 네이버와 달리,

구글은 라이브러리 설치는 pod install 만 하면 된다

 

 

 

 

 

네이버 OCR 사용법이 궁금하다면 아래 포스팅 클릭!

 

2023.01.02 - [프로그래밍/IOS] - [IOS/Swift] 네이버 Clova OCR Api 예제

 

[IOS/Swift] 네이버 Clova OCR Api 예제

Swift 언어를 사용하여 네이버 Clova OCR 엔진을 사용하는 예제를 포스팅한다! 네이버 Clovar OCR Api 사용 방법부터 진행해야 하는 분은 이전 글부터 읽어야 한다 네이버 Clova OCR 사용 예제 2022.12.07 - [프

ohwhatisthis.tistory.com

 

 

 

 

🚫 주의 🚫

 MLKit 경우 Xcode 버전 12.4 이상에서 지원됩니다

 

 

 

Chap1Google MLKit 라이브러리 설치


 

cocoaPods를 사용하여 GoogleMLKit 라이브러리를 설치합니다

저는 한국어도 변환할 거라서 TextRecognitionKorean 도 다운!

pod 'GoogleMLKit/TextRecognition', '3.2.0'
pod 'GoogleMLKit/TextRecognitionKorean', '3.2.0'

 

 

 

현재 MLKit에서 제공하는 언어는 '영어, 라틴어, 중국어, 데바나가리어, 일본어, 한국어'가 있습니다

아래 pod file 설치하면 사용 가능합니다

 

# To recognize Latin script
pod 'GoogleMLKit/TextRecognition', '3.2.0'
# To recognize Chinese script
pod 'GoogleMLKit/TextRecognitionChinese', '3.2.0'
# To recognize Devanagari script
pod 'GoogleMLKit/TextRecognitionDevanagari', '3.2.0'
# To recognize Japanese script
pod 'GoogleMLKit/TextRecognitionJapanese', '3.2.0'
# To recognize Korean script
pod 'GoogleMLKit/TextRecognitionKorean', '3.2.0'

 

내가 사용하려던 언어가 지원하지 않더라도, 아쉬워할 필요가 없다

우리의 구글에서는 우선 순위를 두고 지원하는 언어, 실험용 언어도 제공한다! 갓글

 

정식으로 지원하는 언어만큼의 성능은 안 나오겠지만 필요하신 분들은 사용해 보세요

 

 

 

👇 MLKit 이 지원하는 모든 언어를 알고 싶다면 아래 링크 클릭 👇

 

https://developers.google.com/ml-kit/vision/text-recognition/v2/languages?hl=ko#supported-langs 

 

텍스트 인식 v2: 지원되는 언어  |  ML Kit  |  Google Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English 텍스트 인식 v2: 지원되는 언어 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. ML Kit 텍스

developers.google.com

 

 

 

 

 

 

Chap2.  TextRecognizer 인스턴스 만들기


 

MLKit을 사용하기 위해서는 가장 먼저 인스턴스 생성부터 해야 한다!

나는 한국어만 번역할 예정이어서 koreanTextRecognizer 인스턴스만 만들었다

 

let koreanOptions = KoreanTextRecognizerOptions()
let koreanTextRecognizer = TextRecognizer.textRecognizer(options: koreanOptions)

 

textRecognizer(options: )의 options 에는 '번역하고자 하는 언어의 Options 인스턴스'를 넣으면 된다

 

 

 

 

Chap3. 번역할 이미지를 준비


 

저는 김수영 시인의 '사랑'이라는 시를 번역해 보겠습니다

 

 

 

 

번역할 이미지를 Asset에 넣어줍니다

 

 

 

 

이미지를 변수에 저장한 후 파일 형식을 변경합니다

MLKit 은 VisionImage 형식을 요구하여  파일 형식을 맞춰주겠습니당~

 

거꾸로 된 이미지에서 텍스트를 추출할 수도 있기 때문에

VisionImage방향을 맞추는 함수를 추가합니다

 

  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
          @unknown default:
              fatalError()
          }
  }

 

 

 

저장된 이미지를 VisionImage로 변경 하고

이미지 방향을 설정합니다

 

var imgLove = UIImage(named: "love")
let visionImage = VisionImage(image: imgLove!)

// 이미지 방향 설정
visionImage.orientation = 
	imageOrientation(deviceOrientation: UIDevice.current.orientation,
	cameraPosition: cameraPosition)

 

번역할 이미지 준비는 완료

 

 

 

 

Chap4.  이미지 처리


 

이미지 번역에 필요한 사전 작업은 끝났으므로,

이미지 처리 코드를 작성해 보겠습니다

 

koreanTextRecognizer.process(visionImage) { features, error in
    koreanTextRecognizer.process(visionImage) { result, error in
        guard error == nil, let result = result else {
            // Error handling
            print("TextRecognizer Fail")
            return
        }
        let resultText = result.text
        DispatchQueue.main.async {
        	// label에 번역된 text 작성
            self.label.text = resultText
            print(resultText)       
        }
    }
}

 

koreanTextRecognizer.process 메서드에 번역할 이미지를 전달한 후,

handler를 사용하여 Error 처리와 번역된 결과 처리를 합니다

 

본인은 번역된 text를 label에 보여주기 위해 DispatchQueue.main.async 함수를 사용하였습니다

 

✅ 주의 사항  

iOS에서 UI를 변경하는 코드의 경우 반. 드. 시 메인스레드에 작성하여야 합니다

main thread에서 작동하기 위해 DispatchQueue.main.async 함수를 사용

 

 

 

 

 

Chap5.  인식된 텍스트 블록에서 텍스트 추출


 

텍스트가 블록 안에 들어있거나, 밑줄이나 공백이 있을 경우도 텍스트 추출 가능합니다

 

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

 

위 코드를 통하여

block, line, element에 있는 텍스트 추출 가능합니다

 

 

 

 

 

 

Chap6.  결과 확인하기


 

실제 앱을 빌드한 결과입니다

 

 

 

 

 

 

👇 소스코드 전체를 보고 싶다면 아래 깃허브로 👇

https://github.com/hyeebin/ocr/tree/main/ocr-mlkit-ios

 

 

 

 

 

 

 

 

참조: https://developers.google.com/ml-kit/vision/text-recognition/v2/ios?hl=ko

반응형