iOS13から標準サポートされる文字認識

# はじめに
WWDC2019でios13から文字認識(OCR)が標準サポートになるとアナウンスがありました。使えそうな気がしたので、調べてみました。英語(アルファベット)や数字の認識ならば使えそう。日本語のサポートは...先なのかな???

# Appleから公開されている資料
WWDC2019で発表された資料がApple社から公開されています。英語ですが、[WWDC2019の動画](https://developer.apple.com/videos/play/wwdc2019/234/)とその中で使われているサンプルコードが３つ([[1]](https://developer.apple.com/documentation/vision/structuring_recognized_text_on_a_document), [[2]](https://developer.apple.com/documentation/vision/reading_phone_numbers_in_real_time), [[3]](https://developer.apple.com/documentation/vision/locating_and_displaying_recognized_text_on_a_document) )。動画では、何ができるか、どう実装できるかが話されています。詳細を知りたい方は、参照してみてください。動画中で使われているサンプルコードは、それなりに複雑で読むのが大変だったので、新規にサポートされる文字認識の部分を取り出して書いていきます。

# 実装
以下は、文字認識のコードです。UIImage(image)に入っている画像の文字認識を行います。選択できる項目は以下です。

- 文字認識のレベル (recognitionLevel)
今は、`.fast`と`.accurate`が選択可能です。
`.fast`は、リアルタイムで文字認識したい時、`.accurate`は、時間はかかるが、文字認識精度を高めたい時に選びます。

- 文字認識言語 (recognitionLanguages)
 文字認識の言語の選択。後で述べるサポートしている言語を指定できます。
 
- 言語ごとの訂正 (usesLanguageCorrection)
　文字認識時に言語に基づいた訂正を行うかどうかの選択です。

``` swift
let image: UIImage // このイメージの文字認識を行う
let cgImage = image.cgImage
let request = VNRecognizeTextRequest(completionHandler: self.recognizeTextHandler)

request.recognitionLevel = .accurate  // .accurate と .fast が選択可能
request.recognitionLanguages = ["en_US"] // 言語を選ぶ
request.usesLanguageCorrection = true // 訂正するかを選ぶ

let requests = [request]
let imageRequestHandler = VNImageRequestHandler(cgImage: cgImage,  options: [:])
try！ imageRequestHandler.perform(requests)
```

以下は、`VNRecognizeTextRequest`に渡すハンドラです。文字認識した結果が渡されます。
ここでは、認識した文字のみ表示していますが、認識結果のスコア(confidence)や文字認識の領域(boundingBox)も取得できます。

``` swift
func recognizeTextHandler(request: VNRequest?, error: Error?) {
    guard let observations = request?.results as? [VNRecognizedTextObservation] else {
        return
    }

    for observation in observations {
        let candidates = 1
        guard let bestCandidate = observation.topCandidates(candidates).first else {
            continue
        }
        print(bestCandidate.string) // 文字認識結果
        // bestCandidate.confidence // 文字認識のスコア
        // observation.boundingBox // 文字認識の領域
    }
}
```

# 文字認識できる言語の習得
文字認識できる言語は、`supportedRecognitionLanguages(for:revision:)`で取得できます。引数は、認識レベルとリビジョンの2つ。ドキュメントによると、認識レベルは、`.fast`と`.accurate`。リビジョンは、`VNRecognizeTextRequestRevision1`とのことです。
以下のコードでサポート言語が取得できます。

``` swift
let fast = try! VNRecognizeTextRequest.supportedRecognitionLanguages(for: .fast, revision: VNRecognizeTextRequestRevision1)
let accurate = try! VNRecognizeTextRequest.supportedRecognitionLanguages(for: .accurate, revision: VNRecognizeTextRequestRevision1)

print(fast)
print(accurate)
```  


# 参考文献
- [WWDC2019 Text Recognition in Vision Framework(動画)]
(https://developer.apple.com/videos/play/wwdc2019/234/)

- [サンプルコード(Structuring Recognized Text on a Document)]
(https://developer.apple.com/documentation/vision/structuring_recognized_text_on_a_document)

- [サンプルコード(Reading Phone Numbers in Real Time)]
(https://developer.apple.com/documentation/vision/reading_phone_numbers_in_real_time)

- [サンプルコード(Locating and Displaying Recognized Text on a Document)]
(https://developer.apple.com/documentation/vision/locating_and_displaying_recognized_text_on_a_document)


- [リファレンス(VNRecognizeTextRequest)]
(https://developer.apple.com/documentation/vision/vnrecognizetextrequest)