近年、家電製品にもマイコンなどが内蔵され、使用方法が大きく変化してきている。テレビでは、昔は、電源、チャンネル、ボリューム、チャンネル選択などが専用のスイッチやつまみなどで操作していたが、現在は、リモコンにおいては多数のスイッチが付いているが、本体には数個のスイッチしか付いてなく、画面にメニューを出すことにより、多くのチャンネルや入力の切り替えまでもできるようになっている。
また、携帯電話も、従来は様々なボタンが付いていたが、スマートフォンではタッチパネルでガイドにより操作することになっている。いずれも、製品が高度化し、多数の機能の操作を構造的に扱うために、操作入力を構造化するための手法である。
しかし、一方で、この様な操作がふさわしくない場面がある。例えば、カーナビゲーションシステムでは当初からメニュー画面から多くの機能を選択することになっているが、これを運転中に行うことは危険である。そのため、運転中は操作を禁止するようにする他、運転中の操作では音声入力など、画面に意識を向けなくても済む方式が採用される。このように、何らかの作業をアシストするような製品において、その作業の妨げにならないような操作方法が必要となることはある意味必然である。
音声入力は、人間の思考を直接伝えることができる反面、認識精度が100%にはならない、伝送レートが遅いので複雑な入力ができない、現代のパソコンやスマートフォンのOSの操作と密接な関係に無い、騒音に弱いなどの短所があるため、効果的に使用できる用途は限られる。
さて、タッチ操作やジェスチャー入力、音声入力といった人間にとって自然で直感的な動作で操作可能な仕組みをナチュラルユーザーインターフェース(以下NUI)という。その中でもジェスチャー入力や音声入力などの操作では非接触での機器操作ができるという利点がある。
NUIを実現するデバイスとして、Microsoftより販売されているKinectがあげられる。Kinectはゲーム機の入力デバイスとして発売されていたが、Windows PCでの開発用に「Kinect for Windows」が発売され、無償のSDKが正式に公開されたことにより、PCでのNUIデバイスとして活用できるようになった。これにより誰でも手軽にKinectの開発を行えるようになり、医療や教育、プロモーションなど様々な分野で開発が行われてきた。
また、プロジェクターで壁や物といった物体に対して映像を映し出すプロジェクションマッピングという技術がある。一般的には、スクリーンとなる対象物が動いたり変形したり、光を放つように感じさせるなどの錯視的な表現を活用したパフォーマンスの用途に使用される。
ここで著者は、Kinectとプロジェクションマッピングを合わせ、機器に直接触れることなく、従来のGUIを扱うことの出来るユーザーインターフェース(以下UI)ツールについて考察した。この二つの技術を使うことで、生活の中の様々な場面に対応したUIツールを実現できるのではないかと考えた。
本論文では、Kinectを用いて人が指先で平面を触っているかを検出するプログラムを作成し、その性能を評価した。そして、上記システムを実現するために実装するべき機能について考察した。
Kinect for windows v2(以下Kinect)とは、Microsoftから発売されたジェスチャーや音声を認識出来るセンサーデバイスである。RGBカメラ、深度センサー、マルチアレイマイクロフォンを搭載しており、これらのセンサーを活用することで人の位置や姿勢、表情、声およびその方向を認識する事ができる。
Kinectはゲーム機「Xbox 360」用に販売され、体を使って直感的に遊ぶという新しいエンターテイメントを可能にした。その後、システムから再設計され、より高性能になった「Kinect v2」が発売された。Kinect v2にはゲーム機「Xbox One」用に販売されている「Xbox One Kinect センサー」とWindows PC向けに販売されていた「Kinect for Windows v2」があるが、現在ではKinect for Windows v2の販売は終了しており、今後Kinect v2をWindows PCで使用するにはXbox One Kinect センサーをWindows PCにUSB接続できるアダプタ「Kinect Adapter for Windows」を使用する必要がある。なお、両製品の機能性能は変わらないため、どちらを使用しても同じように開発を行うことができる。
本論文ではこのKinect v2のWindows PC向けに販売されていた「Kinect for Windows v2」を使用する。Kinect v2はMicrosoftから配布されている「Kinect for Windows SDK 2.0」[1]を導入することで自由に開発することが出来る。
OS | Windows 8、Windows 8.1、Windows 10 |
プロセッサ | 64-bit(x64)プロセッサ、デュアルコア3.1GHz以上 |
USB | USB3.0(IntelまたはRenesasチップセット) |
RAM | 4GB以上 |
グラフィックカード | DirectX11 |
開発環境 | Visual Studio 2012、Visual Studio 2013(Express可) |
色 | 解像度 | 1920×1080 |
FPS | 30fps | |
深度 | 解像度 | 512×424 |
FPS | 30fps | |
最大追跡人数 | 6人 | |
関節 | 25関節/人 | |
手の開閉状態 | 閉じ、いくつかの指が開いている、全部の指が開いている | |
深度の取得範囲 | 0.5~8.0m | |
人物の検出範囲 | 0.5~4.5m | |
音声入力 | あり(マルチアレイマイクロフォン) | |
角度 | 水平 | 70度 |
垂直 | 60度 |
Visual Gesture Builder(以下VGB)とは、機械学習によってジェスチャーの特徴を学習することができるKinect向けのツールである。Microsoft社から提供されている「Kinect for Windows SDK 2.0」に付属している。
従来のジェスチャー判定システムの実装は、取得した骨格位置についてif文などの条件分岐を駆使して行っていた。VGBでは、Kinectの前でジェスチャーを行うことで機械が自動で学習し、データベースを作成する。作成されたデータベースはKinect for Windows SDK 2.0を利用することで簡単に扱うことができる。
プロジェクターで物体をスクリーンとして映像を投影する技術である。スクリーンとなる対象物が動いたり変形したり、光を放つように感じる錯視的な表現を得意としている。
本研究ではGUIのウィジェットの表示などを行う。つまり現実の対象物にウィジェットを投影して、その対象物を操作することでコンピュータの操作を行えるようにする。
画像認識型AR(拡張現実)システムにおいて、標識となる決まったパターンの画像をARマーカーと呼ぶ。通常は矩形で、白黒2色のビットパターンになっており、単純な画像認識でマーカーIDを認識出来るものである。マーカーは平面のものを使用し、カメラに写った時の歪み具合など、その形状からカメラに対する距離、角度などを計算する。取得した情報から、マーカーの位置に3DCGなどを表示するような使い方が一般的である。
また、ARマーカーから取得できるデータは、置かれた平面の角度情報の取得や領域の指定など、ARマーカー上に3DCGを映し出すだけでなく様々な用途に活用されている。
WorldKitは、プロジェクターとKinectを組み合わせたツールで、好きな場所にインタラクタと呼ばれるUIを構築できる技術である。インタラクタには接触の有無や位置、面積を認識するものや、テキストを表示するものなど、いくつかの種類があり、これらを組み合わせてボタンやスライダーといった望みのインタラクタを創りだすことができる。実際に家具にインタラクタを構築している様子を図3.1に示す。ビジュアルデザイン向けのプログラミング言語Processingのライブラリとして提供されているため、インタラクタを自由にカスタマイズすることもできる。
SixthSenseとは、プロジェクターとカメラを首から下げ、手元の紙や、人の体など直接対象物に映像を映し出すことで、身近なものすべてをタブレット端末のように扱えるようにする技術である。
操作は、指につけた色テープの動きの他、検索対象としてカメラに写った文字や、人間の顔なども認識する。その結果、例えば新聞を掲げると書かれている記事の関連情報を新聞に投影する事もできる。また、人に会った時、人の胸に名札を表示することもできる。
この研究の特徴は外へと持ち出せるということである。前述したWorldKitは、どこにでもUIを作成できるという特徴を持っていたが、それはKinectとプロジェクターを設置した範囲でのことである。SixthSenseではデバイスを首に下げたまま活動することで外出先でも目の前に壁や紙があれば画面を表示して操作することができる。
RoomAliveはMicrosoftが研究しているKinect v2とプロジェクションマッピングを組み合わせて部屋全体をインタラクティブ空間にする技術である。天井に設置された複数のKinect v2とプロジェクターで部屋全体の形状を認識し、映像を投影する。
まず、WorldKitでは好きな場所にUIを作成し、扱うことができるというエンドユーザーがUIをカスタマイズして扱うことを前提としている。対して本論文では、UIの位置や種類はアプリケーション側で設定をしておくことで、自由度は少なくなるがエンドユーザーがすぐにシステムの支援を受けることができる。また、タッチでの操作だけでなくジェスチャーによる操作も取り入れることでより快適な操作性を目指す。
SixthSenseは身に付けることで外出先でも利用できるような設計となっているため、カメラが持ち運びできるような小さなものを使っている。このカメラは深度センサーなどの機能を持っておらず、RGB画像を取得するのみである。そのため、指先の動きを検知するには色のついたマーカーを指先につける必要がある。本論文では、Kinectとプロジェクターを設置した範囲という制限が入るが、マーカーレスで利用できるようなシステムを提案している。将来的に深度センサーを持つカメラの小型化が進み、常に身につけても邪魔にならない大きさになった時、本論文の結果をSixthSenseのような技術にも活かせるのではないかと考えている。
RoomAliveでは空間の凹凸や、人の視点に合わせて補正するレンダリング技術について開発されている。一方、本論文では、OSやアプリケーションの操作部分のシステムを提案する。また、将来RoomAliveは現在のKinectの様に、幅広い用途で活躍するだろう。本論文にてKinectとプロジェクションマッピングを活用した生活支援システムを開発し評価することで、将来的にRoomAliveが一般に普及した時の活用法の一例となると考えている。
本研究では、Kinectとプロジェクターを用いたGUIツールを開発することを目標とする。このツールは、対象となる平面にARマーカーを設置し、それをKinectで認識することでその平面をGUIの投影、操作判定を行う平面と認識する。対象となる平面に対してプロジェクターでGUIのウィジェットの表示を行い、そのウィジェットを指で触れるように操作することでコンピュータの操作を行えるようにする。図4.1にシステムのイメージ図を示す。
本論文では、このうちツールの触れるように操作をするために必要な機能である、平面と関節の接触判定機能について実装する。
本章では、Kinectを用いた平面と関節の接触判定を行うプログラムを作成する。図4.2は、壁とその前に立つ人をKinectで写した時のシステムの流れである。Kinectより深度情報および人の関節情報を読み込み、それぞれの情報を3D点群へと変換する。3D点群より、関節の追跡および平面の検出を行う。検出した平面と指先の関節との距離を計測し、接触判定を行う。
KinectやPoint Cloud Library(以下PCL)を扱うため、C++言語にて作成することにした。PCLについては第8章の付録にて述べる。開発環境を表4.1に示す。
OS | Windows 8.1 Pro 64bit |
CPU | Intel Core i7-4790 CPU 3.60GHz |
GPU | GeForce GTX 750 Ti |
RAM | 16.0GB |
使用言語 | C++ |
開発環境 | Visual Studio Express 2013 for Desktop |
使用デバイス | Kinect for Windows v2 |
本論文では、現実の空間の深度情報を得るためにKinectを利用している。しかし、コンピュータで三次元空間の処理を行うには、Kinectの深度情報をそのまま使うよりも、3D点群へと変換して処理を行うほうが適している。点群とは、複数の次元の点の集合を表すために使用されるデータ構造である。一般的に三次元のデータを表すために使用され、これを3D点群と呼ぶ。点は立体物の表面形状を離散的に表現している。3D点群の例を図4.3に示す。
3D点群の処理を行うためのライブラリとして、PCLがある。本論文では、このライブラリを利用し3D点群の処理を行う。
平面の検出には、PCLのsegmentationモジュールを使用する。segmentationモジュールは、推定するモデル(法則性)と推定方法、許容誤差を指定することで与えた点群の中から特定のモデルとそのパラメータを抽出することができるモジュールである。本論文では、推定するモデルを平面、推定方法をRANSAC(Random Sample Consensus)、許容誤差を0.05[m]とした。許容誤差は、今回推定する平面にペンやまな板などの雑貨が表面にあることや、Kinectによる誤差を想定した値を取っている。
RANSAC(Random Sample Consensus)とは、ノイズの多いサンプルから、外れ値を無視してモデルを推定する手法である。RANSACのアルゴリズムは次のようになっている。
Kinectより得られた3D点群をsegmentationモジュールに与えることで、点群内から平面を検出し、その平面の式のパラメータを得ることが出来る。得られた平面内の点群を切り出し、新たに平面の点群として保管する。
関節の追跡にはKinectを用いる。第2章で述べたように、Kinectには人の関節の位置を取得する機能がある。関節の位置はKinectを中心とした3次元座標として取得できる。これを空間全体の点群とは別に新たな点群として保管することで関節のみを独立して追跡を行う。
関節と平面の接触判定は、関節の座標と平面との最短距離で判定を行っている。つまり、点(関節の座標)から平面への垂線の長さで判定を行っている。点(x¬¬0, y0, z0)から平面ax+by+cz+d=0への垂線の長さは、次式で求められる。
ここまでで本システムを構成する機能が一通り揃った。本章では、本システムの流れとともにアルゴリズムをまとめる。
まず、Kinectより深度情報と関節情報を取得し点群化する。深度情報の点群をPCLのsegmentationモジュールに与え、平面を検出する。segmentationモジュールの機能より、平面を検出すると同時に平面の式を得られる。関節情報の点群から指先の関節の座標を読み込み、その座標と平面の式を利用することで指先から平面への垂線の長さを計算し接触判定を行う。以上が本システムの流れとアルゴリズムである。
本章では、作成したプログラムの評価をし、その結果を述べる。
作成したプログラムを動作させ、正しい処理が出来ていることを確認する。
実装した仕様を確認するには、
以上を確認することが出来れば、プログラムが正しく動作しているといえる。3D点群の状態も確認するため、PCLに実装されている点群を可視化するためのビューワーを利用する。
以下に具体的な手順を示す。
今回は、ホワイトボードを設置した壁を平面として認識し、評価を行った。
手順1、2、3の通りに操作し、プログラムを実行した。実行画面を図5.1に示す。ビューワーが表示され、Kinectより得た深度情報が3D点群から平面だけが切り出されていることが確認できた。
次に手順6を実行した。その実行画面を図5.2に示す。ビューワーを見ると、切り出された平面に人型の影が出来ている。これは、Kinectと平面の間に人が立っていることによる影響である。また、人の骨格が点群となって表示されていることが確認できた。
最後に手順7を行った。その実行画面を図5.3に示す。人型の影より人が壁に触れていることがわかる。この時、システムは指先が平面に触れていると判定を行った。
以上より、正常に接触判定が行われていることを確認できた。
評価の結果より、おおむね接触判定が正しく行われていることが確認できた。しかし、問題点も見つかった。
本プログラムの接触判定には指先の座標情報が重要になる。しかし、Kinectの位置や対象となる人の位置によっては指先の追跡情報の信頼度が低くなり、正しい判定をしなくなることがあった。Kinectによる関節追跡は、関節追跡の信頼度が低い場合はKinectが位置を予測してデータを与えてくれる。しかし、そのデータは実際の関節の位置とは異なることが多い。利用するアプリケーションによっては大雑把な位置さえわかれば良いという場合もあるが、本論文では誤差による影響を大きく受けるため、信頼度の低い追跡情報を得た場合は無視をするなどの対処が必要であった。
本論文では、平面と指先の接触判定を実装し、それを評価した。しかし、本論文で最初に述べたようなUIツールとして使用するためには、更に機能が必要である。本章では、その機能について考察する。
本論文では、Kinectを用いた指先と平面との接触判定処理の実装、UIツールとして使用するために必要な機能の考察について述べてきた。
Kinectによる人体の関節追従とPCLによる3D点群処理によって指先と平面との接触判定処理を実装することができた。また、実装した接触判定処理の評価を行った。評価の結果より「信頼度の低い追跡情報による誤判定」という問題点を見つけた。その問題点も含め、指先と平面との接触判定処理を実装したUIツールを作成するために必要な機能を考察した。
今後の課題としては、問題点の解決やUIツールとして使えるように機能を追加していくことだと考える。また、UIツールとして一般の家庭で利用する場合には本論文で評価したような条件とは違う環境で利用されることが多いだろう。利用する環境が異なればまた違う問題点が見つかると考えられるため、実際に家庭で使うことを想定して様々な条件での評価をする必要がある。
本論文で作成したプロブラムを付録として載せる。
本章では、プログラムに使用したライブラリについて述べる。
Point Cloud Libraryとは、3D点群の処理を集めたオープンソースのライブラリである。リアルタイム処理性と、マルチプラットフォーム対応を目的として、C++言語が採用されている。基本的な機能を表8.1に示す[10]。
フィルタリング | 点の間引き |
x,y,zごとの範囲抽出 | |
検出 | 平面の検出 |
物体の検出 | |
レジストレーション | 点群データの位置合わせ |
メッシュ化 | 点群からメッシュを生成する |
データ表示 | 点群データの表示 |
ファイルI/O | OCDファイルや、PLYファイル、STLファイルなどの読み書き |
デバイスI/O | KinectなどのDepthセンサーのデータをPCLの形式で取得する |
Kinectなどの深度センサーでは、2D(x,y)のRGBデータに加え、奥行き(z)を表すDepthデータを取得している。これらx,y,zの3DデータとRGBデータを3D点群データに変換することでPCLでの処理を行うことができる。
PCLのライセンスは「3-clause BSD license」であり、商用にも研究用にも無料で利用することができる。
OpenCVとは、オープンソースの画像処理ライブラリである。フィルター処理や変形処理、フィッティング、領域分割、キャリブレーション、特徴点抽出など、コンピュータで画像や動画を処理する様々な機能が実装されている。図8.1にOpenCVの主な機能の一覧を示す[11]。
前述したPCLには、Grabberと呼ばれるデータ入力のためのモジュールがいくつか用意されている。Kinect v1からデータを入力するためのGrabberにはOpenNI Grabberが提供されている。
しかし、本論文で利用するKinect for Windows SDK 2.0に対応したGrabberは公式では実装されていない。そのため、本研究では杉浦司の実装したkinect2_grabber[12]を利用することでKinectのデータをPCLに入力する。