• 検索結果がありません。

夏休み自作自習:2. ProcessingではじめるKinectプログラミング -1 回 Kinectプログラミングはじめの一歩─

N/A
N/A
Protected

Academic year: 2021

シェア "夏休み自作自習:2. ProcessingではじめるKinectプログラミング -1 回 Kinectプログラミングはじめの一歩─"

Copied!
6
0
0

読み込み中.... (全文を見る)

全文

(1)小特集. 夏休み自作自習. 2.. Processing ではじめる Kinect プログラミング. 第1回. 基 応 専 般. Kinect プログラミングはじめの一歩 橋本 直((独)科学技術振興機構 ). Kinect とは. Kinect のハードウェア構成.  Kinect はマイクロソフト社が販売している Xbox.  プログラミングの話に入る前に Kinect の仕組み. 360 向けのゲームデバイスです.全身を使ったジェ. について簡単に説明します.Kinect は普通の RGB. スチャや音声認識によってゲームをプレイすること. カメラに加え,赤外線カメラと赤外線レーザプロジ. ができます.Kinect は発売から 60 日間で 800 万台. ェクタを搭載しています(図 -1).赤外線レーザプ. を販売し, 「最も速く売れているコンシューマ向け. ロジェクタからは人間の目には見えない赤外線のド. 電子機器」としてギネスブックにも認定されました.. ットパターンが投影されます.これを赤外線カメラ. Kinect の発売後,すぐにハッカーたちによって解. で読み取ることによって空間方向の奥行きを計測し. 析が行われ,非公式にドライバやライブラリが作ら. ています.この手法は「Light Coding」と呼ばれて. れました.これにより,Kinect を使ったアート作. います.. 品や学術研究がまたたく間に生まれました.現在で.  Kinect はカメラ以外にもいろいろな入出力デバ. は,マイクロソフト社から公式の開発環境(Kinect. イスを搭載しています.音声認識と音源の位置推定. for Windows SDK)も提供されています.インター. を行うために 4 個のマイクを内蔵しています.また,. ネットの動画投稿サイトで検索すれば,たくさん. 本体の傾きを検知し,自動的に姿勢を修正するため. の Kinect 作品が出てきます.ゲームやエンタテイ. の仕組みとして,加速度センサとモータを備えてい. ンメントだけでなく,医療現場やファッションなど. ます.本体の動作状態を表示するために LED が付. での応用事例も見つけることができます.いまや. いており,これも PC 側のソフトウェアから制御で. Kinect を使った開発ブームの波は最高潮に達して. きる仕様になっています.これらのハードウェア機. いると言っても過言ではないでしょう.. 能の利用の可否は,プログラミングに用いるライブ.  本稿では Kinect を使ったプログラミングについ. ラリの対応状況に依存します.. て 2 回にわたって解説します.プログラミング経験 があまりない人でも手軽に楽しんでいただけるよう, プログラミング言語として Processing を用いまし た.第 1 回では Kinect が提供する機能について簡 単に説明した後,プログラミング環境のセットアッ プ方法と基本的なデータの取得方法について解説し ます.第 2 回では骨格認識について解説し,ジェ スチャ操作のアプリケーションの作り方を紹介し ます.. 赤外線レーザプロジェクタ RGBカメラ. 赤外線カメラ. 図 -1 Kinect の外観. 情報処理 Vol.53 No.8 Aug. 2012. 817.

(2) 小特集. 夏休み自作自習. Kinect から得られるデータ. とを非常に短いコードで実現することができます.. Processing は 公 式 サ イ ト の ダ ウ ン ロ ー ド ペ ー ジ.  Kinect から得られるデータを以下に示します.. (http://processing.org/download/)から無償でダ. ライブラリによって未サポートのものもありますが,. ウンロードすることができます.Windows 版は無. 基本的にカラー画像とデプスマップはどのライブラ. 印と [Without Java] の 2 種類がありますが,JDK. リでもサポートされています.. (Java Development Kit)のバージョンについて特. ▶▶ カラー画像. にケアしない場合は前者をダウンロードしてくださ.  RGB カメラから得られる画像です.画素ごとに. い.インストールは Windows,Mac ともに,ダウ. RGB(赤・緑・青)の色情報を持っています.. ンロードした ZIP ファイルを解凍して出てきたもの. ▶▶ デプスマップ,深度画像. を任意のディレクトリに置くだけです..  デプスマップは画素ごとに奥行きの距離情報を持 つ 2 次元のマップデータです.値の範囲を 0 ∼ 255 に正規化し,画像にしたものが深度画像です.この. simple-openni のインストール. 情報をもとに,物体までの距離や物体の形状を知る.  Processing で Kienct を使ったプログラミングを. ことができます.. 行うためのライブラリは複数ありますが,今回は多. ▶▶ 赤外線画像. くの機能が利用できる simple-openni というライ.  赤外線カメラで撮影されたグレイスケールの画像. ブラリを使います.simple-openni は,PrimeSense. です.赤外線レーザプロジェクタから投影されたド. 社 が 開 発 し て い る OpenNI と い う ラ イ ブ ラ リ. ットパターンを見ることができます.. を Processing で扱えるようにしたラッパーです.. ▶▶ 人物領域情報. OpenNI の NI は Natural Interaction(自然なイン.  深度画像から人物領域のみを抽出して作成した画. タラクション)の略で,ジェスチャや姿勢認識を. 像データです.画素値がユーザ ID になっています.. 使ったインタラクションを意味します.OpenNI を. 検出可能なユーザ数はライブラリに依存しますが,. 使ったプログラミングでは C++ や C# についてあ. 今回使用する simple-openni では,最大 15 人のユ. る程度の技量が要求されますが,simple-openni. ーザを検出・トラッキングすることができます.. は Processing 向けにカスタマイズされているため,. ▶▶ 骨格情報. 非常に簡単に扱うことができるようになっていま.  人物領域の情報をもとに計算された関節の位置情. す.simple-openni は http://code.google.com/p/. 報です.頭・手・肩・胴・脚などの関節について,. simple-openni/ で配布されています.以下,執筆. 画像上の座標値(x,y)と,空間中の座標値(X,Y,. 時点の最新版である Ver.0.26 のインストール方法. Z)の両方を得ることができます.. について説明しますが,以降のバージョンでインス トール方法が変わる場合がありますので,公式ペー. Processing のインストール. ジの「Installation」の説明を適宜参照してください..  Processing はメディアアートとビジュアルデザ. ■■ Windows でのインストール. インのために開発されたオープンソースのプログラ.  simple-openni の ダ ウ ン ロ ー ド ペ ー ジ か ら. ミング言語です. マサチューセッツ工科大学のメ. OpenNI_NITE_Installer-Win32-0.26.zip をダウンロ. ディアラボに所属していた Casey Reas と Ben Fry. ードします.このファイルを解凍すると,OpenNI,. によって開発されました.ラピッドプロトタイピ. NITE,Kinect のドライバ,Kinect 互換製品のドラ. ングを意識して作られた言語なので,やりたいこ. イバの 4 つのインストーラが出てきますので,そ. 818 情報処理 Vol.53 No.8 Aug. 2012.

(3) 2.. Processing ではじめる Kinect プログラミング 第1回 Kinect プログラミングはじめの一歩. 図 -2 空間の奥行き情報を 3D 表示するデモ. れ ぞ れ 実 行 し て く だ さ い.64bit 版 Windows を 使 用 し て い る 場 合 は,OpenNI_NITE_Installer-. 図 -3 手の動きを使ってタイルを操作するデモ. 「SimpleOpenNI」フォルダを「/Users/ ユーザ名 /. Documents/Processing/libraries」に移動します.. Win64-0.26.zip をダウンロードしてインストール. 「Processing」というフォルダは Processing の初回. を行ってください.また,Processing がインスト. 起動時に「書類」フォルダの中に自動作成されます. ールされているフォルダから「Java」というフォル. が,「libraries」というフォルダは初期状態では存. ダを削除した後,JDK の Web サイトから 64bit 版. 在しないので作成してください.. JDK を入手してインストールしてください.   次 に SimpleOpenNI-0.26.zip を ダ ウ ン ロ ー ド. サンプルを実行してみよう. してください.このファイルを解凍して出てきた 「SimpleOpenNI」フォルダを「C:¥Users¥ ユーザ名. ¥Documents¥Processing¥libraries」に移動します..  simple-openni のインストールが済んだら,動作 確認を兼ねてサンプルで遊んでみましょう.Kinect. 「Processing」というフォルダは Processing の初回. の USB ケーブルを PC に挿し,電源アダプタをコ. 起動時に「ドキュメント」フォルダの中に自動作成. ンセントに接続したら Processing を起動してくだ. されますが, 「libraries」というフォルダは初期状. さ い. メ ニ ュ ー か ら「File」 →「Examples...」 を. 態では存在しないので作成してください.. 選 択 す る と サ ン プ ル 一 覧 が 表 示 さ れ ま す. ツ リ ーの下の方にある「Contributed Libraries」の中. ■■ Mac でのインストール. に「SimpleOpenNI」のサンプルがあります.項目.  simple-openni の ダ ウ ン ロ ー ド ペ ー ジ か ら. をダブルクリックするとサンプルが開きますので,. OpenNI_NITE_Installer-OSX-0.24.zip をダウンロー. Run ボタンを押して実行してください.空間の奥行. ドします.ファイルを解凍したら,ターミナルを起. きを 3D 表示するデモ(AlternativeViewpoint3d)や,. 動して解凍してできたフォルダに移動してください.. 手の動きを使ってタイルを操作するデモ(Slider2d). > cd ./OpenNI_NITE_Installer-OSX. 以下のコマンドでインストールを実行します. > sudo ./install.sh. などが入っています(図 -2,図 -3).. プログラムを書いてみよう  実際に自分の手でプログラムを書いてみましょう..   次 に,SimpleOpenNI-0.26.zip を ダ ウ ン ロ ー. 今回はカラー画像,深度画像,赤外線画像の取得方. ド し ま す. こ の フ ァ イ ル を 解 凍 し て 出 て き た. 法と,人物領域の抽出方法について紹介します.. 情報処理 Vol.53 No.8 Aug. 2012. 819.

(4) 小特集. 夏休み自作自習. 図 -4 カラー画像の描画. ■■カラー画像の取得. 図 -5 深度画像の描画. [リスト 2 深度画像を表示するプログラム].  Kinect からカラー画像を取得して表示するプロ グラムをリスト 1 に示します.非常に短いコードで 実現できていることがお分かりいただけると思いま す.これが Processing で書くことの魅力です.実 行結果は図 -4 のようになります. [リスト 1 カラー画像を表示するプログラム] import SimpleOpenNI.*; SimpleOpenNI kinect; void setup() { size(640, 480); // 画面サイズの設定 kinect = new SimpleOpenNI(this); // 初期化 kinect.enableRGB(); // カラー画像の有効化 } void draw() { background(0); // 背景の初期化 kinect.update(); // データの更新 image(kinect.rgbImage(), 0, 0); // 画像描画 }. ■■ 深度画像,デプスマップの取得  次は Kinect の主役である深度画像を表示させて. import SimpleOpenNI.*; SimpleOpenNI kinect; void setup() { size(640, 480); // 画面サイズの設定 kinect = new SimpleOpenNI(this); // 初期化 kinect.enableDepth(); // 深度画像の有効化 }. void draw() { background(0); // 背景の初期化 kinect.update(); // データの更新 image(kinect.depthImage(), 0, 0); // 描画 // マウスカーソルがある場所の距離を表示 int[] depthMap = kinect.depthMap(); int index = mouseX + mouseY * width; int d = depthMap[index]; println(d + " mm"); }.  このプログラムではデプスマップも取得し,マウ スカーソルがある場所の距離情報をコンソールに表 示しています.depthMap() から得られる距離デー タの単位は mm(ミリメートル)です.  . みましょう.enalbeDepth() によって深度画像を有. ■■ 赤外線画像の取得. 効にし,depthImage() によって深度画像を取得し.  赤外線画像を表示させて,赤外線レーザプロジェ. ます.リスト 2 を実行すると,図 -5 のような画像. クタから投影されている見えないドットパターン. が表示されます.. を見てみましょう.赤外線画像を有効にするには. enableIR() を,赤外線画像を表示するには irImage() を使います.リスト 3 を実行すると,図 -6 のよう. 820 情報処理 Vol.53 No.8 Aug. 2012.

(5) 2.. Processing ではじめる Kinect プログラミング 第1回 Kinect プログラミングはじめの一歩 ムをリスト 4 に示します.実行結果は図 -7 のよう になります. [リスト 4 人物領域を抽出するプログラム]. import SimpleOpenNI.*; SimpleOpenNI kinect;. 図 -6 赤外線画像の描画. な画像が表示されます. [リスト 3 赤外線画像を表示するプログラム] import SimpleOpenNI.*; SimpleOpenNI kinect; void setup() { size(640, 480); // 画面サイズの設定 kinect = new SimpleOpenNI(this); // 初期化 kinect.enableIR(); // 赤外線画像の有効化 } void draw() { background(0); // 背景の初期化 kinect.update(); // データの更新 image(kinect.irImage(), 0, 0); // 描画 }. ■■ 人物領域の抽出  一般的なカメラを用いた人物領域の抽出では,緑. void setup() { size(640, 480); kinect = new SimpleOpenNI(this); kinect.enableRGB(); kinect.enableDepth(); kinect.setMirror(true); kinect.alternativeViewPointDepthToImage(); kinect.enableUser(SimpleOpenNI.SKEL_PROFIL E_ALL); } void draw() { background(255); kinect.update(); int[] userMap = null; int userCount = kinect.getNumberOfUsers(); if (userCount > 0) { userMap = kinect.getUsersPixels( SimpleOpenNI.USERS_ALL); } loadPixels(); for (int y=0; y<kinect.rgbHeight(); y++){ for (int x=0; x<kinect.rgbWidth(); x++){ int i = x + y * kinect.rgbWidth(); if (userMap != null && userMap[i] > 0) pixels[i]=kinect.rgbImage().pixels[i]; } } updatePixels(); }. 色で塗られた背景の前に人物を立たせて画像中の緑 色以外の領域を人物領域とする方法(クロマキー法) や,あらかじめ人物がいない状態で背景を撮影して.  simple-openni で は, 深 度 デ ー タ か ら 複 数 の. おき,人物が立ったときに変化があった領域だけ抽. ユ ー ザ を 検 出 し, ト ラ ッ キ ン グ を 行 う こ と が で. 出する方法(背景差分法)が用いられます.クロマ. き ま す. ユ ー ザ の ト ラ ッ キ ン グ を 有 効 化 す る に. キー法では緑色の服を着ることができない,背景差. は,enableUser() というメソッドを使います.引. 分法では照明条件が変わるとノイズが多くなるなど. 数 に SimpleOpenNI.SKEL_PROFILE_ALL を 与 え. の問題がありますが,Kinect の深度データに基づ. たときは全身のすべての部位を追跡します.ユー. く人物抽出ではそのような問題が起こらないのでと. ザトラッキング処理によって検出されたユーザの. ても有用です.. 数は getNumberOfUsers() で取得することができ.  カラー画像から人物領域だけを抽出するプログラ. ます.画面内にユーザが 1 人以上映っていれば,. 情報処理 Vol.53 No.8 Aug. 2012. 821.

(6) 小特集. 夏休み自作自習. getUsersPixels(SimpleOpenNI.USERS_ALL)によ って人物領域情報(ユーザ ID を画素値とする画像 データ)を得ることができます.このプログラムで は,画面上の画素ごとに人物領域情報(userMap) をチェックし, ユーザ ID が 0 よりも大きい画素(= ユーザがいる画素)のときに,カラー画像を画面に 描画しています.ここで特定のユーザ ID のときだ け描画するようにすれば,特定のユーザだけを表示 させることができます.  人物領域情報は深度画像に基づいて作成されます. その深度画像を撮影している赤外線カメラと,カラ. 図 -7 人物領域の抽出結果. ー画像を撮影している RGB カメラは視点の位置が 異なるため,単純に 2 つを重ねただけでは人物の 領域が一致しません.これを補正するために,alte. rnativeViewPointDepthToImage() というメソッド を setup() 関数内で実行しています.. 次回は.  setMirror() は画像のミラー反転(左右反転)を設.  はじめての Kinect プログラミングはいかがでし. 定するためのメソッドです.引数が true のときに. たでしょうか? 今回は Kinect からいろいろな画. 各種画像データが左右反転します.Kinect を使っ. 像データを取得する方法を紹介しました.次回は骨. たアプリケーションではカメラとユーザが向かい合. 格認識の方法について解説し,ジェスチャ認識を用. わせになるため,ミラー反転をかけたほうが何かと. いた応用作品を紹介します.どうぞお楽しみに.. 都合が良いです.. (2012 年 4 月 17 日受付).  映像から人物領域を抽出できるようになると,ゲ ーム画面の中に自分をそっくりそのまま登場させた り,遠隔地にいる人の姿を壁に投影して遠隔コミュ ニケーション(テレイグジスタンス)のアプリケー ションを作ったりというように応用の幅が一気に広 がります.. 822 情報処理 Vol.53 No.8 Aug. 2012. 橋本 直(正会員) [email protected]  2009 年九州工業大学大学院工学研究科博士後期課程修了.博士(工 学).同年より(独)科学技術振興機構 ERATO 五十嵐デザインインタ フェースプロジェクト研究員.人とロボットのインタフェースに関す る研究に従事..

(7)

参照

関連したドキュメント

災害に対する自宅での備えでは、4割弱の方が特に備えをしていないと回答していま

2021] .さらに対応するプログラミング言語も作

1 か月無料のサブスクリプションを取得するには、最初に Silhouette Design Store

回転に対応したアプリを表示中に本機の向きを変えると、 が表 示されます。 をタップすると、縦画面/横画面に切り替わりま

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

目的 これから重機を導入して自伐型林業 を始めていく方を対象に、基本的な 重機操作から作業道を開設して行け

太宰治は誰でも楽しめることを保証すると同時に、自分の文学の追求を放棄していませ

(自分で感じられ得る[もの])という用例は注目に値する(脚注 24 ).接頭辞の sam は「正しい」と