MaskOCR Documentation

ViewModel/MaskOCRFunction

画像を撮影し、文字解析する機能です。

https://github.com/daisukenagata/MaskOCR/blob/MaskOCRCamera/

prepareCamera()では、カメラポジションを設定しています。
beginSession()では、プレビュー画面を設定し、カメラセッションを準備します。beginSessionメソッド内にあるsetSampleBufferDelegateでは撮影に必要なバッファーにディスパッチキューを設定し、インターフェース接続をします。フレーム処理を同じキュー上で実行でき、これによりメモリー使用量を自動的に管理します。

VNRecognizeTextRequestでは、OCRの文字解析を設定します。
テキストの領域を検出し、画像に含まれるテキストを認識しリクエストするVNRecognizedTextObservationオブジェクトを生成します。初期化時に一度、VNRecognizeTextRequestを生成すると、2度目のリクエストから文字を取得するため、初期化時に設定しています。
addRecognizedTextメソッドでは、解析した文字をStringに文字設定します。
ocrSplitTextでは、指定した文字はスプリットしないようにします。
topCandidatesでは、スコアの減少順に並べ替えられた最大10個の上位N個の候補をocrTextに代入します。
captureOutputメソッドではsampleBufferのインターフェースが接続しているので、プレビューが表示されている間は呼ばれ続けます。写真を撮ったタイミングで、takePhotoがtrueになるので、sampleBufferから画像を取得し、クロージャーのchangeExecutionにimageを値を渡し、発行します。changeExecutionを設定しているクラスではimageを取得しつつ、スレッドが走ります。
getImageFromSampleBufferメソッドでは、写真を撮影したタイミングでcaptureOutputメソッドから実行し、sampleBufferからUIImageに変換します。
buffer->pixelBuffer->ciImageのキャスト。
pixelBufferでサイズを生成->imageRect
contextから、ciImageとimageRectを使用して、cgImageを生成し、
UIImageを作成しています。
processImageメソッドでは、撮影した画像分析要求を処理するオブジェクトをリクエストします。VNRecognizeTextRequestメソッドにて、OCRの文字解析を設定します。
recognitionLevelは認識レベルをテキスト認識中に使用される種類を選択します。認識精度よりも速度を優先するテキスト認識レベルオプションで、accurate = 0がデフォルトです。 
usesLanguageCorrectionは、認識プロセス中に言語修正を適用する必要があるか決定します。これを無効にすると、生の認識結果が返され、パフォーマンス上の利点は得られますが、結果の精度は低下します。

ViewModel/MaskedOCRGestureViewModel

画面を操作するジェスチャー機能を設定します。

MaskOCRGestureViewModelの初期化。MaskOCRGestureViewModelは指でなぞった際の領域から窓枠部分のサイズ計算をします。
MaskOCRLayerModelViewを取得し、gestureSetメソッドでジェスチャーで使用する機能を設定します。
panTappedActionメソッドでは、指の操作領域を決定し、指の操作アクションに応じて、画像サイズを決定します。gestureRecognizerメソッド内では、指の操作時に実行し、framePointに座標を代入し、cropEdgeForPointメソッド内で、タッチ箇所を算出します。

ViewModel/MaskOCRGestureViewModel

タップ領域から位置を判定し、Viewサイズを計算します。タップ領域から8種類の位置を決定します。
cropEdgeForPointメソッドでは、タップ領域から該当するポジションからタップパターンを決定します。sizeは内部エリアの24の領域にタップ時に反応するように設置しています。
updatePointメソッドでは、該当するパターンからサイズ、座標を計算し設定します。

ViewModel/MaskOCRLayerViewModel

lockImageMaskメソッドでは、フォーカスしたエリア以外をマスクします。getScreenShotメソッドでは、UIGraphicsBeginImageContextWithOptionsで指定されたオプションを使用して、ビットマップベースのグラフィックコンテキストを作成します。UIGraphicsGetImageFromCurrentImageContextで、現在のビットマップベースのグラフィックスコンテキストのコンテンツから画像を返します。UIGraphicsEndImageContextメソッド内で、現在のビットマップベースのグラフィックスコンテキストをスタックの最上位から削除した後にimageViewのimageに値を設定します。

UI/MaskOCRLayerModelView

プレビュー画面以外のViewSizeを設定します。

MaskOCRGestureViewModelを初期化します。MaskOCRGestureViewModelはタップ領域をパターン、サイズを計算します。
MaskOCRLayerModelを初期化します。MaskOCRで表示するViewを管理します。
MaskOCRGestureActionViewModelを初期化します。MaskOCRGestureActionViewModelはジェスチャー動作からViewSizeを計算するプロパティ、メソッドを決定します。
designInitメソッドでは、imageResize()メソッドを使用し、imageViewの初期化をします。frameResizeメソッドでは、AVMakeRectを使用して、プレビューサイズとimageViewのimageのサイズを合わせます。
撮影の連打をしても、一定のメモリーを維持し、Viewの描写も一定を保ちます。

UI/MaskOCRCALayerView

プレビュー画面を管理します。

UI/MaskOCRExtension+View

SwiftUIのViewの表示、非表示する機能を使用する拡張メソッドです。

UI/MaskOCRHhollowTargetLayer

UIViewのフォーカス機能です。

CALayerはフォーカスの外枠を管理します。
CAShapeLayerは全体としての形状は、レイヤー間で合成されます。maskレイヤーです。UIBezierPathは切り抜く始点と終点のを決定します。
toriメソッドでは、フォーカスデザインを表現しています。
gesture.lineView.layerではフォーカス境界線を白線で表現します。
pathにはgesture.lineViewのサイズを取得し、mask領域を設定し、maskLayerのサイズを最終決定します。
maskLayerは指定された領域からhollowTargetLayerをmaskします。
hollowTargetLayerは指定された領域全体を覆います。
MaskOCRLayerModelViewでhollowTargetLayer領域を設定しています。

UI/MaskOCRBackView

撮影した画像を表示します。

Modifier/MaskOCRHiddenModifier

SwiftUIのViewを表示、非表示にする機能です。