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はこちらのようになります(※クリックしてダウンロードできます)。
ボットにCognitive Servicesを組み込んでみる
米IBMがビッグデータ分析基盤サービスを拡充、コグニティブコンピューティングの研究成果も搭載
Google Cloud Vision APIのパブリックβ版が公開Copyright © ITmedia, Inc. All Rights Reserved.