Webカメラで、シビアすぎる「だるまさんがころんだ」

人や物の動きを検知

前回に続いて、今回もOpenCVを使ったデモです。Lucas-Kanade法を使った移動物体のトラッキングをご紹介します。

トラッキングにより、Webカメラに映っている人や物の動きを、コンピューターが検知できるようになります。例えば、寝ている赤ちゃんがグズった時に親のスマホに通知したり、マウスやタッチパネルに触れることなく、画面を操作するようなアプリが作れるという事です。

Lucas-Kanade法は、有名なトラッキング手法の一つです。ざっくり説明すると、この手法は、動画のフレーム画像の個々の画素(ピクセル)の色や明るさが、時間と共にどの方向へ移動していくのか探索することで、物体の動きを把握しようとします。

こんな感じになりました

左上に、動いた方向が表示されています。赤い線が、追跡できた動きです。この動画の終盤を見て分かる通り、1センチ程度の震えでも、コンピューターに検出されてしまいます。もしこれを使って「だるまさんがころんだ」遊びをすると、きっと、最初に鬼が振り向いた瞬間に全員つかまります。

デモを作っていて分かったこと

探索精度よりも、ノイズの除去が大事

人が写るくらいの距離で撮ったビデオや写真には、探索に使用できるピクセルパターンが山ほどあります。なので、探索精度をいくら向上させても、ノイズだらけで役には立ちません。人の動きを期待どおりに検知するには、ノイズをきちんと除去する事が大切でした。

試行錯誤した結果、思い切ってフレーム画像を1/10まで縮小してから処理させてみると、ノイズを9割がた消してくれるようになりました。残り1割は、ローカット(閾値よりも動きの小さい線を除外)して対処しました。

縮小することで、処理画素数が減ってCPU処理コストも下がって一石二鳥でした。

光源の向きにも気を配る

光源の向きにも気を配る必要があります。コンピューターは、顔や手など、特徴的な見た目の物体をトラッキングするのは得意ですが、壁のような一様でのっぺりした物体は苦手です。特に顔の動きを追跡しようとするとそうなのですが、逆光になってしまうと、カメラから目、鼻、口の輪郭が捉えにくくなり、精度がガクッと落ちます。

今後の課題

今回は、誰もいない部屋でデモしました。もし、屋外や、パーティー会場など、絶えず何かが動いているような場所でデモしたとすると、これほどの精度は出せないかも知れません。

また、普通のWebカメラではなく、赤外線カメラやKinnect などの深度カメラを使うと、どれくらい精度が上がるのかも気になるところです。

今後は、その辺りも調べてみたいと思います。