前回、顔検出アプリをつくる上で必要なファイルのアップロードの処理を実装することができたので、今回はAzure.CognitiveServicesをつかって顔検出アプリを完成させます。

動作確認はこちらからお願いします。

準備

まずnpmで以下をインストールします。

そして以下をapp.jsに追加します。

最初に前回のmain関数を示します。これによると/face-testにアクセスされたときと/face-resultにPostされたときの処理をすれば顔検出の処理ができるということになります。

画像をアップロードするフォームを表示させる

/face-testにアクセスされたときはGetResponseFaceTest関数が呼び出されます。また/face-resultにPostされたときはGetResponseFaceResultが呼び出されます。

GetResponseFaceTest関数を示します。これは顔検出したいファイルをアップロードするためのフォームを表示させます。

顔検出の結果を表示させる

次にフォームのアップロードボタンが押されたときの処理を示します。

まずアップロードされたファイルのパスを取得します。これはreq.file.pathで取得できます。もしファイルが指定されていないのであれば「ファイルが選択されていません」と表示させます。

画像ファイルのなかの顔を検出するのはDetectFaceExtract関数です。アップロードされたファイルが画像ファイルではない場合、例外が発生するので例外処理をしています。

DetectFaceExtract関数が正常に終了した場合、検出されたFaceオブジェクトが返されるので、これをGetFacesResultContent関数に渡します。これは引数で渡されたオブジェクトから顔の位置や状態(感情:喜んでいるとか怒っているなど)を取得して、表を作ります。それから検出された顔を矩形で囲んだ画像を表示させます。

これらの処理が終了したら結果をページに表示します。

顔検出するDetectFaceExtract関数

DetectFaceExtract関数は顔を検出したらオブジェクトを返します。

dataUrlとTableタグで結果を表示

顔検出のオブジェクトが取得されたら、GetFacesResultContent関数を実行して顔オブジェクトから顔部分を矩形で囲んだ画像と顔の情報をTableタグを使って表示させるための文字列を取得します。

顔として検出された部分に矩形を描画

前回のファイルパスからdataUrlを生成する関数を修正します。矩形の配列を第二引数に渡すとその部分に矩形を表示させます。

まず矩形の描画で必要なクラスを示します。GetFacesResultContent関数の第二引数からは矩形の左上の座標と幅と高さしか取得できませんが、ここから右の座標と下の座標は計算できます(GetRight関数とGetBottom関数)。このクラスのインスタンスから取得された情報で矩形を描画します。

一部修正したGetDataUrl関数を示します。第二引数がnullまたはundefinedのときは単にdataUrlを返すだけです。第二引数が存在する場合は矩形をDrawRectangles関数を呼び出して矩形を描画します。

矩形を画像のなかに描画するDrawRectangles関数を示します。矩形を描画する方法がわからなかったので、setPixelColor関数で1ピクセルずつ線の幅は3ピクセルになるように処理をしています。

顔の属性をTableタグで表示

顔の属性を表示させるためのTableタグを生成するGetTableText関数を示します。