VisionKit을 사용한 OCR 기술 구현
이미지 분석 등의 과정을 처리할 핸들러 구현
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
}
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 관련 내용
핸들러 실행
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 |
댓글