ubuntu12.04でOpenCVとOpenNI2のインストール


## はじめに

Ubuntu12.04でのOpenCVやOpenNIのインストールに関するドキュメントは、だいたいインストールまででビルドに関する情報が抜けている場合が多い。リマインダのためにインストールからサンプルのビルドまでの行程をまとめる。

## インストール

ビルドやパッケージ取得に必要なソフトをインストールする。

```
$ sudo apt-get install -yV build-essential git cmake
```

### OpenCVのインストール

opencvはapt-getでインストールできる。

```
$ sudo apt-get install -yV libcv-dev libhighgui-dev libcvaux-dev python-opencv opencv-doc
```

### OpenNI2のインストール

いろいろと調べたが、apt-getでのインストールは難がありそうなので、githubからソースを持ってきてビルドするのが素直だと思う。詳細は、githubのREADMEに書いてあり、以下はそのインストラクションの中のlinux版のインストラクションの抜粋・作業記録になる。

* https://github.com/OpenNI/OpenNI2

```
$ sudo apt-get install -yV g++ python libusb-1.0.0-dev libudev-dev openjdk-6-jdk freeglut3-dev doxygen graphviz 
$ git clone https://github.com/OpenNI/OpenNI2.git
$ cd OpenNI2
$ make
```

問題なく、ビルドが出来たら以下の手順でインストールをおこなう。i686、x86_64のどちらかかわからないので、unameで確認しておこう。

```
$ uname -a
Linux vagrant-ubuntu-precise-32 3.2.0-55-generic #85-Ubuntu SMP Wed Oct 2 13:43:27 UTC 2013 i686 i686 i386 GNU/Linux
```
例は、vagrantでインストールしたx86用(i686)の仮想環境なので、x86環境のパッケージを作成し、適当な場所にインストールする。

```
$ cd Packaging
$ python ./ReleaseVersion.py x86
$ cd OpenNI-Linux-x86-2.2
$ cp -a Include /usr/local/include/ni2
$ cp -a Redist /usr/local/lib/ni2
```

なお、ReleaseVersion.pyには、[x86|x64|arm|android]のオプションがあるので、プラットフォームによって変更しよう。OpenNI-Linux-x86-2.2のようなディレクトリが作成される（リリースのバージョンやアーキテクチャでディレクトリ名がかわるので注意すること）。

この例では、/usr/localのプレフィックスの下にni2というディレクトリ下にヘッダファイルとライブラリを配置する。なお、これはOS Xのhomebrewでインストールする場合と同じパスにしただけで、他に適当なパスを指定しても良い。

## サンプルのビルド

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

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

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

ビルドが成功すれば、問題なし。テスト環境で実施した場合は、-lopencv_gpuが見つからないというエラーがでた。libopencv_gpu.soのインストールされているパスは、/usr/libの下だ。lsで調べてみると

```
$ ls /usr/lib/libopencv_gpu*
/usr/lib/libopencv_gpu.so.2.3  /usr/lib/libopencv_gpu.so.2.3.1
```

と/usr/lib/libopencv_gpuへのリンクがない。そのため、リンクを追加する。

```
$ sudo ln -s /usr/lib/libopencv_gpu.so.2.3 /usr/lib/libopencv_gpu.so
```
もう一度ビルドすると成功した。以下、サンプルのソースファイルと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
  "*~"
  )
```