MoreBeerMorePower

Power Platform中心だけど、ノーコード/ローコード系を書いてます。

メモ:Cloudmersive Image コネクターを利用して、画像の顔に自動でぼかしを入れる

はじめに

Cloudmersiveの画像加工APIが面白そうだと、お友達に教えていただいたので試してみました。

タイトルのとおり、画像の中で「顔」を検出して、一部にぼかしを入れて、元の画像にオーバーレイするところをめざします。

ちょっと数式を使いますので、図が多め。Logic Apps/Automateの式はちゃんと書きます。

DocsよりもCloudmersive側のリファレンスの方が分かりやすいので、参考にしてみてください。

Cloudmersive API Console

準備

今回はPower Automateで手動トリガーにしています。 実行時の入力として、ファイルを2つ設定しました。

また、画像加工の都合上、ある程度大きな 透明なだけの画像が必要になります。

この画像の横幅と高さを変数として設定しておきます。

f:id:mofumofu_dance:20200708110728p:plain

STEP1 : 顔の検出とくりぬきとぼかし

f:id:mofumofu_dance:20200708111058p:plain

トリガーで入力した画像ファイルから自動で顔の座標を検出してくれます。

顔は複数ありうるので、"Faces" の配列で返ってきますが、面倒なので first(body('Detect_and_find_faces_in_an_image')?['Faces'])で最初の1個だけをとってCompose (作成)しておきます。

あと考えるのはくり抜きのサイズですね。

顔検出範囲が LeftX, RightX, TopY, BottomY の数値で取れますので、くり抜きのアクションでは素直に

左上のX : outputs('Compose')?['LeftX']
左上のY : outputs('Compose')?['TopY']
くり抜き幅 : sub(outputs('Compose')?['RightX'],outputs('Compose')?['LeftX'])
くり抜き高さ: sub(outputs('Compose')?['BottomY'],outputs('Compose')?['TopY'])

として、アクションのインプットを指定します。 f:id:mofumofu_dance:20200708111219p:plain

STEP2 : 透明な画像とくっつける

f:id:mofumofu_dance:20200708111951p:plain

くり抜いてぼかした結果を透明画像と合成します。

この際、Locationはcenter にします。

STEP3 : うまくSTEP2の画像をくりぬく

f:id:mofumofu_dance:20200708112232p:plain

上図の赤枠線の部分でくり抜くようにサイズ、座標を指定します。

ポイントはくり抜きの座標と幅・高さです。

これには少し数式を使います。

左上のX : div(sub(variables('width'),add(outputs('Compose')?['LeftX'],outputs('Compose')?['RightX'])),2)
左上のY : div(sub(variables('height'),add(outputs('Compose')?['TopY'],outputs('Compose')?['BottomY'])),2)
幅 : div(add(variables('width'),add(outputs('Compose')?['LeftX'],outputs('Compose')?['RightX'])),2)
高さ : div(add(variables('height'),add(outputs('Compose')?['TopY'],outputs('Compose')?['BottomY'])),2)

それぞれの数式はちょうど、下図の式をPower Automateで表現したものです。 f:id:mofumofu_dance:20200708112612p:plain

STEP4 : 元の画像と合成

最後にSTEP3でくり抜いた画像 (ぼかした顔入りの大きめの透明画像) と元の画像を、Locationをtop-leftで合成 したら完成です。

f:id:mofumofu_dance:20200708112909p:plain