MavericksでのOpenCVとOpenNI2のインストールとビルドテスト


## はじめに

OS X Mavericksになって、ひさしぶりにOpenCVとOpenNI2のインストールをしたので、そのメモを記録しておく。これまではSimpleOpenNI経由で、OpenNI_NITE_Installerを使った方が良かったりしたのが、すべてHomebrewでインストール可能になって、すっきりしたのは強調しておきたいところだ。また、大抵のブログでは、インストールまででビルド例が載っておらず、ライブラリのリンクパスなどを自分で調べることになって不便なので、そこまでしっかりとリマインダとして残しておく。

なお、OpenNI2をとりあえず使ってみたいだけの人には、Processing + SimpleOpenNiが面倒な作業が必要なく使いやすいので、おすすめ。

* https://code.google.com/p/simple-openni/

## インストール

すべてHomebrewでインストールできる。これからのサンプルビルドのために以下のソフトもインストールしておく。

* XCode Command Line Tools
* cmake

```
$ xcode-select --install
$ brew install cmake
```

なお、Homebrewを入れていない場合は以下のサイトからインストールすること。

* [Homebrew](http://brew.sh/)

MacPortsと違い、ネイティブのライブラリを極力使うことにしているので、インストール時間が短いということ、最近、はやりなので、思い切って使ってみては。詳しくは上記のサイトで

### OpenCVのインストール

Homebrewのデフォルトでは、opencvは入っていないので、scienceリポジトリをアクティベーションしてからインストールする。

```
$ brew tap homebrew/science
$ brew install opencv
```

### OpenNI2のインストール

OpenNI2も同様にデフォルトでは入っていないので、openniリポジトリしてからインストールする。

```
$ brew tap totakke/openni2
$ brew install openni2
```

Kinect for XBox360を使いたい場合は以下もインストールしておく。

```
$ brew install openni2-freenectdriver
```

原典は以下を参照のこと

* https://github.com/totakke/homebrew-openni2

## サンプルコードのビルド

以下は、OpenNI2とOpenCVの両方を使ったコードのサンプルファイルだ。以下に添付しているファイルを引用のように同じディレクトリに配置し、cmakeでビルドする。

> .
> ├── CMakeLists.txt
> └── main.cpp

```
$ mkdir build
$ cd build
$ cmake ..
$ make
```

ビルドが成功すれば、問題なし。以下、サンプルのソースファイルとcmakeの設定ファイルを添付する。

サンプルのソースファイルは、以下のサイトのソースを持ってきて、ubuntu用に修正したものだ。

* http://www.naturalsoftware.jp/blog/8001


```main.cpp
#include <OpenNI.h>
#include <opencv2/opencv.hpp>
#include <vector>
 
int main()
{
    try {
        openni::OpenNI::initialize();
 
        openni::Device device;
        int ret = device.open( openni::ANY_DEVICE );
        if ( ret != openni::STATUS_OK ) {
	 　　　　return -1;
        }
 
        openni::VideoStream colorStream;
        colorStream.create(device, openni::SENSOR_COLOR);
        colorStream.start();
 
        openni::Recorder recorder;
        recorder.create( "kinect.oni" );
        recorder.attach( colorStream );
        recorder.start();
 
        std::vector<openni::VideoStream*> streams;
        streams.push_back( &colorStream );
 
        cv::Mat colorImage;
 
        while ( 1 ) {
            int changedIndex;
            openni::OpenNI::waitForAnyStream( &streams[0], streams.size(), &changedIndex );
            if ( changedIndex == 0 ) {
                openni::VideoFrameRef colorFrame;
                colorStream.readFrame( &colorFrame );
                if ( colorFrame.isValid() ) {
                    colorImage = cv::Mat( colorStream.getVideoMode().getResolutionY(), 
                        colorStream.getVideoMode().getResolutionX(),
                        CV_8UC3, (char*)colorFrame.getData() );
                    cv::cvtColor( colorImage, colorImage, CV_BGR2RGB );
 
                    cv::imshow( "Color Camera", colorImage );
                }
            }
 
            int key = cv::waitKey( 10 );
            if ( key == 'q' ) {
                break;
            }
        }
    }
    catch ( std::exception& ) {
        std::cout << openni::OpenNI::getExtendedError() << std::endl;
    }
}
```

cmakeの設定ファイルは、スクラッチで書いた。OpenNI2のパスの探し方は自己流なので、適宜変更してほしい。大抵はPathsにヘッダとライブラリがあるパスを追加すれば動く。今回は、上述のように/usr/local/lib/ni2にライブラリを、/usr/local/include/ni2にヘッダファイルがあるという前提で設定を編集した。

```CMakeLists.txt
# -*- CMakeLists.txt -*-

cmake_minimum_required (VERSION 2.8)

 if(COMMAND cmake_policy)
 	cmake_policy(SET CMP0003 NEW)
 endif(COMMAND cmake_policy)

# プログラムの追加
add_executable(view main.cpp)

# CFLAGSの追加
set (CMAKE_CXX_FLAGS "-Wall -g -I${PROJECT_SRC_DIRECTORY}/include")

# LDFLAGSの追加
set (CMAKE_EXE_LINKER_FLAGS ${PLATFORM_LDFLAGS})

# ライブラリの追加
include_directories ( /usr/local/include/ni2 )
link_directories ( /usr/local/lib/ni2 )
find_package (OpenCV REQUIRED)

find_path(OpenNI2_INCLUDE_PATH NAMES OpenNI.h
  PATH_SUFFIXES ni2
  PATHS
    /usr/include
    /usr/local/include)

find_library(OpenNI2_LIBRARY NAMES OpenNI2 libOpenNI2
  PATHS
    /usr/lib
    /usr/local/lib
    /usr/local/lib/ni2)

target_link_libraries (view ${OpenCV_LIBS} ${OpenNI2_LIBRARY} stdc++)

# クリーン対象の追加
set_directory_properties (
  PROPERTIES
  ADDITIONAL_MAKE_CLEAN_FILES
  "*~"
  )
```