SyntaxHigh

Saturday, February 28, 2015

画像処理:高速な背景除去

固定カメラで顔認識するために、Android の計算量を余り使わずに背景除去したい。背景除去ができれば顔認識やトラッキングが相当早くなる。

背景差分なんて引いてスレッショルドかけたらいいじゃんと思いがちだが、例えば明るさが変わったりすると面倒なので、それなりに前処理が必要になる。また、ピクセルごと1024x768 (Nexus 2013) で計算するのは無駄なので、ブロックで処理。

とりあえずやりたいのは顔認識なので、まず顔画像の大きさを大体 128x128 以上とする。これに比べ余り小さな単位で背景差分をやる意味は無い。何故かと言うと、顔認識は Rectangle を渡すので、細かく背景を塗りつぶしても計算量は変わらない(精度は幾分変わるかもしれないが)。ある程度小さな 32x32 のパッチごとに毎フレーム処理を行えば、(ピクセルごとよりも)ノイズ耐性を持ちながら背景処理を出来るはず。

一気に独立に処理して、その後 erosion と deletion をかけてやれば人物っぽいのは簡単に抜き出せるだろう。

また、あるブロックが背景じゃない、とわかったら、その下のブロックはすべて背景じゃないと思う。もしくは、Foregroundが人以外のものが想定できないような状況なら、更に小さく Crop する、等の事前知識を組み込んでやる。

固定カメラの場合、明るさが微妙に変わったりするので Background は1分に1回等更新する。