コンユウメモ @kon_yu

作ったガラクタとか、旅行とかの話

【今年もうっかり作っちまったぜクソアプリ!】軽量!リアルタイムで股間モザイク処理

ハッピークリスマス キョウコ ハッピークリスマス ジュリアン So this is Xmas

やあみんなクソアプリ Advent Calendar 2017 - Qiitaの25日目のトリの記事だよ!

概要

  • OpenCVを用いた画像認識で股間にリアルタイムでモザイクをかけるアート作品作成した
  • 本手法は以前Kinectを使って作成したものと違いRGBカメラのみで実現できるところに優位性がある
  • Kinectと同様に人体のボーンを取れるOpenPoseはハイパフォーマンスのマシンを必要とするが本手法はOpenCVの顔認識機能のみで実装されており低スペックなマシンでも実行できる
  • 小難しく書いているけど要は「チンチンにリアルタイムにモザイクをかけたよ」という話である
    • こんな感じでチンチンにモザイクがかかるよ!

実際のチンチンにモザイクがかかった画像

f:id:kon_yu:20171225012848p:plain

従来手法

2010年、マイクロソフトからKinectという画期的なデバイスが発売された。 KinectはRGBカメラと距離カメラから、複数の人間を認識して体の主要な部位の座標(ボーン)を取得することができる。 このデバイスの登場で、ラップトップでもボーンを取得するのが用意になり、Processingや各種言語で利用できた。

このKinectのボーンを取得できる機能を利用して、2014年に股間にリアルタイムでモザイクをかけるというメディアアート作品を発表した(あくまでアートである) realtime_crotch_mozaiq

前述の通りKinectは体の関節などの各部位の点を取得できる。 Kinectで股間領域を特定する場合、股間そのもの位置は取得できないためヘソの位置、両足の付け根付近の位置から股間領域を計算しモザイク処理をした。

Kinectを用いた股間領域特定手法の概念図

今回提案するOpenCVで顔認識を用いた手法

残念なことにKinect自体はディスコンになってしまった。画像のみでボーンを取得できるものライブラリが現れた。今年2017はRGBカメラとディープラーニングを用いて人間の体の座標を取得できる OpenPoseというものが発表された。 OpenPoseは高性能であるが、マシンパワーを必要とするし、環境構築に時間的、費用的なコストがかかる。

そこでもっと簡易に、OpenPoseを使うこと無く、股間を位置を推定しモザイクをかける方法を考案した。

システム構成

  • OpenCV3
  • Python3
  • MacBook Pro搭載のフロントカメラ

OpenCVRuby用のライブラリはOpenCVは2系までしか対応しておらず。Processingも2系しか対応していなかった。

こういうのは最近はPythonの方が環境構築が楽だ

提案手法詳細

従来からあるOpenCVの顔認識機能はかなり低コストに画面上の顔領域のピクセル位置を取得することができる。

また顔の領域の鉛直線下方にあるのはあらゆる人種においてもで自明である。しかし、ある程度の位置は絞れても、顔の大きさと胴体の長さは人種、年齢などによってブレが大きい。

ある程度の汎用性を持たせつつ、股間領域を推定する方法は無いだろうか?

先日東京大学暦本研究室のオープンハウスを見学した際に、ある大学院生の研究の実装方法がこの問題を解決するヒントとなった。

その実装方法とは人間が正面を向いているか下を向いているの判定を頭の領域の中から髪の毛の黒い領域の割合で決めているというものだった。黒い領域が多ければ下を向いていると判定する。

「これだ!」天啓が降りてきた。

少なくとも多くのアジア人の大人が持っている股間付近の黒いもの、そう陰毛である。

つまり顔の位置から鉛直方向にある程度下の領域から、黒っぽい色を探し出し、そこから下方の一定領域が股間領域であると推定できる。

画像からある色の領域を二値化するコマンドがあるので陰毛の座標探すのは容易である。 黒い領域を取り出した際に、下記画像のように白い領域の用に白(255)となる

黒のフリースを着た胸から上の画像

プログラムの概要

このような処理をループ処理することにより股間にモザイクをかける処理を実装している

  1. カメラから画像を取得する
  2. 画像から顔認識する
  3. 画像から黒い領域を取得する
  4. 顔の位置から下方向にある程度幅をもたせた探索領域を部分領域(Region of Interest)で取得する
  5. 探索領域にある黒い領域のピクセル位置から判断し陰毛領域を取得する
  6. 陰毛領域から一定サイズの四角い領域をモザイク処理する

OpenCVの顔認識機能を用いた股間領域特定手法の概念図

デモ動画

リアルに股間丸出しででも動画を取ったけれども、あまりにもリアルだったので、 黒いモバイルバッテリーで試したデモ動画をアップした(リアルバージョンは実際にオレに会ったら見せるよ)

ソースコード

github.com

今年も無駄に一生懸命作ってしまった。やっぱり技術は無駄遣いしてなんぼだよね。そうは思わないかい?

今回参考にした書籍たち

画像処理・機械学習プログラミング OpenCV 3対応

画像処理・機械学習プログラミング OpenCV 3対応