OpenCV 2.4.10 Vizの導入（Visual Studio 2013, C++, OpenCV, 3次元点群処理）

OpenCVのVizで3次元点群の表示や視点操作ができます。OpenGLみたいなもんです。（OpenGLを内側で呼び出してるみたいですけどね。VTKも使っているみたいです。）

Vizを使いたいけど、.exeでインストールしても入ってないので、自分でCMakeしました。その記録です。

# 実行環境
- Windows8.1
- Visual Studio 2013
- OpenCV 2.4.10
- PCL1.7.2 (VTK 5.10)

# インストール

①[ここ](http://opencv.org/downloads.html)からWindows版のOpenCV2.4.10（opencv-2.4.10.exe）をインストールしてください。展開したopencvフォルダを***C:\opencv2410***としてコピペしました。

②中身を見るとbuildとsourceフォルダがあると思います。

~~~
C:\opencv2410\build\include\opencv2
~~~

の中にvizっていうフォルダが入ってて欲しいんですが、ないと思います。CMakeを使ってインストールしましょう。

③[ここ](http://www.cmake.org/download/
)から、cmake-3.1.1-win32-x86.exeをダウンロードし、実行します。そして次のように設定します。

~~~
Where is the source code: C:/opencv2410/sources
Where to build the binaries: C:/opencv2410/build2
~~~

出力はbuildフォルダがすでにあるので、build2としました。
で、Configureを一度押すとずらーって設定が出てくるので、***WITH_VTK***に✓を入れてください。

![viz1.png](https://qiita-image-store.s3.amazonaws.com/0/63863/2ad93898-38ff-83b0-7290-5ddb49b4966e.png)

もう一度Configureを押すと、VTK_DIRの設定が出てくるのでVTKのフォルダを指定してください。[VTKのインストール](http://www.vtk.org/VTK/resources/software.html)

※私はPCL1.7.2を使っているので、自動的に

~~~
C:/Program Files (x86)/PCL 1.7.2/3rdParty/VTK/lib/vtk-5.10
~~~

が自動で選ばれました。PCL1.7.2のインストールは[こちら](http://unanancyowen.com/?p=712)(PCL 1.7.2 All-in-one Installer MSVC2013 Win32)

![viz2.png](https://qiita-image-store.s3.amazonaws.com/0/63863/d86b69dd-6025-a799-e672-c1b726593ac5.png)

最後に、GenerateをクリックするとOKです。

④***C:/opencv2410/build2***の中身を見てみると、***OpenCV.sln***があるので開いて、DebugモードとReleaseモードでビルド（Ctrl+Shift+B）してください。（C:\opencv2410\build2\modules\viz\opencv_viz.slnのみビルドしてもいいかもしれませんね）

![viz4.png](https://qiita-image-store.s3.amazonaws.com/0/63863/b597c643-b93d-234f-7bbd-ca561dd3e5f4.png)

DebugモードではPython27_d.libでエラーが出ましたがVizに関係ないので無視。Releaseモードでは、成功しました。（３回ビルドした）
![viz6.png](https://qiita-image-store.s3.amazonaws.com/0/63863/7ad4f558-1034-416d-e285-4a90a24f718e.png)

***C:\opencv2410\build2\bin***のDebugとReleaseからそれぞれ

- opencv_viz2410d.dll
- opencv_viz2410.dll

を***C:\opencv2410\build\x86\vc12\bin***へコピペしてください。

***C:\opencv2410\build2\lib***のDebugとReleaseからそれぞれ、

- opencv_viz2410d.lib
- opencv_viz2410.lib

を***C:\opencv2410\build\x86\vc12\lib***へコピペしてください。

⑤***C:\opencv2410\build\include\opencv2***の下に、***viz.hpp***を作成してください。中身は[ここ](https://github.com/Itseez/opencv/blob/master/modules/viz/include/opencv2/viz.hpp)にあります。

⑥***C:\opencv2410\sources\modules\viz\include\opencv2***の***vizフォルダ***を***C:\opencv2410\build\include\opencv2***へフォルダごとコピペしてください。

これで、準備が整いました。

# サンプルプログラムの実行

サンプルプログラムは[ここ](http://docs.opencv.org/trunk/doc/tutorials/viz/table_of_content_viz/table_of_content_viz.html)にあるので、試しに[Transformations](http://docs.opencv.org/trunk/doc/tutorials/viz/transformations/transformations.html#transformations)をやってみましょう。

①新しいプロジェクトを作成し、ソースをコピペしてください。

追加のインクルードディレクトリとライブラリディレクトリの設定を忘れないでください。

設定例は以下のようになっています。

- 追加のインクルードディレクトリ

~~~
$(OPENCV_DIR)\build\include;
~~~

- 追加のライブラリディレクトリ

~~~
$(OPENCV_DIR)\build\x86\vc12\lib;
~~~

システム環境変数の設定も忘れずに。(変更したら再起動！)

~~~
Path　%OPENCV_DIR%\build\x86\vc12\bin;
OPENCV_DIR　C:\opencv2410\
OPENCV_VER　2410
~~~

入力ライブラリの設定は[opencv_lib.hpp](http://qiita.com/SatoshiRobatoFujimoto/items/6899f7645c8bff99802d)をC:\opencv2410\build\includeの下に置き、

~~~
#include <opencv_lib.hpp>
~~~

で読み込みます。今回、Vizが増えたので、opencv_lib.hppに以下を追記します。

~~~
#pragma comment(lib, "opencv_viz"  CV_VERSION_STR CV_EXT_STR)
~~~

C:\opencv2410\sources\samples\cpp\tutorial_code\viz
からbunny.ply(うさぎの3D点群ファイル)をプロジェクトの下に持ってきます。

プロパティからDebuggingの設定で、引数のGまたはCを入力します。Gは視点がグローバル座標になり、Cはカメラ座標になります。
![viz8.png](https://qiita-image-store.s3.amazonaws.com/0/63863/06111894-a490-3b17-540c-c2b3d40ffd57.png)

実行するとこんな感じ。

- グローバル視点
![viz9.png](https://qiita-image-store.s3.amazonaws.com/0/63863/2cf30347-8cc2-dd71-2e01-22dd3f4d1eab.png)

- カメラ視点
![viz7.png](https://qiita-image-store.s3.amazonaws.com/0/63863/c4a9c0fc-c995-dd8b-9367-ba14dc09c3f4.png)


マウス操作で視点が変更できます。

- ドラッグで回転
- Shift+ドラッグで平行移動
- スクロールボタンでズーム

# まとめ
- OpenCVのVizを使って3次元点群（PLYファイル）とカメラ位置の表示ができた
- OpenCV2.4.9もOpenCV3.0Alpha、Betaも同じようにすればできると思う

[ソースコード](https://github.com/SatoshiRobatoFujimoto/viz_transformations)