이번 최종 프로젝트 때 VisionKit
과 OCR
를 사용하게됐다
해당 기술을 사용하기에 앞서 처음 접해보는 기술이어서
먼저 공부하며 알아보려고 한다!
우선 알아봐야할 프레임워크는 VisionKit
과 Vision
이 두개다.
VisionKit은 Apple에서 개발한 OCR Api
Vision 프레임워크는 다양한 이미지 분석 기능을 제공하며, 다음과 같은 최신 기술들을 내포하고 있습니다:
VisionKit은 문서 스캔을 주로 다루며, 다음과 같은 최신 기술들을 포함하고 있습니다:
따라서, 두 프레임워크는 각각의 용도에 맞게 최신 기술을 내포하고 있으며, 특정 작업에 대해 더 적합한 기술을 제공할 수 있습니다. 문서 스캔과 이미지 보정을 필요로 하는 경우 VisionKit이, 이미지 분석과 텍스트 인식을 필요로 하는 경우 Vision이 적합합니다.
사용하는 방식은 크게 다음과 같은 단계로 이뤄집니다.
<key>NSCameraUsageDescription</key>
<string>이 앱은 문서 스캔을 위해 카메라를 사용합니다.</string>
허가를 해줘야 카메라를 사용할 수 있습니다!
info.plist 파일에 작성해줍니다
import VisionKit
import Vision
라이브러리가 있어야 기능을 사용할 수 있겠죠?
사용하려는 뷰컨트롤러에 Import 해줍니다
// Get the CGImage on which to perform requests.
guard let cgImage = UIImage(named: "snapshot")?.cgImage else { return }
VNImageRequestHandler
에서 이미지 인식 요청을 하므로
UIImage를 cgImage로 변경해줘야한다.
return 자리에는 에러처리가 추가될 수 있다.
// handler 인스턴스 생성
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
// request 인스턴스 생성
let request = VNRecognizeTextRequest{ [weak self]request, error in
guard let observations = request.results as? [VNRecognizedTextObservation],
error == nil else{
return
}
// 한 줄이 끝나는 부분마다 \n
let text = observations.compactMap({
$0.topCandidates(1).first?.string
}).joined(separator: "\n")
// ui 변경은 main thread에서만 가능
DispatchQueue.main.async {
self?.label.text = text
print(text)
}
}
VNRecognizeTextRequest 클래스의 인스턴스가 클로저를 매개변수로 하여 생성됩니다. 클로저는 텍스트 인식이 완료되었을 때 호출되는 콜백을 정의합니다.
VNRecognizeTextRequest
는 여러가지 설정을 해줄 수 있습니다
우선 코드부터 보실까요
if #available(iOS 16.0, *) {
let revision3 = VNRecognizeTextRequestRevision3
request.revision = revision3
request.recognitionLevel = .accurate
request.recognitionLanguages = ["ko-KR"]
request.usesLanguageCorrection = true
do {
let possibleLanguages = try request.supportedRecognitionLanguages()
print(possibleLanguages)
} catch {
print("Error getting the supported languages.")
}
} else {
// Fallback on earlier versions
request.recognitionLanguages = ["en-US"]
request.usesLanguageCorrection = true
}
위 코드에선 버전, 정확도, 번역할 언어를 설정했다.
그리고 do 구문에 있는 supportedRecognitionLanguages()
함수는 호출시
번역 가능한 언어를 출력해 확인할 수 있다.
// handler 동작
do{
try handler.perform([request])
} catch {
// 에러 처리
label.text = "\(error)"
print(error)
}
생성해준 handler, request를 동작한다