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 관련 내용
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' 카테고리의 다른 글
Existential Type (any) (0) | 2025.03.02 |
---|---|
[Swift] Opaque Types (0) | 2025.02.22 |
[Swift] UITableView, UICollectionView Last IndexPath (1) | 2023.12.05 |
[iOS] View Drawing Cycle (Layout까지 작성함) (0) | 2022.08.07 |
[Xcode] 단축키 좀 써주세요... (0) | 2022.08.06 |
댓글