OpenCV 3.0 ビルド

久しぶりにOpenCVをビルドをしたら「こんなに難しかったっけ・・・」と思ったので、今後のためにメモを残します。

いろいろなWebの記事をみるとNuGetとか公式サイトのを使えばいいよと書かれていたので、それでもいいのかもしれませんが。

ていうか3.1が出ててわろた

概要
===
- 2015/12/21時点で最新のを使います。
- Visual Studio 2015 Update 1を使ってビルドします。


ビルドの対象:
---
- OpenCV 3.0.0 (gitから取得)
- OpenCV contrib (gitから取得)
- Qt 5.5.1 (OpenSource用、MSVC2013 64)

OpenCV 3.0.0からはnonfree(SIFTとかSURFとか)が付属しておらず、contribという別のソースコードを合わせないといけないそうです。

OpenSource用でないとQt 5.5.1 MSVCのバイナリがありませんでした。（Msysのバイナリでできるかどうかちょっとわかりません。）

あと、eigenというのを使ってみたいなと思ったのですが、コンパイラがこけてしまうのでやめました。

githubソースコードとQtバイナリの取得元はこちら:
---
- https://github.com/Itseez/opencv
- https://github.com/Itseez/opencv_contrib
- http://www.qt.io/

CMAKE GUI設定
===
Generator：
---
Visual Studio 14 2015 Win64

ソースコードのパスとビルドのパス：
---
- source code: C:/Users/***/Downloads/opencv-master/opencv-master
- build binary: C:/Users/***/lib/vs14/64/opencv300

各種設定:
---

OPENCV:

```
OPENCV_EXTRA_MODULES_PATH:PATH=C:/Users/***/Downloads/opencv_contrib-master/opencv_contrib-master/modules
```


QT関連:

```
QT_QMAKE_EXECUTABLE:FILEPATH=C:/Qt/Qt5.5.1/5.5/msvc2013_64/bin/qmake.exe
Qt5Concurrent_DIR:PATH=C:/Qt/Qt5.5.1/5.5/msvc2013_64/lib/cmake/Qt5Concurrent
Qt5Gui_DIR:PATH=C:/Qt/Qt5.5.1/5.5/msvc2013_64/lib/cmake/Qt5Gui
Qt5OpenGL_DIR:PATH=C:/Qt/Qt5.5.1/5.5/msvc2013_64/lib/cmake/Qt5OpenGL
Qt5Widgets_DIR:PATH=C:/Qt/Qt5.5.1/5.5/msvc2013_64/lib/cmake/Qt5Widgets
Qt5Core_DIR:PATH=C:/Qt/Qt5.5.1/5.5/msvc2013_64/lib/cmake/Qt5Core
Qt5Test_DIR:PATH=C:/Qt/Qt5.5.1/5.5/msvc2013_64/lib/cmake/Qt5Test
```

ついでにPYTHON関係:

```
PYTHON3_EXECUTABLE:FILEPATH=C:/Users/***/AppData/Local/Programs/Python/Python35/python.exe
PYTHON3_INCLUDE_DIR2:PATH=
PYTHON3_INCLUDE_DIR:PATH=C:/Users/***/AppData/Local/Programs/Python/Python35/include
PYTHON3_LIBRARY:FILEPATH=C:/Users/***/AppData/Local/Programs/Python/Python35/libs/python35.lib
PYTHON3_LIBRARY_DEBUG:FILEPATH=PYTHON_DEBUG_LIBRARY-NOTFOUND
PYTHON3_NUMPY_INCLUDE_DIRS:PATH=C:/Users/***/AppData/Local/Programs/Python/Python35/lib/site-packages/numpy/core/include
PYTHON3_PACKAGES_PATH:PATH=C:/Users/***/AppData/Local/Programs/Python/Python35/Lib/site-packages
```

CMakeLists.txt修正:
---
Qt関連の修正をします。
変更内容は：

- QStringでエラーが出たので、QT_COMPILING_QSTRING_COMPAT_CPPを定義しておきます。
- CMP0020 をcmakeのポリシーとして指定するといいらしいので、書いておきます。

Qt関連の修正のほかに、既存のCMAKE_CXX_FLAGSに使用不能なオプション -Wextra が含まれているので、それを取り除きます。

```cmake
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wextra -pedantic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -pedantic")
```


以下の2行をとりあえずファイルの先頭に書きました。
2つのファイルとも同じ内容です。

C:\Users\***\Downloads\opencv-master\opencv-master\modules\highgui\CMakeLists.txt に追記：

```cmake
cmake_policy(SET CMP0020 NEW)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /DQT_COMPILING_QSTRING_COMPAT_CPP")
```

C:\Users\***\Downloads\opencv_contrib-master\opencv_contrib-master\modules\cvv\CMakeLists.txt に追記：

```cmake
cmake_policy(SET CMP0020 NEW)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /DQT_COMPILING_QSTRING_COMPAT_CPP")
```


プログラム修正
===
Visual Studio 2015では、C++11の統一初期化記法(Uniform Initialization)がつかえないみたいなので、それを全部直します。
（直す場所は、Visual StudioコンパイラがコンパイルエラーC2059やC2334として教えてくれます^_^）

before:

```cpp
	MatchCallTab(const cvv::impl::MatchCall& matchCall, const QString& matchViewId)
		: MultiViewCallTab<cvv::view::MatchView, cvv::impl::MatchCall>{
			  matchCall, matchViewId, QString{ "default_match_view" }, QString{ "LineMatchView" }
			}
	{
		oldView_ = view_;
		connect(&this->viewSet, SIGNAL(signal()), this, SLOT(viewChanged()));
	}
```

after:

```cpp
	MatchCallTab(const cvv::impl::MatchCall& matchCall, const QString& matchViewId)
		: MultiViewCallTab<cvv::view::MatchView, cvv::impl::MatchCall>(
			  matchCall, matchViewId, QString( "default_match_view" ), QString( "LineMatchView" )
			)
	{
		oldView_ = view_;
		connect(&this->viewSet, SIGNAL(signal()), this, SLOT(viewChanged()));
	}
```

stringutils.cppのウムラウト記号の場所でコンパイルエラー(C2001、C3688)になるので、コメントアウトします。

```cpp
	static std::map<QString, QString> replacements3 = { { "EV", "AF" },
		                                            //{ "Ü", "A" },
		                                            //{ "Ö", "A" },
		                                            //{ "Ä", "A" },
		                                            { "O", "G" },
		                                            { "Z", "S" },
		                                            { "M", "N" },
		                                            { "KN", "N" },
		                                            { "K", "C" },
		                                            { "SCH", "SSS" },
		                                            { "PH", "FF" } };

```

参考文献：
---
- http://stackoverflow.com/questions/27418668/nonfree-module-is-missing-in-opencv-3-0
- http://faithandbrave.hateblo.jp/entry/20111221/1324394299