Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

日本語OCRによる文字認識
~WPFなどの.NET FrameworkアプリやUWPアプリからWindows 10のOCRエンジンを使う

UWPアプリ開発の最前線 第4回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2018/04/11 14:00

 画像から日本語の文字を読み取るOCR(光学式文字認識)機能が、無料で使えるとしたら? 作れるアプリの範囲が大きく広がるでしょう。今回は、Windows 10に標準で備わっているOCRエンジンをアプリから利用する方法を解説します。タイトルにあるように、Windows FormsやWPFなどの.NET Frameworkアプリからも使えます。

目次
  • 適用バージョン:Windows 10 version 1507(build 10240)以降

はじめに

 OCR機能を組み込めたら、どんなアプリが作れるでしょう?

  • 名刺や葉書からデータを取り込む住所録アプリ
  • レシートや領収書などからデータを取り込む家計簿アプリ
  • 印刷された書類などをテキストデータ化するアプリ
  • 商品名を読み取って通販サイトを検索するアプリ
  • 電柱などの住所表示を読み取って現在地を検索するアプリ

 いろんなアプリのアイデアが浮かんでくることでしょう。でも、市販されている日本語OCRライブラリは、けっこうなお値段がするので、個人開発者のレベルではちょっと使いにくいのです。そのようなライブラリは、辞書を使って読み取り精度を高めていたり、帳票の罫線を認識して誤認識を減らす工夫がしてあったりと、魅力的ではあるのですが。あるいは、最近になってメジャーどころも参入してきたOCRのWebサービスを利用するという手もあります。MicrosoftのComputer Vision APIGoogleのCloud Vision APIなどです。例に挙げたこれら2つは、月間の利用回数が少なければ無料なので、とっつきやすいです。

 OCRのWebサービスは、安くなってきたとはいうものの完全無料ではありません。インターネットに接続していなければ使えないという弱点もあります。デバイス単独で使える無料の日本語OCRライブラリはないものでしょうか? じつは、いくつかあります。そして、あまり知られていないようなのですが、Windows 10には標準で「OCRエンジン」が搭載されているのです。OCRエンジンはUWP(Universal Windows Platform)のAPIですが、WPFなどの.NET Frameworkアプリからも利用できます。

 今回は、UWPアプリが登場したときからあったので「最前線」というわけではありませんが、Windows 10のOCRエンジンを使う方法を解説します。

Windows 8.1から使えた"OCR Library for Windows Runtime"

 WindowsのOCRライブラリは、じつは2014年の9月に導入されました。Windows 8.1の時代です。当時はOS標準ではなく、NuGetから開発環境にライブラリをインストールする必要がありました。

 それから3年半。久しぶりに使ってみましたが、Windows 10になってそれほど読み取り精度が上がったという感じは残念ながらあまりしませんでした(日本語/英語とも)。辞書による補正もいまだにやっていない感じで、市販の日本語OCRソフトに比べるとずいぶん見劣りしてしまいます。日本語文書の読み上げに使うのはまだちょっと苦しい感じで、今のところは入力補助(読み取った後の手修正が必須)として利用できる程度のレベルです(本文で例に挙げた2つのWebサービスも同程度という感じがしました)。これはおそらくですが、これまでは利用者が少なくて、ということは苦言を呈する顧客はもっと少なくて、あまり熱心には改良されてこなかったのじゃないかと想像したくなります。Computer Vision APIや本稿のOCRエンジンの利用が増え、それに伴うフィードバックも多くなれば、改良も加速されていくと思います。

対象読者

  • .NET FrameworkでWindows用のアプリを作っている開発者
  • UWPアプリの開発者

必要な環境

 サンプルコード(GitHub)を試してみるには以下の環境が必要です。

  • Windows 10
  • Visual Studio 2017(無償のCommunity Editionで可)
  • UWP用Windows 10 SDK:C#/VB用のもの

どんな機能なのか?

 サンプルコード中のWPFアプリを実行している画面を次に示します。

取り込んだ画像中の文字を読み取って右下のテキストボックスに表示している
Windows 10のOCRエンジンを使って日本語を読み取るWPFアプリ
テキスト:C#プログラマーのための 基礎からわかるLINQマジック!(拙著)

 取り込んだ画像の中の文字を読み取って右下のテキストボックスに表示しています。日本語の文字をそこそこの精度で読み取りできています。なお、画像の取り込みは、Windows 10標準のMediaCapture APIを使ってWebカメラから、あるいは、画像ファイルやクリップボードに入れた画像データからできるようにしてあります。

 日本語以外の言語も、Windows 10にその言語のランゲージパックをインストールしておけば、読み取れます(英語は既定で利用できます)。例えば、日本語を指定したまま英語の文章を読み取らせると、次の画像のようにちょっと芳しくありませんが……、

日本語指定ではアルファベットを漢字やカナに認識しようとする
日本語を指定したまま英文を読み取らせた(WPFアプリ)
テキスト:The Return of Sherlock Holmes by Arthur Conan Doyle

英語を指定して読み込ませれば、次の画像のように格段に精度が上がります。

英語指定ではアルファベットとして認識する
英語を指定して英文を読み取らせた(WPFアプリ)
テキスト:The Return of Sherlock Holmes by Arthur Conan Doyle(前出)

 読み取り結果には、文字として認識した領域の情報も入っています。サンプルコード中のUWPアプリの方には、その実装も入れてあります(次の画像)。

文字として認識した領域に半透明の緑色で四角形が表示されている
文字として認識した領域を緑色で表示(UWPアプリ)
テキスト:The Return of Sherlock Holmes by Arthur Conan Doyle(前出)

 WPFからOCRエンジンを使うには、画像データのフォーマットを変換する必要があってちょっと面倒です。UWPアプリでは、そんな必要もなく、簡単に使えます。また、Windows 10の最初からあるAPIなので、Windows 10 Mobile(スマートフォン)でも動作します(次の画像)。

Windows 10 Mobileでの表示
Windows 10 Mobileでも動く(UWPアプリ)
テキスト:C#プログラマーのための 基礎からわかるLINQマジック!(前出)

.NET FramworkアプリからWebカメラを利用する

 今回のWPFのサンプルコードではWindows 10標準のMediaCapture APIを使いましたが、Windows 7などでは使えません。Windows 10以前のWindowsでもWebカメラを利用するには、オープンソースのWPF: Webcam ControlOpenCVOpenCvSharpなどを使うと良いでしょう。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • biac(ばいあっく)

    HONDA R&Dで自動車の設計をやっていた機械屋さんが、技術の進化スピードに魅かれてプログラマーに。以来20年ほど、より良いコードをどうやったら作れるか、模索の人生。わんくま同盟の勉強会(名古屋)で、よく喋ってたりする。 Microsoft MVP (Windows Development)...

バックナンバー

連載:UWPアプリ開発の最前線

もっと読む

All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5