LoginSignup
36
22

More than 1 year has passed since last update.

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

Last updated at Posted at 2019-06-24

はじめに

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

Appleから公開されている資料

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

実装

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

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

  • 文字認識言語 (recognitionLanguages)
    文字認識の言語の選択。後で述べるサポートしている言語を指定できます。

  • 言語ごとの訂正 (usesLanguageCorrection)
     文字認識時に言語に基づいた訂正を行うかどうかの選択です。

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)も取得できます。

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とのことです。
以下のコードでサポート言語が取得できます。

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

print(fast)
print(accurate)

参考文献

36
22
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
22