連載
» 2017年06月15日 05時00分 公開

画像/動画認識のComputer Vision APIをOCRとして使うには? フォントごとの精度は?認識系API活用入門(5)(3/4 ページ)

[岩本禎史,株式会社クロスキャット]

処理の作成

 MainWindow.xaml.csで実際にプログラムから呼び出すところを作成します。プログラムの流れは下記のように非常にシンプルです。

  1. 画像ファイルを選択する
  2. OCR機能のAPIに画像ファイルを渡し、テキスト(JSON形式)を取得する

 これまでの連載で使用してきたAPIと違う点は、Tokenを使用しないということです。これまでの連載で使用してきたAPIではOcp-Apim-Subscription-KeyをToken取得専用のエンドポイントに投げてTokenを先に取得し、その後にAPIにTokenを含めたリクエストヘッダーを生成してリクエストを投げる、というやり方でした。それに対してComputer Vision APIでは、Tokenを取得せずに直接APIにOcp-Apim-Subscription-Keyを渡すようになっています。

 今回は、OCR機能のAPIから返ってくるデータがJSON形式なので、まずはこのJSON形式で返ってくるデータを受け取るためのクラスを作成します。以下のように、メニューバーの「プロジェクト」から「クラスの追加」をクリックします。

「クラスの追加」をクリック

 追加するのは通常のクラスです。名前を「OCRResult.cs」として「追加」ボタンをクリックします。

クラスの追加

 クラスが追加されたら、以下の内容をコピーして、そのクラスにペーストしてください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
// 追加
using System.Runtime.Serialization;
 
namespace ComputerVisionAPI
{
    [DataContract]
    class OCRResult
    {
        [DataMember]
        public string language { get; set; }
        [DataMember]
        public float textAngle { get; set; }
        [DataMember]
        public string orientation { get; set; }
        [DataMember]
        public Region[] regions { get; set; }
 
        [DataContract]
        public class Region
        {
            [DataMember]
            public string boundingBox { get; set; }
            [DataMember]
            public Line[] lines { get; set; }
        }
 
        [DataContract]
        public class Line
        {
            [DataMember]
            public string boundingBox { get; set; }
            [DataMember]
            public Word[] words { get; set; }
        }
 
        [DataContract]
        public class Word
        {
            [DataMember]
            public string boundingBox { get; set; }
            [DataMember]
            public string text { get; set; }
        }
 
    }
}

 続いて、画像ファイルを渡してテキストを取得する処理です。APIのリクエストメソッドはPOSTになります。OCR機能のAPIでは、リクエストのパラメーターとして以下の値がありますが、どちらもオプション扱いです。

名前 必須 説明
language オプション String 言語コード(en、jaなど)
既定はunk (自動識別)
detectOrientation オプション Boolen 文字の方向を検知するか

 またリクエストヘッダーとして以下の値を設定します。

名前 必須 説明
Content-Type オプション String 画像をURLで指定する場合はapplication/json、画像ファイルをバイナリ生データでアップロードする場合はapplication/octet-streamを指定
Ocp-Apim-Subscription-Key 必須 String Azure上で取得したキーを指定

 プログラムとしては以下のようになります。

        private OCRResult GetOCRResult(string pAccessKey, string pLanguage, string pFile)
        {
            try
            {
                string url = " https://westus.api.cognitive.microsoft.com/vision/v1.0/ocr";
                if(pLanguage != null && pLanguage != "") url += "?language=" + pLanguage;
 
                // リクエスト作成
                HttpWebRequest request = WebRequest.CreateHttp(url);
                request.Method = "POST";
                request.ContentType = "application/octet-stream";
                request.Headers.Add("Ocp-Apim-Subscription-Key", pAccessKey);
 
                // 画像ファイルの読み込み
                FileStream fs = new FileStream(pFile, FileMode.Open, FileAccess.Read);
                byte[] bs = new byte[fs.Length];
                fs.Read(bs, 0, bs.Length);
                fs.Close();
 
                Stream writer = request.GetRequestStream();
                writer.Write(bs, 0, bs.Length);
 
                WebResponse webResponse = request.GetResponse();
                Stream responseStream = webResponse.GetResponseStream();
 
                DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(OCRResult));
                OCRResult result = (OCRResult)dcjs.ReadObject(responseStream);
 
                return result;
 
            }
            catch(WebException webException)
            {
 
                Stream responseStream = webException.Response.GetResponseStream();
                StreamReader streamReader = new StreamReader(responseStream);
                tboxResult.Text = streamReader.ReadToEnd();
                return null;
            }
            catch(Exception exception)
            {
                tboxResult.Text = exception.Message;
                return null;
            }
 
        }

 最後に、コンストラクタやボタンクリック時のイベントを含むMainWindow.xaml.csはこちらのようになります(※クリックしてダウンロードできます)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。