かみのメモ

コンピュータビジョン・プログラムな話題中心の勉強メモ

WindowsでOpenCVとopencv_contribをビルド&インストールする

自分の環境構築ついでに、研究室の後輩に向けて書いた記事です。

この記事ではC++から使うためにOpenCVopencv_contribをソースコードからビルドしてインストールする方法を紹介します。 OSはWindowsを対象としています。

もくじ

0. 筆者の環境

一応、筆者の環境を書いておきます。 Visual StudioOpenCVのバージョンが違ってもおそらくこの方法でインストールできると思います。

Windows 10 Home
Visual Studio Community 2017
Visual C++ SDK : VC15
OpenCV 3.4.1
OpenCV contrib 3.4.1
CMake 3.11.0
Git for Windows 2.17.0

1. 前置き

1.1. 比較的簡単なインストール方法

OpenCVにはいくつかのインストール方法があります。 比較的、簡単な方法として挙げられるのは、

  1. ビルド済みのライブラリファイルをダウンロードしてくる方法(ここから:Source Forge
  2. Visual StudioのパッケージマネージャであるNugetを使ってダウンロードしてくる方法

の2つでしょう。

1の方法はこちらのサイトなどが参考になると思います。 ただし、この方法ではopencv_contrib(開発中だったり特許が絡んだりといった諸々の都合でOpenCV本体から分離しておきたい機能を内包したパッケージ)が含まれてないため、一部の機能を使うことができません。 DNN、顔認識、空間コード法などcontribに含まれる機能を使わないのであれば、この方法でインストールしてしまって構わないと思います。

2の方法については、いくつか記事があるようなので「opencv nuget」などで検索してみてください。 OpenCV3, opencvcontribというパッケージをインストールすればcontribも含めた一通りの機能が使えるようになります。

ただし、OpenCVのNugetパッケージはあまり頻繁にはメンテナンスされていません。 そのため、最新のVisual StudioやVisual C++ SDKを使っている場合、プロジェクトの設定を自分で調整したり、追加のSDKをダウンロードしたりといった作業が必要になることがあります。 また、最新のOpenCVにしか入っていないような機能を使いたい場合、このインストール方法は使えません。

1.2. ビルドによるインストール

もうひとつのインストール方法はOpenCVopencv_contribをソースコードからビルドするというものです。 この記事ではこちらの方法を紹介します。 なお、より詳細な情報は公式ドキュメント にまとめられているので、必要に応じて参照してください。

2. インストール手順

2.1. CMakeをインストールする

CMakeは使っている環境(OSとかコンパイラとか)に合わせたプロジェクトファイルを作成するためのツールです。 クロスプラットフォームなプロジェクトを管理できることからC++OSS開発ではよく利用されています。 CMakeの詳細は別の記事で紹介しているので余裕があれば読んでみてください(勝手に作るCMake入門 その1 基本的な使い方 - かみのメモ)。

OpenCVもCMakeプロジェクトとして開発されているのでこれを利用してビルドします。

まずこちらのページにアクセスしてCMakeのインストーラーをダウンロードしましょう。 64ビットOSを使ってるときは~~_x64.msi、32ビットOSを使ってるときは~~_x86.msiという名前のものを選択してください。

f:id:kamino-dev:20180416173616p:plain

次にインストーラーを起動し、CMakeをインストールします。 このとき、下の図のようにCMakeのPATHを通しておきましょう。

f:id:kamino-dev:20180416174824p:plain

2.2. Git for Windowsをインストールする

Gitはソースコードの変更履歴を管理したり、他のマシンと共有したりするためのツールです。

こちらのページにアクセスして、インストールしましょう。

f:id:kamino-dev:20180416174706p:plain

インストール時の選択肢はすべてデフォルトのままでいいと思います。

2.3. ディレクトリの準備

次にOpenCVをインストールするディレクトリ(フォルダ)を準備します。

f:id:kamino-dev:20180416174936p:plain

特にこだわりがなければCドライブ直下にopencvというディレクトリを作ればいいと思います。 以降C:\opencvを用意した前提で説明を進めます。

ディレクトリを作成したらその中に入り「右クリック->Git Bash Here」でGit Bashを起動します。 黒い画面が出てきたらOKです。

f:id:kamino-dev:20180416175242p:plain:w400

2.4. ダウンロード・ビルド用のスクリプトを用意する

今回の記事では、作業を簡単にするためshellスクリプトを利用します。

まずGit Bashの画面でtouch install.shのコマンドを実行し、install.shというファイルを作成します。

次に、作成したファイルを適当なテキストエディタで開きます。 メモ帳を使う場合は、エクスプローラーから「右クリック->プログラムから開く->その他のプログラム->メモ帳」で開けます。

開いたファイルに以下のスクリプトを貼り付けます。

#!/bin/bash -e
myRepo=$(pwd)
CMAKE_CONFIG_GENERATOR="Visual Studio 15 2017 Win64"
if [  ! -d "$myRepo/opencv"  ]; then
    echo "clonning opencv"
    git clone https://github.com/opencv/opencv.git
    mkdir -p Build
    mkdir -p Build/opencv
    mkdir -p Install
    mkdir -p Install/opencv
fi
pushd opencv
git checkout master
git pull --rebase
git checkout refs/tags/4.0.1
popd

if [  ! -d "$myRepo/opencv_contrib"  ]; then
    echo "clonning opencv_contrib"
    git clone https://github.com/opencv/opencv_contrib.git
    mkdir -p Build
    mkdir -p Build/opencv_contrib
fi
pushd opencv_contrib
git checkout master
git pull --rebase
git checkout refs/tags/4.0.1
popd

RepoSource=opencv
pushd Build/$RepoSource
CMAKE_OPTIONS='-DBUILD_PERF_TESTS:BOOL=OFF -DBUILD_TESTS:BOOL=OFF -DBUILD_DOCS:BOOL=OFF  -DWITH_CUDA:BOOL=OFF -DBUILD_EXAMPLES:BOOL=OFF -DINSTALL_CREATE_DISTRIB=ON'
cmake -G"$CMAKE_CONFIG_GENERATOR" $CMAKE_OPTIONS -DOPENCV_EXTRA_MODULES_PATH="$myRepo"/opencv_contrib/modules -DCMAKE_INSTALL_PREFIX="$myRepo"/install/"$RepoSource" "$myRepo/$RepoSource"
echo "************************* $Source_DIR -->debug"
cmake --build .  --config debug
echo "************************* $Source_DIR -->release"
cmake --build .  --config release
cmake --build .  --target install --config release
cmake --build .  --target install --config debug
popd

※ 初回実行時に指定バージョンにcheckoutしないバグを修正しました(2019/01/22)

2行あるgit checkout refs/tags/4.0.1の行は自分がインストールしたいバージョンに合わせて書き換えてください。 タグの一覧はこちらから確認できます。 この行を消すと最新の開発中のバージョンがビルドされます。

CMAKE_CONFIG_GENERATOR="Visual Studio 15 2017 Win64"の部分は自分のPCのOSとインストールされているVisual Studioのバージョンに合わせて変更してください。 cmake --helpとコマンドを打てば、利用できるGeneratorの一覧を確認することができます。

CMAKE_OPTIONS=...の部分はビルド時の設定を行っています。 ここでは最もシンプルな設定にしています(詳細な設定が必要な場合はshellスクリプトではなくCMake GUIを使う方法が楽かもしれません、公式ドキュメントや他の記事を当たってみてください)。

貼り付けたらファイルを保存します。

2.5. スクリプトを実行する

Git Bash./install.shとコマンドを実行すると、ソースコードのダウンロード・ビルドが開始されます。

ビルドは10分以上かかるので気長に待ちましょう。

ビルドが終わったとき、install/opencv/x64/vc15binとかlibみたいなフォルダができ、中にopencv_world401.dllとかopencv_world401.libとかが作られていればOKです(環境によって若干フォルダ名・ファイル名が変わります)。 また、opencv_world401d.dllのようにdが付記されているファイルはDebug情報込みでビルドされたファイルです。

最後にC:\opencv\Install\opencv\x64\vc15\binをPATHに追加しておきましょう。

3. テストプログラム

Visual Studioで「Visual C++->Windowsコンソールアプリケーション」のプロジェクトを作成します。

「プロジェクト->プロパティ」を開いて以下の作業をします。

  • 構成・プラットフォームにRelease・x64(Win32でビルドした場合はx86)を選択
  • 「構成プロパティ->C/C++->全般->追加のインクルードディレクトリ」にC:\opencv\Install\opencv\includeと記入
  • 「構成プロパティ->リンカー->すべてのオプション->追加の依存ファイル」にC:\opencv\Install\opencv\x64\vc15\lib\opencv_world401.libと記入(Debug情報込みでビルドする場合はopencv_world401d.lib

次に以下のようなプログラムを書きます。 opencv_contribに含まれるグレイコードのライブラリを使って計測パターン画像を作成・表示するプログラムです。

#include "stdafx.h"

#include <vector>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/structured_light.hpp>

int main() {
    cv::structured_light::GrayCodePattern::Params params;
    params.width = 32;
    params.height = 32;

    std::vector<cv::Mat> patternImgs;
    auto graycode = cv::structured_light::GrayCodePattern::create(params);
    graycode->generate(patternImgs);

    cv::namedWindow("Pattern", cv::WINDOW_NORMAL);
    cv::resizeWindow("Pattern", 512, 512);

    for (auto img : patternImgs) {
        cv::imshow("Pattern", img);
        cv::waitKey(500);
    }

    return 0;
}

プログラムが書けたら、画面上中央のソリューション構成をx64(Win32でビルドした場合はx86)に設定してビルド・実行します。

こんなかんじのパターンが表示されたら成功です。

f:id:kamino-dev:20180416175647p:plain:w300

4. おわりに

OpenCV関連ではこんな記事↓も書いてるので読んでもらえると筆者が喜びます。

kamino.hatenablog.com

kamino.hatenablog.com

公式ドキュメントではDebug/Release両方をビルドするスクリプトが書いてあるが、インストール先が同じなので上書きされてしまっている模様(ドキュメントが追従できていない?)。 とりあえずOpenCVのDebug Infoはいらないだろうって割り切って、Releaseだけをビルドするかんじで紹介記事を書きました。

勘違いでした。 Debugビルドの成果物はopencv_world401d.dllのようにdを付記したファイル名で作成されているようです(2018/10/27 修正)。