opencv_contrib 4.1.0をCMakeを使って導入する方法(Visual Studio 2019)

#概要
OpenCV+contlibをCMakeを使用してインストールする方法をまとめました。
[OpenCV4.1.0をCMakeを使って導入する方法(Visual Studio 2019)](https://qiita.com/sanishi_pompom/items/02b158dfad3a5dafd0a1)のappendix的な感じです。

#実行環境
- Windows10
- [Visual Studio 2019](https://visualstudio.microsoft.com/ja/vs/)
- [CMake 3.15.0](https://cmake.org/download/)
- [OpenCV 4.1.0](https://github.com/opencv/opencv)
- [opencv_contrib 4.1.0]()
 
#インストール＆ビルド
###Visual Studio
[こちらを参照ください。](https://qiita.com/sanishi_pompom/items/02b158dfad3a5dafd0a1#visual-studio)
###CMake
[こちらを参照ください。](https://qiita.com/sanishi_pompom/items/02b158dfad3a5dafd0a1#cmake)
###opencv_contrib
下記URLからバージョンを確認して.zipをダウンロードし、任意の場所に展開します。
(Cドライブの直下にProgramingLibraryというDIRを作成しその中に入れました。)

###OpenCV
1. 下記URLからバージョンを確認して.zipをダウンロードし、任意の場所に展開します。
(Cドライブの直下にProgramingLibraryというDIRを作成しその中に入れました。)
2. CMake(GUI)を起動し、OpenCVのDIR PATHを設定します。
(私の場合はライブラリの直下にbuildというフォルダを出力するという自分ルールがあるため**C:\ProgramingLibrary\opencv-4.1.0\build**というPATHになっています。)  
![cmake-.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439748/b5f03c98-7b70-4339-021c-b5ead5ea81c4.png)
3. Configを実行します。  
今回はVisual Studio 2019でのビルドなのでVisual Studio 16 2019を選択し、x64と設定します。  
![cmake.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439748/1bb46ccb-54c4-577a-d9c9-03017d65f8b8.png)
4. OPENCV_EXTRA_MODULES_PATHにダウンロードして展開したopencv_contribのPATHを設定する。  
**注意1：moduleのPATHを指定する。**  
**注意2：SIFTを使いたい場合はOPENCV_ENABLE_NONFREEにチェックをつける。**
![cont.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439748/97a894e3-cfd8-f2a6-0503-e9aaca34fdcd.png)
5. 再度Configreを実行し、Generateを実行する。
6. 設定したパスに出力された.slnをVisual Studioで開きます。  
出力したい実行環境になっていることを確認します。(今回はx64 Release)  
![build.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439748/3e1467c8-aaeb-eca3-ca12-67dca8f3fecf.png)
7. ALL_BUILDを右クリックしてビルド  
![bs.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439748/16748c4a-83fb-9e76-bda1-c0d01bc8dd3e.png)
8. INSTALLを右クリックしてビルド  
![ins.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439748/5202b2c7-5773-a456-a41f-76b6656fdb7d.png)
9. build以下にinstall DIRができていて、中身も生成されていることを確認  
![ins_dir.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439748/f04eb17d-70a0-0e5e-bb5a-937770a8eb2a.png)

###パスを通す
[こちらを参照ください。]()
#サンプルプログラム
SIFTで特徴点を検出しプロットして表示するサンプルです。
任意の場所にDIRを作成し、DIRの中に下記プログラムと任意の画像(.png)を入れる。

```CMake:CMakeLists.txt
cmake_minimum_required(VERSION 2.8)

set(PROJECT_NAME Test)
project(${PROJECT_NAME})

find_package(OpenCV 4.1.0 EXACT REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR}/include)
link_directories(${OpenCV_LIBRARY_DIRS})

file(GLOB SOURCE_CPP *.cpp)
file(GLOB SOURCE_H *.h)

add_executable(${PROJECT_NAME} ${SOURCE_CPP} ${SOURCE_H})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBRARIES})
```

```C++:main.cpp
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <iostream>

void main() {

    std::string pattern = "..\\*.png";
    std::vector<cv::String> files;
    cv::glob(pattern, files);

    if (files.size() == 0) {
        std::cout << "erorr" << std::endl;
        exit(-1);
    }

    cv::Mat image = cv::imread(files[0]);

    std::vector<cv::KeyPoint> keypoints;
    auto sift = cv::xfeatures2d::SIFT::create();
    sift->detect(image, keypoints);

    cv::drawKeypoints(image, keypoints, image);

    cv::imshow("show", image);
    cv::waitKey(0);
}
```
1. 上記同様にCMakeでmake
2. Generateされた.slnをVSで開く。
3. 実行環境が合っていることを確認して実行  
(プロジェクト名が非アクティブの場合はプロジェクト名を右クリックして**スタートアッププロジェクトに設定**でアクティブにする。)
4. 画像が読み込まれて特徴点が検出＆描画されて表示されるプログラムの完成
![キャプチャ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439748/11c945f0-c4f0-7857-b1a0-43e71d05965b.jpeg)

#まとめ
OpenCV contribも導入することで画像処理の幅が広がります。
個人的にSIFTを使用するために入れることが多いです。
SIFTを使う場合はビルド時にOPENCV_ENABLE_NONFREEにチェックするのをお忘れなく！
つけ忘れて使用すると「ハンドルされていない例外が発生しました」って落ちちゃいます。