📝

.NET 5, F# - Windows.Media.Ocr を使う

2021/04/18に公開

Windows.Media.Ocr

Windows.Media.Ocr [↗] は、画像からテキストを読み取る光学文字認識 (OCR: Optical character recognition) を行う Windows Runtime API です[1]

環境

対象 バージョン
Windows 20H2 (19042.928)
.NET SDK 5.0.202

実装例

指定した画像ファイルからテキストを読み取り表示するサンプルです。

.fsproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0-windows10.0.19041.0</TargetFramework>
    <RootNamespace>プロジェクト名</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <Compile Include="Program.fs" />
  </ItemGroup>

</Project>
Program.fs
let await (iAsync: Windows.Foundation.IAsyncOperation<'TResult>) =
    System.WindowsRuntimeSystemExtensions.AsTask(iAsync).Result

let printOcrResult () =
    let ocrEngine = Windows.Media.Ocr.OcrEngine.TryCreateFromUserProfileLanguages()

    let storageFile         = await <| Windows.Storage.StorageFile.GetFileFromPathAsync(@"画像ファイルの絶対パス")
    let iRandomAccessStream = await <| storageFile.OpenAsync(Windows.Storage.FileAccessMode.Read)
    let bitmapDecoder       = await <| Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(iRandomAccessStream)
    let softwareBitmap      = await <| bitmapDecoder.GetSoftwareBitmapAsync()
    let ocrResult           = await <| ocrEngine.RecognizeAsync(softwareBitmap)

    printfn "%s" ocrResult.Text

printOcrResult()

解説

Windows Runtime API の参照

.NET 5 の場合 は .fsproj ファイル内、TargetFramework の値に Windows のバージョンを示す下記の文字列を設定します。

ターゲット
Windows 10 Version 1809 net5.0-windows10.0.17763.0
Windows 10 Version 1903 net5.0-windows10.0.18362.0
Windows 10 Version 2004 net5.0-windows10.0.19041.0

言語の設定

選択できる言語は Windows の言語パック [↗] に依存しています。

使用可能な言語の一覧を表示する

let languages = Windows.Media.Ocr.OcrEngine.AvailableRecognizerLanguages

for l in languages do
    printfn "%s: %s" l.LanguageTag l.DisplayName

使用可能な言語を自動で設定する

let ocrEngine = Windows.Media.Ocr.OcrEngine.TryCreateFromUserProfileLanguages()

言語を明示的に設定する

言語タグ (BCP47) で指定します。

let language  = new Windows.Globalization.Language("en")
let ocrEngine = Windows.Media.Ocr.OcrEngine.TryCreateFromLanguage(language)

非同期処理

Windows Runtime API の非同期メソッドが返す IAsyncOperation<TResult> [↗] の結果を取得するために Task<TResult> [↗] に変換します[2]

let await (iAsync: Windows.Foundation.IAsyncOperation<'TResult>) =
    System.WindowsRuntimeSystemExtensions.AsTask(iAsync).Result

または

open System

let await (iAsync: Windows.Foundation.IAsyncOperation<'TResult>) =
    iAsync.AsTask().Result

end

脚注
  1. Windows 10 にて標準搭載。
    NuGet 版: Microsoft.Windows.Ocr [↗] ↩︎

  2. 意訳: .NET では IAsyncOperation<TResult> を Task<TResult> に変換すると便利。
    https://docs.microsoft.com/ja-jp/uwp/api/windows.foundation.iasyncoperation-1#remarks ↩︎

GitHubで編集を提案

Discussion