ARやVR空間に表示された仮想物体と実物体が何かしらの相互作用ができたら面白いのではないかと思い、ちょっとしたコンテンツを試作しました。わりと簡便な方法で実現できるのでメモ程度にざっくりとした手順を残しておきます。
1.開発環境
今回の試作では以下のセンサやライブラリを使用しました。
・開発言語:C#
・グラフィクス:OpenGL (OpenTK使用)
・センサ:Kinect for Windows
・画像処理:OpenCVSharp
2.画像処理による物体認識
実物体の位置の推定を行うため、Kinectから得られるカラー画像に対してOpenCVを用いて画像処理を行います。大まかな手順は以下のとおり。
① RGBのカラー画像をHSVに変換し、閾値処理によって二値化
② 閾値を調節することで大まかに対象物の色領域を抽出
③ 収縮・膨張処理により面積の小さい領域を除去
続いて、抽出された物体の3次元座標の算出を行います。Kinectでは3次元の点の集合(Point Cloud)を取得することができるだけでなく、カラー画像とPoint Cloudとの対応付けもSDKで提供されているCoordinatemapperクラスを使えば簡単に行うことができます(関連動画)。
そのため今回は、画像処理によって白く残った領域の重心を計算することで2次元画像中のおよその座標を求め、その3次元座標をCoordinatemapperを用いて取得することとしました。その結果、手で持った物体の位置を知ることができるため、下図のように仮想物体が追従します。
3.動作確認
最後に、物理演算に実物体の位置をリアルタイムに反映させることで、以下の動画のようにあたかも仮想物体とのインタラクションを行っているかのような表示を行うことが可能になります。物理演算や描画についてはまた別の機会に詳しくまとめようかと思います。
本記事はAR Advent Calendarに登録しました。(ネタ切れ寸前)