Windows環境でのC++でOpenCVを使う

# はじめに
前回、Windows10環境下でC++を容易に利用するための[記事](https://qiita.com/D51/items/a27e28e5a81e09ce16ab)を書きました。
わけありでOpenCVの導入記事を急がなければならなくなったため、ここにOpenCVの導入記事を記します。
最終目標として、OpenCVとC++を利用して画像をグレースケール画像に変換するというプログラムを構築できるようにする、というものです。
※残念ですが、私の実力不足上、CUDAの有効化等のオプション設定の記載はありません。
# 前提知識
前記事の内容を網羅しているなら問題ないかと思いますが、Windows環境ではコンパイル、実行ファイル作成にあたっての設定がかなり複雑なため、パスや権限についての簡易的な知識は持っていてほしいです。
# 使用環境
- Windows 10 64bit
- Visual Studio 2022(Community)
- CMake
- Visual Studio Code
- OpenCV ←NEW‼

# 環境の導入
## OpenCVのインストール
OpenCVをインストールします。[公式](https://opencv.org/releases/)からとりあえず使用するバージョンをインストールします。(ライブラリの互換性等はここでは言及しません)本記事ではOpenCV-4.7.0を利用しました。Windowsなので、Windowsのボタンをポチって、exeファイルをダウンロードします。

![opencv-hpsource.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/426c7795-6734-e20d-ad48-387eaeb3274c.png)
ダウンロードされたexeファイルを展開します。
![opencv-extract.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/67e82a64-c4a6-340a-28fa-59f5929ce315.png)
ここでファイルをわかりやすいところに指定し、「extraxt」を押してファイルを展開します。ここで、指定するフォルダには日本語が含まれないように気を付けてください。（文字コードの問題上めんどくさい）
例として私はC:\cpp_librares\opencvというところに展開しました。opencvというフォルダにはbuild、opencv、sourcesというフォルダと、3つのtxtファイルが含まれている状態になります。
![opencv-directroies.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/1d3eaf7b-21f7-7da6-3038-071b255285e1.png)
## 環境変数の指定
環境変数を設定します。前回の記事は割と適当に話してしまったので、少し具体的に説明すると
1. 検索欄から「環境変数」を打って開く
2. その下にある「環境変数(N)」を選択、さらにその中のPathのところを選択し、編集を押す
3. 既に環境変数がいくつか設定されているが、新規を押してパスを指定。このパス詳細はユーザー依存
私はこのような感じで、前回設定したCMakeと、今回設定したOpenCVのパスがあります。binとlibのフォルダが今回で指定するべきパスです。
![opencv-path.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/c905a103-a73a-8400-1b1b-449722fca331.png)
一応再起動して、設定を反映させます。
# プロジェクトの作成
これでパスが通るようになったため、前回と同じ手法でプロジェクトを作成します。
ディレクトリはこのような感じ
![opencv-projectdir.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/fd0f4c7f-c98d-d6fb-cead-3aa82a8359aa.png)

original.jpgは読み込むために用意します。
```:CMakeLists.txt
#バージョン指定（最低限バージョンの保証）
cmake_minimum_required(VERSION 3.1.0)
#プロジェクト名指定
project(cv-test)
set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
include(CheckCXXCompilerFlag)


set(cpp_code ${CMAKE_CURRENT_SOURCE_DIR}/code/cv-test.cpp)
#コンパイラのバージョン確認と指定
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
endif()
#外部ライブラリの参照および、ライブラリファイルのインポート
find_package(OpenCV REQUIRED)

#外部ライブラリ、ソースファイルをリンクし、コンパイルして実行ファイルを生成
add_executable(${PROJECT_NAME} ${cpp_code})
include_directories(${PROJECT_NAME} ${ADDITIONAL_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBRARIES})
set_target_properties (${PROJECT_NAME} PROPERTIES FOLDER Examples)

install(
    TARGETS

    cv-test

    RUNTIME DESTINATION
    ${CMAKE_INSTALL_PREFIX}/bin
)
```
前回と変わったのは、外部パッケージのインポート設定です。
ここで参照することで、外部ライブラリをインクルードすることができます。
なお、環境変数を設定しておかないと、見つけてくれないので、お気をつけください。

```:cv-test.cpp
#include <opencv2/opencv.hpp>

using namespace cv;

int main(void){
  //画像の読み込み
  Mat image =imread("C:\\cpp_libraries\\opencv-test\\original.jpg");
  //グレースケール画像の作成
  Mat gray;
  cvtColor(image, gray, COLOR_BGR2GRAY);
  //ファイルの書き込み
  imwrite("C:\\cpp_libraries\\opencv-test\\output.jpg", gray);

  return 0;
  
}
```
まあここらへんの扱いはご存じかと思われますので、割愛します。cv-test.cppを見てわかる通り、original.jpgを読み込み、この画像をグレースケールに変換したのち、output.jpgとして出力します。
# 出力結果
Visual Studio Codeのターミナルで前回のようにexeファイルを作成して、実行します。
```
$ cd .\build\
$ cmake ..
$ cmake --build .
$ cd .\Debug\
$ .\cv-test.exe
```
これでフォルダ内にoutput.jpgが出力されます。こんな感じに
![opencv-dir-after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/61989d72-5c30-7080-6f18-499999c44dd3.png)
ではoriginal.jpgとoutput.jpgを比較してみましょうか。
![original.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/eb54aea2-fe81-cced-4ab2-617fb0ee279f.jpeg)
![output.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2326879/fab13df1-36f5-edd6-0a57-4c996429d665.jpeg)
はい、遺影になりましたね。