Webカメラから自分の顔を検出して、顔だけを背景画像に重ねてみました。 Web会議アプリにWebカメラとして映像を渡せば、お手軽にWeb会議に顔を出せます。
小さい頃なりたかった(?)木の賢者にもなれます。
注)目伏せ追加機能はありません。 目伏せはこの記事のためにスクショに後から手加工で追加しました。
課題
3月上旬から在宅でWeb会議ざんまいの日々になってます。
あまりに部屋が汚いのでビデオはなしで、音声と画面共有だけでなんとかやってきました。でもやはりWeb会議だけでは今までの信頼貯金を取り崩している気がします。たまに顔を映してくれる人がいると、とても嬉しく思ってる自分がいます。自分も顔出したい。 でも部屋が狭いし汚すぎる!
普通は諦めて部屋を片付けたてきれいにするか、グリーンスクリーンを設置してクロマキー合成でビデオにするのでしょう。でもやっぱり片付けられない。。。
会社で広く使われているWeb会議システムはWebExです。 Zoomのように背景変換機能はないし、Teamsのようにすぐ開発してくれる気がしない。。。 Zoomもたまに使ってるけど、マシンパワーが足りなくてグリーンスクリーン必須。でもグリーンスクリーンを設置する場所もない。。。
妄想
そういえばZoomは顔だけじゃなくて、手や上半身を背景から切り出している。だからヘビーな処理が必要なのか??
顔検出だけと割り切れば非力なPCでもそんなに負荷なくできるはず!?
構想
こんな感じ。
Webカメラ --> OpenCVで顔領域検出 --> 顔領域だけ取り出して背景画像に重ね合わせ --> Webカメラの映像として出力 --> WebExやZoomで利用
このブログ記事を見るとやはりOpenCVでFace detectionはすぐできそう。
切り出しや重ね合わせはPython Imaging Library (Pillow)でやったことある。
1秒間に5回ぐらい処理できれば、Web会議で使うには十分な映像になるはず。
さて、作った画像をWebカメラの映像として出力するのはどうしたらいいか? OpenCVにそんな機能はなさそう。PythonからもMacやWindowsで使えるライブラリは見つからず。
あまりスマートではないけど、MacOSならCamTwistで画面の一部をキャプチャーして他のソフトにWebカメラとして認識させて渡すことができるらしい。
やってみた
コードをGitHubに上げておきました。
自分が書いた部分はPythonですが、OpenCVとQtを利用しています。
GW中なのでまだ実戦投入してません。早く次のWeb会議にならないかなぁ。