본문 바로가기
iOS/Swift

[Swift] VisionKit OCR

by Jiseong 2024. 10. 7.

VisionKit을 사용한 OCR 기술 구현

이미지 분석 등의 과정을 처리할 핸들러 구현

https://developer.apple.com/documentation/vision/vnimagerequesthandler

 

https://developer.apple.com/documentation/vision/vnrecognizetextrequest

let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
// Request 클로저 내부에서 해야할 동작 구현
let request = VNRecognizeTextRequest { request, error in }

 

 

VNImageRequestHandler내 사용되는 VNImageOption은 분석할 이미지의 추가적인 정보를 제공할 수 있음

 

  • VNImageOption.cameraIntrinsics:
    • 이미지가 촬영된 카메라의 내부 매개변수(camera intrinsic matrix)를 제공
    • 예를 들어, 얼굴이나 물체의 깊이, 크기 등을 분석할 때 카메라 렌즈의 초점 거리를 알고 있다면 더욱 정밀한 결과를 얻을 수 있음
  • VNImageOption.properties:
    • 이미지의 메타데이터를 제공
    • 이미지의 방향, 노출 정보 등의 메타데이터를 활용하여 분석 결과를 개선할 수 있다.

이미지 텍스트 분석

guard let observations = request.results as? [VNRecognizedTextObservation] else {
    return
}
let recognizedStrings = observations.compactMap { observation in
    return observation.topCandidates(1).first?.string
}

 

 

https://developer.apple.com/documentation/vision/vnrecognizedtextobservation

 

observations는 VNRecognizedTextObservation 배열로, 이미지에서 인식한 텍스트에 대한 정보를 담고 있음

  • topCandidates(1)를 통해 인식된 텍스트 후보 중 가장 가능성 높은 결과를 가져오며, 최대 10개까지의 후보군들을 가져올 수 있다.
if #available(iOS 16.0, *) {
	// VNRecognizeTextRequestRevision3를 설정하여 최신 버전의 텍스트 인식 알고리즘을 사용
    // 다만 iOS 16부터 사용 가능
	let revision3 = VNRecognizeTextRequestRevision3
	request.revision = revision3
    // 인식의 정확도 
    // .accurate는 더 정확한 인식을 수행하지만 더 많은 시간이 소요됨. .fast는 반대
	request.recognitionLevel = .accurate
    // 인식할 언어 설정
    // revision에 따라 지원 언어가 달라짐. 아래 참고
	request.recognitionLanguages = ["ko-KR"]
    // 언어 교정 기능
	request.usesLanguageCorrection = true
 } else {
 	request.recognitionLanguages =  ["en-US"]
	request.usesLanguageCorrection = true
 }

 

16 이상 지원 언어

  • ["en-US", "fr-FR", "it-IT", "de-DE", "es-ES", "pt-BR", "zh-Hans", "zh-Hant", "yue-Hans", "yue-Hant", "ko-KR", "ja-JP", "ru-RU", "uk-UA", "th-TH", "vi-VT"]

16 미만 언어 

  • ["en-US", "fr-FR", "it-IT", "de-DE", "es-ES", "pt-BR", "zh-Hans", "zh-Hant"]

주의할 점은 VNRequestTextRecognitionLevel을 fast로 설정했을 땐 알고리즘이 Revision3여도 인식 지원 언어가 제한된다

  • accurate: ["en-US", "fr-FR", "it-IT", "de-DE", "es-ES", "pt-BR", "zh-Hans", "zh-Hant", "yue-Hans", "yue-Hant", "ko-KR", "ja-JP", "ru-RU", "uk-UA", "th-TH", "vi-VT"]
  • fast: ["en-US", "fr-FR", "it-IT", "de-DE", "es-ES", "pt-BR"]

VNRequestTextRecognitionLevel 관련 내용

https://stackoverflow.com/questions/58219769/which-languages-are-available-for-text-recognition-in-vision-framework

 

Which languages are available for text recognition in Vision framework?

I'm trying to add the option to my app to allow for different languages when using Apple's Vision framework for recognising text. There seems to be a function for programmatically returning the

stackoverflow.com

 

핸들러 실행

do {
    try handler.perform([request])
} catch {
    print(error)
}

 

 

VNRecognizeTextRequestRevision2와 VNRecognizeTextRequestRevision3 인식도 비교 (accurate)

 

 

좌측이 Revison3, 우측이 Revison2다

 

구현 코드

guard let cgImage = image?.cgImage else {
	fatalError()
}

let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
let request = VNRecognizeTextRequest{ request, error in
	guard let observations = request.results as? [VNRecognizedTextObservation],
				error == nil else {
		return
	}
	
	let text = observations.compactMap({
		$0.topCandidates(1).first?.string
	})
	
	print(text)
}

if #available(iOS 16.0, *) {
	let revision3 = VNRecognizeTextRequestRevision3
	request.revision = revision3
	request.recognitionLevel = .accurate
	request.recognitionLanguages =  ["ko-KR"]
	request.usesLanguageCorrection = true
} else {
	let revision2 = VNRecognizeTextRequestRevision2
	request.revision = revision2
	request.recognitionLevel = .accurate
	request.recognitionLanguages =  ["ko-KR"]
	request.usesLanguageCorrection = true
}

print(try! request.supportedRecognitionLanguages())

do {
	try handler.perform([request])
} catch {
	print(error)
}

 

'iOS > Swift' 카테고리의 다른 글

[Swift] UITableView, UICollectionView Last IndexPath  (1) 2023.12.05
[iOS] View Drawing Cycle (Layout까지 작성함)  (0) 2022.08.07
[Xcode] 단축키 좀 써주세요...  (0) 2022.08.06
[Swift] defer  (0) 2022.06.10
[Swift] mutating  (2) 2022.05.08

댓글