はじめに
Cloudmersiveの画像加工APIが面白そうだと、お友達に教えていただいたので試してみました。
タイトルのとおり、画像の中で「顔」を検出して、一部にぼかしを入れて、元の画像にオーバーレイするところをめざします。
自動で顔をぼかします。 PowerAutomateで13:57:14 pic.twitter.com/sUogMzyMky
— Hiro (@mofumofu_dance) July 7, 2020
ちょっと数式を使いますので、図が多め。Logic Apps/Automateの式はちゃんと書きます。
DocsよりもCloudmersive側のリファレンスの方が分かりやすいので、参考にしてみてください。
準備
今回はPower Automateで手動トリガーにしています。 実行時の入力として、ファイルを2つ設定しました。
また、画像加工の都合上、ある程度大きな 透明なだけの画像が必要になります。
この画像の横幅と高さを変数として設定しておきます。
STEP1 : 顔の検出とくりぬきとぼかし
トリガーで入力した画像ファイルから自動で顔の座標を検出してくれます。
顔は複数ありうるので、"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'])
として、アクションのインプットを指定します。
STEP2 : 透明な画像とくっつける
くり抜いてぼかした結果を透明画像と合成します。
この際、Locationはcenter にします。
STEP3 : うまくSTEP2の画像をくりぬく
上図の赤枠線の部分でくり抜くようにサイズ、座標を指定します。
ポイントはくり抜きの座標と幅・高さです。
これには少し数式を使います。
左上の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で表現したものです。
STEP4 : 元の画像と合成
最後にSTEP3でくり抜いた画像 (ぼかした顔入りの大きめの透明画像) と元の画像を、Locationをtop-leftで合成 したら完成です。