yoppa.org


Blog

Kinect Hack 現状まとめ

追記 : ofxKinectを使用したデモを、今週末の日曜日、11月28日に行われる「TMUG,TKSC,PICnome合同忘年会」でやらせていただくことになりました。記事を読んで興味をもった方、ぜひお越しください。

マイクロソフトから発売された「Xbox 360」用に開発された「Kinect」というゲーム用コントローラが、いまアツい視線を浴びています。Kinectの特徴は、デバイスを手にもったり体に装置を装着することなしに、ジェスチャーや音声認識をすることがでるという点で、それをゲームのコントローラーとして利用しようとしているわけです。

ジェスチャーの認識機能の基本的なしくみは、Kinect前部にとりつけられたレンズのひとつから、レーザーのパターンを広範囲に照射して、そのパターンの粗さや幾何学的な歪み具合から、対象物の3D構造を認識しているようです。暗視モードでKinectを使用している部屋を撮影すると無数の赤外線レーザのパターンが照射されているのがわかります。

と、ここまでは一般的なゲームコントローラーの話題だったのですが、なぜKinectがここまで注目されているのかというと、本来は XBox 360 専用だったKinectセンサーなのですが、一般的なUSB接続を使用しているため、PCやMacなどに普通に接続することが可能です。発売から数日で世界中のハッカー達が集中的に解析して、KinectセンサーとXBox本体との通信の仕組みを、PCやMacで使用できるように移植したオープンソースのドライバを開発してしまったのです。

このことが「Kinect Hack」という新たなムーブメントを生みだし、発売から数日で様々な環境で簡単に使用できるようになってしまいました。僕が現時点で把握している範囲では以下のものがあるようです。

このように、様々な開発プラットフォームに移植されています。その勢いはものすごいものがあります。まさに、世界中のハッカー大集結といった様相です。

最近はすっかりopenFrameworksべったりの僕としては、やはりofxKinectを使ってみようということで、ここ数日いろいろ試しています。まず先程紹介した、TheoさんのGitのリポジトリから最新のofxKinectをダウンロードして、openFrameworksのappsフォルダ内にコピーすると、すぐにサンプルが実行できると思います。

このサンプルはKinectで認識した距離情報つきの動画(左上)を、OpenCVで解析して、物体を認識しています。普通のカメラで認識する場合と違って、特定の距離の形のみを抜きだすことができるのが画期的です。うまく調整すれば、キャプチャー画像のように手の形のみをきれいに抜き出すことなども可能となります。

この情報を利用して、例えばジェスチャーでパペットを操作するというような作品も可能となります。Theo Watsonさんによる素晴しい実例があります。

Interactive Puppet Prototype with Xbox Kinect from Theo Watson on Vimeo.

Theoさん作のofxKinectは、さすが良くできていて、クラスのメソッドを通じてKinectで検出した様々な情報にすぐにアクセスできるようになっています。例えば、

  • float getDistanceAt(int x, int y); – 指定した座標(x, y)の距離を計測してfloat型で返す
  • ofColor getCalibratedColorAt(int x, int y); – 指定した座標(x, y)のカメラで撮影した色を取得する

とういうようなものがあり、この2つの情報をあわせると、すぐに、やくしまるえつこ「ヴィーナスとジーザス」のような表現ができてしまうというわけです。

早速、プログラムしてみました。アドオンやプロジェクトファイルなど一式パッケージングしたものはこちらからダウンロードできます。ofKinectStudy.zip (Zip, 115.4KB)

testApp.h

#ifndef _TEST_APP
#define _TEST_APP

#include "ofMain.h"
#include "ofxOpenCv.h"
#include "ofxKinect.h"

class testApp : public ofBaseApp
{
    
public:
    
    void setup();
    void update();
    void draw();
    void exit();
    
    void keyPressed  (int key);
    void mouseMoved(int x, int y );
    void mouseDragged(int x, int y, int button);
    void mousePressed(int x, int y, int button);
    void mouseReleased(int x, int y, int button);
    void windowResized(int w, int h);
    
    ofxKinect kinect;
    float rotX, rotY;    
};

#endif

testApp.cpp

#include "testApp.h"

void testApp::setup()
{
    ofSetFrameRate(60);
    ofBackground(0,0,0);
    ofSetCircleResolution(12);
    
    rotX = 0;
    rotY = 0;
    
    kinect.init();
    kinect.setVerbose(true);
    kinect.open();
}

void testApp::update()
{
    kinect.update();
}

void testApp::draw()
{
    int step = 4;
    int calibrateX = 0;
    int calibrateY = 10;
    unsigned char * calibratedPixels = kinect.getCalibratedRGBPixels();
    ofTranslate(ofGetWidth()/2, ofGetHeight()/2);
    ofRotateX(rotX);
    ofRotateY(rotY);
    ofTranslate(kinect.width/2, kinect.height/2, 1000);
    for (int j = 0; j < kinect.height; j+=step) {
        for (int i = 0; i < kinect.width; i+=step) {
            float distance = kinect.getDistanceAt(i, j);          
            int colorPos = kinect.width * j * 3 + i * 3;
            ofSetColor(calibratedPixels[colorPos], calibratedPixels[colorPos+1], calibratedPixels[colorPos+2]);
            ofPushMatrix();
            ofTranslate(i - kinect.width, j - kinect.height, distance * -10.0);
            ofRotateX(-rotX);
            ofRotateY(-rotY);
            ofCircle(0, 0, step*0.4);
            ofPopMatrix();
        }
    }
}

void testApp::exit()
{
    kinect.close();
}

void testApp::keyPressed (int key){}
void testApp::mouseMoved(int x, int y){}

void testApp::mouseDragged(int x, int y, int button)
{
    rotX = float(y) / ofGetHeight() * 360 - 180;
    rotY = float(x) / ofGetWidth() * 360 - 180;
}

void testApp::mousePressed(int x, int y, int button){}
void testApp::mouseReleased(int x, int y, int button){}
void testApp::windowResized(int w, int h){}

実験の結果、こんな映像ができました。楽しいです。処理もすごくスムーズです。

ofxKinect study #05 from Atsushi Tadokoro on Vimeo.

今後も続々とKinect Hackの成果でてきそうです。最後に、いくつか参考になりそうなサイトをあげておきます。

というわけで、ぜひ皆さんもこのKinect Hackのビッグウェーブに乗りましょう!!

S.Hu — 24 September 2014 19:19
kinect.setVerbose(true); unsigned char * calibratedPixels = kinect.getCalibratedRGBPixels(); の部分で No member named ''in ofxKinect となってしまうのですが、どのようにすれば解決できるのでしょうか?
tado — 18 January 2011 19:43
「ofKinectStudy.zip」のファイル、openFrameworks.jpのフォーラム(http://openFrameworks.jp/forum/)で登録しないとダウンロードできない場所に置いてしまいました… 誰でもダウンロード可能な場所に移動しましたので、現在はダウンロード可能になったと思います。試してみてください。
A.O. — 18 January 2011 19:38
ofKinectStudy.zipファイルがリンク切れになっているようですので、もう一度サイト上に上げていただけないでしょうか?Kinect hack初挑戦です。よろしくお願いします。
shouhei taya — 24 November 2010 17:40
弊社ホームページ( http://www.tokyointeract.org )で紹介させていただきました。 Kinectに関する議論に加わっていただけたら幸いです。 よろしくお願いいたします。