先日このようなツイートをしました。
めっちゃオモロイ /
ポール・モーリアのように顔を出したい https://t.co/52PqKOJN9O #DPZ— しまぶ (@shimabox) May 17, 2019
はぁ、尊い。ナイスアイディア。
これも一種のエンジニアリングなのでは?自分もこういったものを作ってみたい!!
と思い悩んだ末に思い出したのです、、こういった顔認識を使ったものを作っていたことを、、
- shimabox/face_recognition_with_clmtrackr: Sample of face recognition with clmtrackr.js
- shimabox/henohenomohe-js: Face recognition with clmtrakr.js and draw Henohenomoheji(Japanese style Emoji).
- shimabox/v2c: Video(webcam) to canvas.
※ 顔認識は auduno/clmtrackr: Javascript library for precise tracking of facial features via Constrained Local Models に依存しています
そして、これらを組み合わせたら、ポール・モーリアっぽいのイケるのでは?と閃いたのであります。
これぞまさに、「点」と「点」がつながって「線」になる瞬間。
というわけで作ってみました。
https://github.com/shimabox/PaulMauriat-generator
遊び方
まずは https://shimabox.github.io/PaulMauriat-generator/ にアクセスします。
- ボーダーで囲まれたエリアをクリックして画像を選択するか、画像をドロップします
- カメラへのアクセスを許可します
- 顔認識が行われるので顔が捉えられたら画面右上にワイプのように顔が映し出されます
※ 顔の認識がうまくいかない場合は少し顔を離したり調節してみてください
※ メガネもけっこう顔認識には辛いかも
※ 後述しますが顔の位置は、右上, 左上, 右下, 左下 と選択できます - あとはポール・モーリアのようになりきったりして遊びます
※ 画像のダウンロードも可能です
※ iOSの場合別タブで画像が開くのでそれを長押しして保存してください
UIについて
- 画像の再選択が可能です
- 顔認識を開始します
- 顔認識を停止します
※ コツとして、ここだ!!という場面で停止してからダウンロードするといいです - 画像(png) としてダウンロードします
- フロント(前面)カメラと、リア(背面)カメラを切り替えます
- 顔の位置を 右上(Top, Right), 左上(Top, Left), 右下(Bottom, Right), 左下(Bottom, Left) と選択できます
- 顔の透明度を調整できます
からくり
当アプリがどういった仕組みになっているか、画面構成について軽く解説してみます。
4つのレイヤー
当アプリではざっくりと4つのレイヤーを用いています。
1. videoレイヤー(Webカメラからの映像)
2. videoの映像を映すcanvasレイヤー
3. 選択した画像をcanvas化したレイヤー
4. 2.で映し出したcanvasから顔部分を描画したcanvasレイヤー
これら4つのレイヤーを以下の通りに重ねて表現をしています。
これらの部分に一番上であげたライブラリーが活用されています。
UIに関しては、display:flex
系のflexレイアウト
を活用しています。便利ですねー。
キャプチャの部分に関しては、3.
と4.
のレイヤーを出力させています。
というわけでなにも考えずに愚直にゴリゴリと描画を行っているので、負荷は半端ないです。
clmtrackr
での顔認識がどうしても負荷がかかるので致し方ないのかなとは思いますが、その他の部分でどうにかならんかなぁと考えてはいます。
課題
今一番の課題は描画時のジャギーが、ひどいというものです。
もっとクリアに画像を表示したり、ポール・モーリアを出現させたい。
※ 自分の、Pixel3/chrome は結構ジャギーがひどい
drawimage アンチエイリアス
でググった結果になにか解決策があるのでは?と踏んではいるのですが、まずは公開が先だということで手付かずです。
(このへんちょっと試してみたりしたのですけども、わけわからんし時間がかかりそうなのでいったん止めました)
あとは、ポール・モーリア部分の透け感をもっとうまく表現したいところです。
中心はあまり透けさせずに周りだけを透けさせると先に挙げた記事に近づくのではないかと思うのですが、どうしたらいいんかなと。
現状の実装だと全体を透けさせて周囲をボカしてそれっぽくしているだけなのでちょっと無理矢理感がありますね。
なので、スライダーを用意して調整(ごまかし)できるようにしたりしています。
強い人、いいアイデア、PRください。お願いします。
このアプリを作る上で参考にさせていただいた記事
- JavaScript で Exif の Orientation をパースして画像を正しく表示する方法 – Qiita
- スマホで撮った際によくある画像の向き問題をこれで解決しました。ライブラリ使わずに済んで最高。
おわりに
普段の業務に全く関係のないものを作るのは最高に楽しいですね。
(普段はみんなが愛してやまないPHPをひたすら書いています)
クオリティは低いかもしれませんが、もしよかったら遊んでみてください。
リア(背面)カメラが使えれば他人でも顔の写った画像でもポール・モーリアできます。
というわけで、最高のポール・モーリアを作ってくれ!!
(作った画像を#ポールモーリアジェネレーター
,#paulmauriat-generator
で共有してくれるとうれしいです)
なお、「恋はみずいろ」 をまだ聴いていないので聴いてみます。
おまけ (こんな画像がつくれます)
※ 目線は入れさせていただいています
子供を愛でる
ブチャ○ティ
きれいなエッフェル塔に感心
©Pete LinforthによるPixabayからの画像