【はじめての3Dセンサー】OpenNIのインストール

## はじめに

### この記事の内容

MacBookAir(モデル:MacBookAir6,2 macOS:10.12.6)にOpenNI2.2の動作環境を構築した時の自分用メモ。(2017/08現在)

#### あらすじ

偶然に「XTION PRO LIVE」(箱も説明もないむきだしの本体のみ)を入手。何も知らない状態から、スタートし、手探りでこれを動かしてみる企画。
[前回の調査](http://qiita.com/yagizo/items/280ef872ace5a93c4d62)でどいういうデバイスかはわかったので、これが手持ちのPCでちゃんと動作するかを確認するのが今回のゴール。


#### 対象読者

OpenNIの知識ゼロ(に近い)人には多少役に立つかも。

# OpenNI

どうやらいろいろ調べると、MacでXiton PRO LIVEを手っ取り早く動かすには、OpenNIを使って開発するのが手っ取り早いらしい(というか、それ以外の記事を見つけられなかった)。

## OpenNIって何？

Xtionのチップセットを作ったPrimeSense社が中心となって開発したオープンソースのライブラリ。OpenNIを通じて、KinectやらXtionの機能にアクセスすることができる。
バージョン1系と2系が存在し、アーキテクチャが異なる。ver.2.2.0.33が最新(かつ最後?)のバージョンのようだ。

## 事件？

衝撃的なことに、2014年、PrimeSense社がAppleに買収されたことにより、開発は止まっちゃったみたい。
(周りで急に冷めた感じになってたのはそういうことだったのか)

世の中に散在する割と熱い人たちの書いたインストール記事は、オフィシャルサイトからのダウンロードから始まるんだけど、現在そのリンク先はAppleのサイトにリダイレクトされて存在しない。
※幸いなことに、オープンソースなのでコードはGitHubに残っている。また色々な人が(おそらく自分用?)ダウンロードして使えるように、保存・公開しているので、とりあえず大丈夫そう。

* https://github.com/OpenNI

## インストール

いろいろ探した結果、以下のサイトから

* [OpenNI 2 SDK Binaries & Docs　- STRUCTURE](https://structure.io/openni)

macOS用のファイル(OpenNI-MacOSX-x64-2.2.0.33.tar.bz2)を一式ダウンロードした。

ファイルを展開して、おまじないを実行し、

```
$ tar jxvf OpenNI-MacOSX-x64-2.2.0.33.tar.bz2
$ cd OpenNI-MacOSX-x64-2.2
$ ./install.sh
```
あとは環境変数を読み込んで

```
$ . ./OpenNIDevEnvironment
```

準備OK。

### 動作確認

一式の中に含まれるサンプル(SimpleViewer)をビルドして、Xtion PRO LIVEが動作することを確認する。

```
$ cd Samples/SimpleViewer
$ make
```

手元の環境のC++コンパイラではワーニングでビルドが中断するので、Makefile(24行)に-Wno-deprecatedオプションをつけて静かにしてもらう。

```
CFLAGS += -Wall -Wno-deprecated
```
気を取り直して

```
$ make
c++ -x c++ -c -arch i386 -arch x86_64 -msse3 -DMACOS -Wall -Wno-deprecated -O2 -DNDEBUG -I../../Include -I../../ThirdParty/GL/ -I../Common -I/Users/yagizo/Project/OpenNI2/Include  -fPIC -fvisibility=hidden -Werror -o Bin/Intermediate/x64-Release/SimpleViewer/Viewer.o Viewer.cpp
c++ -x c++ -c -arch i386 -arch x86_64 -msse3 -DMACOS -Wall -Wno-deprecated -O2 -DNDEBUG -I../../Include -I../../ThirdParty/GL/ -I../Common -I/Users/yagizo/Project/OpenNI2/Include  -fPIC -fvisibility=hidden -Werror -o Bin/Intermediate/x64-Release/SimpleViewer/main.o main.cpp
cp -R /Users/yagizo/Project/OpenNI2/Redist/* Bin/x64-Release
c++ -o Bin/x64-Release/SimpleViewer ./Bin/Intermediate/x64-Release/SimpleViewer/Viewer.o ./Bin/Intermediate/x64-Release/SimpleViewer/main.o -arch i386 -arch x86_64 -framework OpenGL -framework GLUT  -LBin/x64-Release -lOpenNI2 -Wl,-rpath ./
```
無事ビルドできたみたいなので、Xtion PRO LIVEをUSB接続して、ドキドキしながら実行してみる。

```
$ cd Bin/x64-Release/
$ ./SimpleViewer 
After initialization:

```
あ、なんか出た。

![simpleviewer.png](https://qiita-image-store.s3.amazonaws.com/0/55900/cf9878c4-4837-e496-598f-c226e3d89d21.png)

とりあえずデバイス自体は壊れていないみたいなので、一安心。

### pythonからの呼び出し

#### Pythonで使いたい

後々のためにPythonからも呼び出して使いたいなぁと思っていたら、GitHubにいい記事があったので、

* [Python OpenNI2](https://github.com/eiichiromomma/CVMLAB/wiki/Python-OpenNI2)

これに習って、pyenvで適当な環境を作り、pipでprimesenseをいれておいた。同記事のサンプルコードを実行し、何となく動いていそうなので、今回はこれで良しとする。

## NiTE

大体の記事で、OpenNI2と併せてNiTE２というパッケージを利用。この組み合わせがお約束みたい。

### NiTEって何？

OpenNI2がXtionのセンサーインターフェースと仲介するデバイスドライバー的な役割を担っているのに対して、NiTE2は、ユーザー認識やスケルトン認識といった入力をある程度意味解釈してくれるミドルウェア的なパッケージ。バージョンは２系が最新。

OpenNI2でXtionを制御しつつ、NiTE2を通じて人の動きを解釈して、やりたいことをアプリケーションで実現するのが、正解のよう。

### NiTE2のインストール

こちらもOpenNI2の時と手順は一緒。
パッケージを取得して、展開し、内包のおまじない（install.sh）を唱え、環境変数を読み込んであげれば使えるようになる。


## 次にやること

環境構築は何となくできたようなので、 [次回](https://qiita.com/yagizo/items/94fd7e00f461703eab55) は簡単なコーディングを試したい。いろいろ調べたところ、ちょっと古いけど、

* [OpenNI 3Dセンサープログラミング](https://www.amazon.co.jp/gp/product/4798039160/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798039160&linkCode=as2&tag=riceproject0c-22&linkId=c26053198626faa2b1a737e3937bd549)

という本があるみたいなので、こちらを入手して理解を深めたい。


## 付録

### 参照リンク

* [OpenNI - Kinect-wiki](http://www.kinect-wiki.info/OpenNI)
* [オープンソースのKinectドライバOpenNI、提供終了へ。Appleによる買収が影響？ - スラド](https://opensource.srad.jp/story/14/03/04/046241/)
* [キネクトでモーション作成](http://www.drf.co.jp/liveanimation/wiki/index.php?%E3%82%AD%E3%83%8D%E3%82%AF%E3%83%88%E3%81%A7%E3%83%A2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3%E3%83%BC)

#### OpenNIを入手できそうなところ
* https://github.com/voxels/Raw
* http://unanancyowen.com/openni-archives/
* https://github.com/totakke/homebrew-openni2