Kinect for Windows SDK C#サンプルプログラム

先日公開されたKinect for Windowsと、そのSDKですが、これまでKinectは研究用途で黙認状態でしたが、このKinect for Windows(Kinect本体)を使う事で商用が可能となるインパクトは大きく、これからもKinectを使ったアプリもどんどん出て来ると思います。

 

しかし、SDKはC#版とC++とがあり、C#なら簡単に出来るかな~?!と思ってもKinect for WindowsのSDKではC#とWPFを使うので、WPFをやった事がないと少し分かりづらいと思います。

 

そんなWPFなんて分からない!という人(私)向けにC#だけサンプルプログラムを作ってみました。

 

基本はC#+WPFのKinect Explorerのサンプルをベースにして、分かり易さ重視?!で音声部分や必要の無さそうな部分は削除しました。(エラー処理もあまり考えていません...)

 

作成したプログラムはこんな感じ↓

 

サンプルプログラムはこちら↓よりダウンロードして下さい。

Kinect for Windows SDK C#サンプル (Visual Studio 2010 C#)

 

このサンプルを実行するには別途、Kinect for WindowsのSDKをインストールしておく必要があります。

SDKはこちら↓のページよりダウンロード可能です。

http://www.microsoft.com/en-us/kinectforwindows/develop/overview.aspx

 

インストール方法については、他の人のページですが、このへん↓

 

Kinect3 -Kinect for Windows SDK

 

を参考にしてみて下さい。

 

ちなみに、このサンプルプログラムを作るのには、Kinect for Windows SDKのヘルプファイルのHow Tosの部分がともて参考になりました。

 

英語ですが一度、目を通して見てみて下さい。

 

n点からなる多角形の面積を求める

前回、3点からなる三角形の面積外積を用いて求めました。

これを多角形へ応用したいと思います。

 

まず、外積のおさらいから。

 

Z成分が0(ゼロ)の2つのベクトル

 

 

の外積は

 

 

となり、Z成分の大きさが2つのベクトルのなす平行四辺形の面積となり、三角形の面積はこの半分(1/2)となります。

 

さらに、ベクトルa から ベクトルb への向きが反時計方向の場合
ベクトルa と ベクトルb の外積のZ成分の値はとなり、

 

 

逆に時計方向の場合、Z成分はとなります。

 

 

これを踏まえて、3点からなる三角形の面積を求めるの時は三角形の辺上にベクトルを取りましたが、今回は原点と多角形の頂点の座標とで成すベクトルとします。

 

ここで、多角形の頂点の座標を~Pのように反時計方向に定義します。

ただし、Z座標は0(ゼロ)とします。

 

 

ベクトル→P と ベクトル→P の外積のZ成分の値は時計方向なので、となります。

 

 

同様に、ベクトル→P と ベクトル→P の外積のZ成分の値は反時計方向なので、となります。

 

 

ベクトル→P と ベクトル→P の外積のZ成分の値も反時計方向なので、となります。

 

 

これらの外積の結果のZ成分を足して1/2にすると、求めたい三角形の面積が求まります。

 

 

この事をn点からなる多角形へ応用すると、下図のような図形の場合、

 

 

~Pまでは時計方向となるので、外積のZ成分はとなります。

 

 

~P、Pまでは反時計方向となるので、外積のZ成分はとなります。

 

 

これら全ての外積のZ成分を足し、1/2にすると多角形の面積が求まります。

 

この事を一般式で書くと、頂点の座標をPi (xi,  yi) とすると

 

 

となります。
i は i = 1, 2, 3・・・nのインデックス番号、
|  | は絶対値です。

ただし、i = n のとき、n+1 = 1 とします。

 

また、絶対値を取っているのは、頂点の座標が時計方向へ割り振られた場合にも対応できるようにしています。

 

使える数学へ戻る

 

3点からなる三角形の面積を求める

外積を用いて三角形の面積を求める方法を紹介します。

 

まず、外積のおさらいですが、三次元ベクトルにおいて2つのベクトルの外積の大きさが2つのベクトルからなる平行四辺形の大きさに一致する特徴がありました。

 

この2つのベクトルのZ成分を0(ゼロ)にして二次元座標へ応用します。

2つのベクトルを

 

 

とすると、2つのベクトルの外積は、x成分とy成分は0(ゼロ)となり、z成分の大きさが平行四辺形の面積の大きさとなる事から、3点からなる三角形の面積は平行四辺形の半分の大きさとなり、

 

 

となります。

 

例題

3点、A(1, 3), B(3, 4), A(2, 6)からなる三角形の面積を求めよ。

 

解)

 

使える数学へ戻る

 

平面の方程式

下図のように点(x0, y0, z0を通り、法線ベクトルが

 

 

の平面の方程式は

 

 a(x-x0)+b(y-y0)+c(z-z0)=0

 

となり、一般に

 

 ax+by+cz+d=0

 

と表します。

 

 

 

なぜそうなるのか?というと、平面に垂直な法線ベクトルと、平面上の任意の2点からなるベクトルとは常に垂直である事から、法線ベクトルと、平面上の2点からなるベクトルとの内積の結果は常にとなります。

 

つまり、法線ベクトル(a, b, c)と平面上の2点のベクトル(x-x0, y-y0, z-z0の内積が0となるので、

 

 a(x-x0)+b(y-y0)+c(z-z0)=0

 

となり、これを展開したのが、平面の方程式

 

 ax+by+cz+d=0

 

となります。

 

平面は点が3つあれば求まるのですが、3点から平面の式を求めるには外積を用います。

 

外積では2つのベクトルの外積を求めると、2つのベクトルと外積の結果とは直交するという特徴があるので、下図のように

 

 

平面上の3点P0, P1, P2から、P0→P1P0→P2の2つのベクトルを作り、

 

 (x1-x0, y1-y0, z1-z0

 (x2-x0, y2-y0, z2-z0

 

外積を計算すると、法線ベクトルの各成分(a, b, c)

 

 a=(y1-y0)×(z2-z0)-(y2-y0)×(z1-z0)

 b=(z1-z0)×(x2-x0)-(z2-z0)×(x1-x0)

 c=(x1-x0)×(y2-y0)-(x2-x0)×(y1-y0)

 

となり、法線ベクトルの要素のa, b, cが求まるので、平面の方程式に3点P0, P1, P2のどれかを代入すると平面の方程式が求まります。

 

使える数学へ戻る

 

正規直交基底

正規直交基底はあまり馴染が無いように思いますが、フーリエ変換や主成分分析の理解をするには必要となってきます。

 

【定義】

ベクトルの大きさが1となり、互いのベクトル(任意の2つのベクトル)が
直交するベクトルの組合せ

 

となります。

 

ここで、ベクトルの大きさ(ノルム)がという事は、そのベクトルは単位ベクトルであり、
ベクトルが直交するということは、ベクトルの内積が0となる事を意味しています。

 

もっとも簡単な例として、二次元ベクトルの場合

 

 

上図のように、e1, e2

 

 

としたとき、この e1, e2 は正規直交基底である事は分かると思います。

 

ここで大事なのが、任意ベクトルe1 方向の大きさを, e2 方向の大きさをとすると、

 

各ベクトルの方向の大きさは内積で求まる!

 

という特徴があります。

 

上記の例では

 

e1方向の大きさ

 

a = e1 = X  × 1 + Y × 0= X

 

e2方向の大きさ

 

b = e2 = X  × 0 + Y × 1= Y 

 

となります。この処理を斜影と言います。

 

逆に

 

任意ベクトルは正規直交基底と各大きさを用いて表す事ができる!

 

という特徴もあります。

 

任意ベクトルを求めるには正規直交基底の各ベクトルとその大きさをかけて、ベクトルを足し合わせると求まります。

 

上記の例では

 

  任意ベクトル  = a  × e1 + b × e2
           = a × (1, 0)+ b × (0, 1)
           =  (a, b)

となりますが、この例はあまりにも単純な例なので、もう少しだけ具体的にして、ベクトルを

 

 = (4, 6)

 

正規直交基底を

 

 

とします。

 

 

このとき e1, e2 が正規直交基底であるかどうか?は、それぞれのベクトルの大きさと、内積を計算すると確認する事が出来ます。

 

 

また、このとき、

 

e1方向の大きさ

a = V ・e1 =

 

e2方向の大きさbは

b = V ・e2 =

 

となります。
逆にベクトルVを正規直交基底の e1,e2 とそれぞれの向きの大きさを用いて計算すると

 

 

となり、確かに正規直交基底を用いると任意ベクトルを表すことができそうです。

 

このことをもう少し一般化して、正規直交基底 e1,e2

 

 

としても、任意ベクトル を表すことはできます。

 

 

これをさらに三次元の場合でも、任意ベクトル を表すことができます。

 

 

このノリでさらにn次元の場合でも同様に正規直交基底をe1,e2・・・,eとしても、任意n次元ベクトル を表すことができます。

ということで、クドいですが、正規直交基底には

 

任意ベクトルを正規直交基底と各大きさを用いて表す事ができる!

 

という特徴があります。

 

それって、もうほとんどフーリエ変換の説明になっているのですが、お気づきでしょうか?
フーリエ変換についてはいづれ記事にしたいと思います。