Tech Sketch Bucket of Technical Chips by TIS Inc.

OpenCV&Kinectでお絵かきアプリ

Pocket

お絵描きをする

kinect hackといえば空中にお絵描きしたくなるもの。
というわけで以下のようなお絵描きモノを作ってみました。


というわけでどんな感じに実装してみたかをまとめます。


環境

今回の環境です。環境構築に関しては自力で何とかなると思います。

kinect要素はどこ?

動画をみるとkinectハック定番のスケルトントラッキングなどは使っていないので、どこにkinectやOpenNIの機能を使ってるの?という状態ですが一応重要な機能を使っています。

利用しているのはOpenNIのxn::UserGeneratorで、画面内の人を検出することが出来るのですが、この機能は人が持っている物体も人の一部として捕らえる挙動をします。
この挙動を利用して今回は人の持っている赤いものだけを描画に利用します。
背景でテレビが赤くなったり、赤い風船がとんでいったり、急にポストが横切ってもお絵描きの描画に利用されないということです。

つくるもの

上記を踏まえておおむね以下のようなことを意識して実装します。

  • 人を検出する
    • 検出されていることがわかるようにする。
  • 人が持っている赤いものを描画に利用する。
    • ユーザに見えたままの色で描画に利用する。
  • 描画された情報はクリアされるまで残る

単純ですね。

実装

全体が見やすくなるように、エラーコントロールを削って動く状態にした状態で公開します。

ソース内はOpenCV2系のAPIだけを使うようにしています。

上記のOpenNIのconfig.xml
config.xml

エッセンス

全体としては行数は短いコードですが、解説していきます。

HSV色空間

今回、赤色を見つけるために RGB色空間 ではなく「色相、彩度、明度」で色を表現する HSV色空間 に変換して処理をしています。

その理由は、WikipediaのHSV色空間から引用すると"HSVモデルのあり方が人間が色を知覚する方法と類似しているため"であり、RGBで赤っぽい?判定をするよりHSVでやるほうが、環境光の影響を抑えられるなど都合がよいからです。

WikipediaにはRGB系からHSV系への変換のための式が説明されていますがOpenCVではcv::cvtColorで一発です。
OpenCVとても便利。

赤領域の検出

上記ソースコードのgetRedArea()内です。
やっていることは、

  1. 入力であるhsv画像をチャネルごとに分割(cv::split)
  2. それぞれ色相、彩度、明度ごとに閾値を設定し二値化(cv::threshold)
  3. 最後にすべての閾値をクリアしている領域を赤い領域とする。(cv::bitwise_and)
  4. ノイズ除去(後述)

といったところです。
すべて画素に直接アクセスせず画像全体に処理をかけていっています。

この見つけた赤い領域のビデオ映像をそのまま描画に利用することで、見えたままの色で描画でき、赤っぽいものだけで描画するにもかかわらず画面上で明るい赤から暗い赤までお絵描きに利用でき、面白い表現が可能になっています。

ノイズ除去

ノイズ除去は非常に重要です。
ノイズ除去をしない場合どんな感じになるのか動画を用意しました。


見てのとおり、手や顔に非常に細かい赤い領域があるかのように挙動します。
この状態を避けるため、非常に小さい領域を無視するノイズ除去を実施する必要があります。

ノイズ除去の方法ですがについてですが、以下のサイトで今回用いた手順である「収縮して膨張」(オープニング)について詳しく説明がされています。

画像処理ソリューション 膨張・収縮・オープニング・クロージング

今回は収縮1回→膨張1回を実施する手順で非常に小さい領域を除去しています。
OpenCVをつかえばソース内にあるように1つのメソッドを呼ぶだけで画像に収縮や膨張の処理ができます。(cv::erode/cv::dilate)

輪郭検出

今回はユーザジェネレータの情報からユーザのいる領域(1)と背景領域(0)で二値化した画像を元に輪郭検出を実行しています。
検出した輪郭線を描画することで画面内のユーザを表示しています。
輪郭検出に利用した画像はOpenCV1系のころと変わらず破壊されます。

終わりに

というわけでOpenCVとkinectを利用して赤いものでお絵描きするものを作ってみました。
自分としては割と面白い動きをするものができたように思います。

kinectで面白いことをしたいとき、OpenCVのようなもので画像解析ができると入出力ともに表現の幅が広がって面白いですね。

エンジニア採用中!私たちと一緒に働いてみませんか?