MainWindow.xaml.csで実際にプログラムから呼び出すところを作成します。プログラムの流れは下記のように非常にシンプルです。
これまでの連載で使用してきた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.