久しぶりに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バイナリの取得元はこちら:
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 が含まれているので、それを取り除きます。
# 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_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_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:
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:
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)になるので、コメントアウトします。
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" } };