Vcpkgを使用してOpenCVを導入する

この投稿は[OpenCV Advent Calendar 2017](https://qiita.com/advent-calendar/2017/opencv)の5日目の記事です。

# はじめに
Visual C++でOpenCVの開発環境を構築する段階で躓いている人をまれによく観測します。（日本語おかしい
この記事では、確実（？）で簡単に導入できる方法を紹介します。


# Vcpkgとは？
[Vcpkg](https://github.com/Microsoft/vcpkg)はVisual C++向けのライブラリを管理するパッケージ管理システムです。
CMakeベースのパッケージ管理システムになっており、GitHubでオープンソースで開発されています。
このVcpkgを利用することで、様々なライブラリを簡単に導入することができます。
インストールやプロジェクトの設定などライブラリごとに異なるこれらの作業をすべてVcpkgのコマンドで行うことができます。

VcpkgはVisual C++ 2017とVisual C++ 2015（、Visual Studio 2013）に対応しています。
BoostやOpenCV、[PCL](http://unanancyowen.com/pcl-vcpkg/)をはじめ、すでに400以上のライブラリをサポートしています。
サポートしているライブラリはportsディレクトリやvcpkg searchコマンドで参照できます。

以下の動画を視聴するとなんとなく雰囲気がつかめると思います。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="und" dir="ltr">Vcpkg demo <a href="https://t.co/Kr2iXSenjw">https://t.co/Kr2iXSenjw</a></p>&mdash; ゆるふわUnaさん (@UnaNancyOwen) <a href="https://twitter.com/UnaNancyOwen/status/936263717326426112?ref_src=twsrc%5Etfw">2017年11月30日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Vcpkg a tool to build open source C++ libraries <a href="https://t.co/pk3X0nH95V">https://t.co/pk3X0nH95V</a></p>&mdash; ゆるふわUnaさん (@UnaNancyOwen) <a href="https://twitter.com/UnaNancyOwen/status/936991525224845314?ref_src=twsrc%5Etfw">2017年12月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# Vcpkgを使用してOpenCVを導入する
## Vcpkgを導入する
まずはVcpkgを導入しましょう。
バッチファイルを実行するだけなので簡単に導入できますね。

1. **Vcpkgをダウンロード、任意の場所に展開する**（e.g. <code>C:\vcpkg</code>)  
   GitHubの[Microsoft/Vcpkg](https://github.com/Microsoft/vcpkg)からダウンロードすることができます。  
</br>   
2. **Vcpkgをビルドする**
   <code>vcpkg\bootstrap-vcpkg.bat</code>を起動すると自動的にビルドされます。
   ビルドが正常に完了すると<code>vcpkg\vcpkg.exe</code>が生成されます。

    ```ps1
    .\bootstrap-vcpkg.bat
    ```
   必須ではありませんが、環境変数Pathを設定しておくと便利でしょう。<sup>*1</sup>

    <table>
        <tr>
            <th>Variable</th>
            <th>Value</th>
        </tr>
        <tr>
            <td>Path</td>
            <td>;C:\vcpkg</td>
        </tr>
    </table>
<br/>
3. **Vcpkgが正常にインストールされているかどうか確認する**
   PowerShellを開いて<code>.\vcpkg</code>コマンドを実行してみましょう。
   コマンドの例が表示されたら正常にインストールできています。

    ```ps1
    .\vcpkg
    ```

    ![2017-11-30_23h04_00.png](https://qiita-image-store.s3.amazonaws.com/0/34834/cec11c89-f2b0-a239-df84-7dae8eecb063.png)

## OpenCVをインストールする
さっそく、OpenCVをインストールしましょう。
Vcpkgのコマンドを1つ実行、しばらく待つだけで簡単にインストールできます。

1. **Vcpkgを使用してOpenCVをインストールする**
   PowerShellを開いて<code>.\vcpkg install opencv</code>コマンドを実行してみましょう。 
   これだけで、OpenCVが依存ライブラリと共にビルド・インストールされます。簡単ですね。  

    ```ps1
    .\vcpkg install opencv
    ```

    ![2017-11-30_23h29_29.png](https://qiita-image-store.s3.amazonaws.com/0/34834/a732d808-3b24-a6e9-2837-8d57218a2b3d.png)
    ![2017-11-30_23h29_46.png](https://qiita-image-store.s3.amazonaws.com/0/34834/5a2aa864-5d5f-323b-c65d-137b477982df.png)

## プロジェクトを作成する
この段階で躓く人が多いのではないでしょうか？
「プロパティのこの項目を開いて…」なんて複雑な設定をする必要はありません。
ここでは2つの方法を紹介します。たったこれだけで、あとはプログラムを書くだけです。簡単ですね。

* **Vcpkgのコマンドを利用する方法**
   一度だけ<code>.\vcpkg integrate install</code>コマンドを実行します。
   すべてのVisual C++のプロジェクトで、特別な設定をすることなくVcpkgでインストールされたライブラリを利用することができるようになります。
   新規に作成したプロジェクトはもちろん、既存のプロジェクトに設定するときにも便利です。

    ```ps1
    .\vcpkg integrate install
    ```

    ![2017-12-01_00h14_44.png](https://qiita-image-store.s3.amazonaws.com/0/34834/43e1dee2-d220-a353-f75a-15ead7d0acfc.png)
<br/>
* **CMakeでプロジェクトを生成する方法**
   [OpenCV Advent Calendar 2017 1日目](https://qiita.com/tomoaki_teshima/items/cbdee2866b6f344a90d0)の記事を読んだ方はすでにCMakeを使っていますね？使っていますね？
   CMakeはCMakeListsをもとに設定済みのプロジェクトを生成します。
   これまで利用していたCMakeListsに<code>CMAKE_TOOLCHAIN_FILE</code>の設定を加えるだけで<code>find_package()</code>はVcpkgでインストールされたライブラリを探索します。

    ```cmake
    set( CMAKE_TOOLCHAIN_FILE "C:/vcpkg/scripts/buildsystems/vcpkg.cmake" )
    ```
   コマンドラインでCMakeを使用している場合は、同じオプションを渡しても大丈夫です。  

    ```ps1
    cmake -DCMAKE_TOOLCHAIN_FILE="C:/vcpkg/scripts/buildsystems/vcpkg.cmake"
    ```

## プログラムを実行する
プログラムをビルドすると、VcpkgがPost-Build Eventに設定したコマンドにより、プログラムの実行に必要な依存ファイル（<code>opencv_core\<version\>.dll</code>など）が実行ファイルのディレクトリにコピーされます。
そのため、「環境変数Pathにパスを通して…」なんて特別な設定をする必要はありません。そのまま実行することができます。  
    ![2017-12-03_00h55_51.png](https://qiita-image-store.s3.amazonaws.com/0/34834/35b1d44a-5099-6fcb-f45a-291d58537784.png)

# まとめ
Vcpkgを使ってOpenCVを導入する方法を紹介しました。
なんとなく1つ2つコマンドを打つだけで、いい感じにインストールして設定までしてくれます。（易しい！
（少し古いですが、）基本的な[ドキュメント](https://docs.microsoft.com/ja-jp/cpp/vcpkg)は日本語でも提供されています。

Vcpkgは執筆現在も活発に開発されており、日々改善が続けられております。
なにか困ったことがあったら気軽に[issues](https://github.com/Microsoft/vcpkg/issues)に投稿してみましょう。
RobertやAlexanderがなんとかしてくれるでしょう。

明日の[OpenCV Advent Calendar 2017](https://qiita.com/advent-calendar/2017/opencv)は、いつも美味しそうなお酒とおつまみ（と論文？）の写真がTLに流れてくる[miyazakishogun](https://twitter.com/miyazakishogun)先生です。

# Vcpkgの基本的なコマンドの解説（おまけ）
## <code>vcpkg install \<package\>[features]:\<triplet\> --featurepackages</code> / <code>vcpkg remove \<package\>:\<triplet\></code>
   パッケージをインストール・アンインストールする。
   デフォルトでは<code>x86-windows</code>（x86, dynamic link library）の設定を使用する。  

   * **package** … パッケージの名前（e.g. <code>opencv</code>）
   * **features** … [省略可能]有効にする機能（e.g. <code>[ffmpeg,vtk]</code>）
   * **triplet** … [省略可能]ビルド構成の設定（e.g. x64, dynamic link library <code>x64-windows</code>）

   Vcpkgではデフォルトで以下のTripletsが用意されています。(<code>vcpkg/triplets</code>)

   * **x86-windows**
   * **x86-windows-static**
   * **x64-windows**
   * **x64-windows-static**
   
   ツールセットを明示的に指定する場合、tripletファイルに<code>VCPKG_PLATFORM_TOOLSET</code>を設定します。

```cmake
# Visual Studio 2015 (v140)
set( VCPKG_PLATFORM_TOOLSET v140 )
```

## <code>vcpkg integrate install</code> / <code>vcpkg integrate remove</code>
   すべてのプロジェクトでライブラリを利用できるように設定・解除する。

## <code>vcpkg list</code>
   インストールされているパッケージ一覧を表示する。

## <code>vcpkg search \<keyword\></code>
   対応しているパッケージ一覧を表示する。また、キーワードで検索することができる。

   * **keyword** … [省略可能]検索文字列（e.g. <code>opencv</code>）

---
<sup>*1 環境変数Pathを設定しない場合は、コマンドを実行する前にカレントディレクトリをVcpkgのルートディレクトリに移動してください。(e.g. <code>cd C:\vcpkg</code>)また、PowerShellではコマンドの前に<code>.\\</code>を付ける必要があります。(e.g. <code>.\vcpkg</code>)</sup>