rs_bag2imageを使う(Ubuntu18.04 pyenvの環境で)

bagファイルから画像ファイルを作成することができるツールであるrs_bag2imageを使えるようにする。
基本的に下の公式サイトに書かれている環境を作成する。
https://github.com/UnaNancyOwen/rs_bag2image
私の環境では既にGCCのバージョンとCMakeのバージョンは適切であるため今回はRealSense2 SDKとOpenCVのインストールを行う。

# 環境
・Ubuntu 18.04
・pyenv (python3系とpython2系の環境)

# 手順
1. IntelRealsense2SDKのインストール
2. OpenCVのインストール
3. rs_bag2imageを使う

# IntelRealsense2SDKのインストール
以下のサイトの手順に従ってgitからダウンロードしたソースコードをもとに環境構築を行う。
http://www1.meijo-u.ac.jp/~kohara/cms/technicalreport/ubuntu1804_realsense

**1.インストールのための準備**

```
$ sudo apt install libssl-dev libusb-1.1.0-dev pkg-config libgtk3-dev pkg-config libglfw3-dev libgl1-mesa-libglu1-mesa-devdev
```

**2.RealSense2 SDKのソースからのビルド**
homeディレクトリ直下のgithubというディレクトリ内にソースのダウンロードを行う。

```
$ cd
$ cd github
$ git clone https://github.com/IntelRealSense/librealsense
$ cd librealsense
$ mkdir build & cd build
$ cmake .. -DBUILD_EXAMPLES=true
$ make
$ sudo make install
$ sudo ldconfig
```
**3.動作確認**
realsenseカメラを接続した後、以下のコマンドによりveiwerが立ち上がり、映像が確認できるれば成功

```
$ realsense-viewer
```

# OpenCVのインストール

githubからダウンロードしたソースコードをもとに環境を構築する。
以下のサイトの手順をもとに行った。
https://qiita.com/tetsu_koba/items/7487fc5fa258f683122b

**1.準備**

```
$ sudo apt-get install libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev
```

**2.ソースコードのダウンロード**

```
$ git clone https://github.com/Itseez/opencv.git
$ git clone https://github.com/Itseez/opencv_contrib.git
```


**エラーに対する対処**
ビルドする際に以下の２つのエラーがはっせいしたため、その解決を行う。
・ModuleNotFoundError: No module named ‘_ctypes’でcmakeが失敗する。
・cmakeを実行した際にpython3の環境へOpenCVがインストールされない。

**ModuleNotFoundError: No module named ‘_ctypes’でcmakeが失敗する。**
以下のサイトを参考にした。
https://katsuwosashimi.com/archives/371/python-pip-uwsgi-ctypes-not-found/

以下のコマンドでlibffiをインストールした後にpythonを再度インストールすることで解決することができる。

```
$ sudo apt install libffi-dev
```

**cmakeを実行した際にpython3の環境へOpenCVがインストールされない。**

以下のサイトを参考にした。
https://qiita.com/shinsumicco/items/4dd5c6a6cccf246da818

pyenvでPython環境をインストールする際にshared libraryを導入することでOpenCVのビルド時に参照できるようにする。
pyenv install時に以下の環境変数を設定してインストールを行う。

```
$ CONFIGURE_OPTS="--enable-shared" pyenv install <version_to_install>
```
CMake時のパス設定

私の環境ではpyenvの環境が以下のようになっているため

```
$ pyenv versions

  system
* 3.6.7 (set by /home/houjou/.pyenv/version)
```
次のようにCMake時のオプションの設定を行った。

```
$ cd opencv
$ mkdir build
$ cd build/
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=/home/houjou/shunsk_ws/workspace/opencv_contrib/modules -D BUILD_opencv_python3=ON -D BUILD_opencv_python2=OFF -D PYTHON3_EXECUTABLE=/home/houjou/.pyenv/versions/3.6.7/bin/python -D PYTHON3_PACKAGES_PATH=/home/houjou/.pyenv/versions/3.6.7/lib/python3.6/site-packages -D PYTHON3_INCLUDE_DIR=/home/houjou/.pyenv/versions/3.6.7/include/python3.6m -D PYTHON3_NUMPY_INCLUDE_DIRS=/home/houjou/.local/lib/python3.6/site-packages/numpy/core/include -D PYTHON3_LIBRARY=/home/houjou/.pyenv/versions/3.6.7/lib/libpython3.6m.so -D WITH_CUBLAS=OFF -D OpenBLAS_FOUND=OFF INSTALL_PYTHON_EXAMPLES=ON -D INSTALL_C_EXAMPLES=ON  -D OPENCV_ENABLE_NONFREE=ON -D BUILD_EXAMPLES=ON -D ENABLE_PRECOMPILED_HEADERS=OFF -D BUILD_TESTS=OFF ..
```
これらのオプションを設定することで指定したPython環境にインストールすることができる。
参考にしたサイト通りにパスの設定をコマンドによって記述しても良いが、私はそれでエラーが起きたため絶対パスをそのまま記述した。
CMake後の出力は以下のようになった。

```
-- 
--   Python 3:
--     Interpreter:    　　　        /home/username/.pyenv/versions/3.6.7/bin/python (ver 3.6.7)
--     Libraries:                   /home/username/.pyenv/versions/3.6.7/lib/libpython3.6m.so (ver 3.6.7)
--     numpy:                       /home/username/.local/lib/python3.6/site-packages/numpy/core/include (ver 1.18.2)
--     install path:                /home/username/.pyenv/versions/3.6.7/lib/python3.6/site-packages/cv2/python-3.6
-- 
--   Python (for build):            /usr/bin/python2.7
-- 
--   Java:                          
--     ant:                         NO
--     JNI:                         NO
--     Java wrappers:               NO
--     Java tests:                  NO
-- 
--   Install to:                    /usr/local
--
```

**3.ビルド&インストール**
エラーの対処時にCMakeを実行した後は、buildディレクトリの中で以下の通りに進める。

```
$ make -j4
$ sudo make install
```
-jの後の数字はプロセッサのコア数によって変更する。
以下のコマンドでプロセッサのコア数を確認することができる。
```
$ nproc
```
OpenCVがインストールされたかどうかは以下のコマンドでバージョンが表示されれば成功です。

```
$ python -c "import cv2; print(cv2.__version__)"

4.3.0-dev
```

# rs_bag2imageを使う

**1.ソースコードのダウンロード**
githubからソースコードをダウンロードする。

```
$ git clone https://github.com/UnaNancyOwen/rs_bag2image.git
```

**2.ビルド**
ビルドして実行ファイルを作成する。

```
$ cd rs_bag2image/rs_bag2image/
$ mkdir build
$ cd build/
$ cmake ..
$ make
```
make実行時に私の環境では以下のエラーが発生した。

```
[ 33%] Building CXX object CMakeFiles/rs_bag2image.dir/realsense.cpp.o
/home/usrname/my_workspace/src/rs_bag2image/rs_bag2image/realsense.cpp: In member function ‘void RealSense::updateInfrared()’:
/home/usrname/my_workspace/src/rs_bag2image/rs_bag2image/realsense.cpp:246:14: error: ‘class rs2::frameset’ has no member named ‘foreach’; did you mean ‘foreach_rs’?
     frameset.foreach( [this]( const rs2::frame& frame ){
              ^~~~~~~
              foreach_rs
CMakeFiles/rs_bag2image.dir/build.make:62: recipe for target 'CMakeFiles/rs_bag2image.dir/realsense.cpp.o' failed
make[2]: *** [CMakeFiles/rs_bag2image.dir/realsense.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/rs_bag2image.dir/all' failed
make[1]: *** [CMakeFiles/rs_bag2image.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

```
realsense.cppの中身の以下の一行を

```
frameset.foreach( [this]( const rs2::frame& frame ){
```
次の一行に書き換えた。

```
frameset.foreach_rs( [this]( const rs2::frame& frame ){
```
その後、再度makeを行うと実行ファイルが作成される。


**3.rs_bag2imageを使う**

bagファイルがあるディレクトリで以下のコマンドを使う。

```
$ sudo ./build/rs_bag2image -b="output.bag" -s=true -d=true
```

私がコマンド実行時には、画像ファイルが作成されなかった。
realsense.cpp内の以下の一行を自分が指定したディレクトリまでの絶対パスで書き換えた。

```
directory = bag_file.parent_path().generic_string() + "/" + bag_file.stem().string();
```
```
directory = "/home/usrname/my_workspace/src/rs_bag2image/rs_bag2image/output";
```
書き換えたときは

```
$ rm -rf build
$ mkdir build
$ cd build/
$ cmake..
$ make
```
を再度行うことで実行ファイルを再び作成できる。

# 最後に
説明などを端折ってしまっているところが多々あるので、それぞれ参考にしたサイトを確認していただければ分かりやすいと思います。