OpenCV 3.4 contribで導入されたovisを無理やり動かした

# はじめに
OpenCV 3.4 がでました！！じゃあ、その記事を書くしかないじゃないですか、やったーー！！ということで、**OpenCV Advent Calender 26日目** の記事です！

# OpenCV 3.4 contribに、ovisというモジュールが増えた。
あれ？何か新しいモジュールが生えている。ということは調査しないとだめですね！

確認したところ、11/3 からですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89434/6e6b569f-6421-a874-af15-f793062312c5.png)

https://github.com/opencv/opencv_contrib/commits/master/modules/ovis/README.md

実装上、OpenGL3がRenderSystem固定になっているので、それが使える環境じゃないとだめですよー。

## ovis とは？
ovis moduleのREADMEより
> allows you to render 3D data using the OGRE 3D engine and obtain the rendering as cv::Mat

つまり、3DデータをOGRE 3Dエンジンでcv::Matへレンダリングすることができる、っていう話ですね。

## OGRE 3Dエンジンとは？
https://ja.wikipedia.org/wiki/OGRE

> OGRE (Object-Oriented Graphics Rendering Engine) は、シーン指向の柔軟な3次元レンダリングエンジンで、ハードウェアアクセラレーションを活用した3Dグラフィックスのアプリケーションを容易に開発できるよう設計されC++で書かれている。

## 何ができるようになるのか？
3Dモデルを画像に浮かばせられるので、ARがやりやすくなりますね！サンプルコードは、arucoとの連携をやってますね！

# 早速、contribをコンパイルしてみよう(失敗編)
> Ubuntu 17.04 環境
> libreoffice 抹消
> $ sudo apt install git
> $ git clone (OpenCVとcontrib)
> $ sudo apt install cmake

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89434/5c2858f0-8f11-60f0-4407-b2051f656dc0.png)

ですよねー。じゃ、必要なライブラリを入れてと…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89434/16471f54-27b7-8a99-12bb-c0d7f4af1627.png)

で、ここまでの問題点。

OGRE 1.10が必要なのに、Ubuntu 17.04だと、OGREが1.9までしかリリースされていない。ということは、、、OGREのインストールかｒあやってみよー

# OGREをインストールしましょう
(最終的にはいろいろ入れていますので…）

> $ sudo apt install freetype
> $ sudo apt install freeglut3-dev libglew1.5-dev
> $ sudo apt install libzzip-dev
> $ sudo apt install libxaw7-dev

下からソースコードをダウンロード。

> https://www.ogre3d.org/download/sdk

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89434/b95a3ee5-746b-5e30-d10a-261b5e01c740.png)

展開して、cmake っと…… 。なぜかこのタイミングで必要なライブラリが入っていないとZZIPだのfreetypeのbuild始めましたね。この時 mkdir build してきれいにやろうとしたら「FreeTypeがない」などといわれたので、もしかすると環境汚れるのを覚悟しないとダメみたいですね。とりあえずトライアルアンドエラーで試してなんとか動かした。

> $ cmake .

x11などがないとこういう画面

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89434/65820ecb-c3f8-b3d1-48f9-a74ffbf75bf6.png)

Makefileできたのでコンパイルする。

> $ make -j 8
> $ sudo make install

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89434/00fa639f-3d32-779e-9565-fb387b4a80a7.png)

どうやら、入ったっぽい。

# 早速、contribをコンパイルしてみよう(再チャレンジ編)

> $ cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules/ ../opencv

これでいけるはず…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89434/df52be85-f6cd-23fc-4f0c-0608f58a3167.png)

> $ make -j 8
> $ sudo make install

# デモを作ろう

Makefile
> a.out : a.cpp
	g++ -g a.cpp `pkg-config zziplib OGRE opencv --cflags --libs` `

で、こうなった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89434/c7c41680-fbb2-3162-0e0f-deaa85fc5a8b.png)

ソースコードはこんな感じ。テストデータは、OGREのソースコードの中にあるものを拝借したよ！

``` a.cpp
#include <cv.hpp>
#include <opencv2/ovis.hpp>

int main()
{
  cv::ovis::addResourceLocation("packs/Sinbad.zip");
  // camera intrinsics
  cv::Size imsize (800, 600);
  cv::Mat K = (cv::Mat_<double>(3,3) << 1200,   0,  0, 
                                          0, 900,  0, 
                                          0,   0,  1);

// observer scene
  cv::Mat tvec  = (cv::Mat_<double>(3,1) << 0 , 0 , 0 );
  cv::Mat rot   = (cv::Mat_<double>(3,3) << 1.57 , 0 , 0 , 0 , 0, 0, 0, 0 ,0 );
  cv::Mat tvec2 = (cv::Mat_<double>(3,1) << 30 , 0 , -100 );
  cv::Mat tvec3 = (cv::Mat_<double>(3,1) << 0 , 0 , -150 );

  cv::Ptr<cv::ovis::WindowScene> owin = cv::ovis::createWindow("VR", imsize);
  cv::ovis::createGridMesh("ground", 
       cv::Size(10.0f, 10.0f), cv::Size(10, 10));
  owin->createEntity("ground", "ground", tvec,rot );
  owin->createCameraEntity("cam", K, imsize, 3.0);
  owin->createEntity("figure", "Sinbad.mesh", tvec2 );
  // externally defined mesh
  owin->createLightEntity("sun", tvec3 );

  // interaction scene
  cv::Ptr<cv::ovis::WindowScene> iwin = cv::ovis::createWindow("AR", imsize, 
     cv::ovis::SCENE_SEPERATE | cv::ovis::SCENE_INTERACTIVE);

  iwin->createEntity("figure", "Sinbad.mesh", tvec2 );
  iwin->createLightEntity("sun", tvec3 );
  iwin->setCameraIntrinsics(K, imsize);

  while ( cv::ovis::renderOneFrame() )
  {
    cv::Mat R;
    cv::Mat t;
    iwin->getCameraPose(R, t);
    owin->updateEntityPose("cam", t, R);
  }

  return 0;
}
```


以上で、OpenCV Advent Calendar 2017は終了となります！年末の忙しい折にも関わらず、投稿いただいた皆様、閲覧いただいた皆様、ありがとうございました！それでは、来年もよい一年になりますように！！


# デモを動かそう（失敗編）

デモを動かすのに必要になりそうなライブラリを一式インストール
ダメぽ……というか、python有効じゃない？

> $ sudo apt install python-numpy
> $ sudo apt install python3-numpy
> $ sudo apt install python3-dev

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89434/198cce5e-3cb0-a459-21fd-428cc4673583.png)

**あとで気が付いたが、cmakeしなおすときにキャッシュ削除してなかったため、ダメだったと**