Visual Studio 2019でOpenCV 4.3.0を使った画像処理プログラミングの準備

# はじめに

WindowsでOpenCVを利用した画像処理プログラミングを始めようとしたところ、他のOSに比べて、その導入が比較的難解でした。
そこで、この記事ではVisual Studioを使って、WindowsでC++のOpenCVを利用したプログラミングを始めるため手順をまとめました。

# 環境の導入

今回利用する環境は以下の通りです。

- Windows 10(バージョン 1909)
- Visual Studio 2019(バージョン 16.5.5)
- OpenCV 4.3.0

## Visual Studio

コンパイラとしてVC++を利用するため、Visual Studioを導入します[^1]。
Visual Studioは下記リンクより、ダウンロード及びインストールをおこなってください。
ここでは、コミュニティ版を使用して説明しますが、他のエディションを利用しても大きく異なることはないでしょう。

Visual Studio 2019ダウンロードページ
https://visualstudio.microsoft.com/ja/downloads/

## OpenCV

OpenCVは下記リンクより、ダウンロードしてください。OpenCVは自己解凍ファイルになっているので、任意の場所に解凍してください[^2]。

OpenCV 4.3.0のダウンロードページ
https://opencv.org/releases/

# 環境変数の設定

[スタート]から、[環境変数の編集]を検索し、環境変数を設定します。

まずは、解凍したOpenCVのディレクトリの中から、下記のディレクトリを新規環境変数として、設定します。
ユーザ環境変数の[新規]から、設定してください。

- 変数名: `OPENCV_DIR`
- 変数値: `[opencvの解凍先ディレクトリ]\opencv\build\x64\vc15`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105107/5c1fc671-3159-38cb-085d-906e7513f37f.png)



ここでは、vc15というファイルを選択しています。
これはVisual Studio 2019(バージョン 16.5.5)を利用しているからです。
Visual Studioのバージョンは次のようになっており、Visual Studio 2017以降を利用している場合はvc15を選択します。

| プラットフォーム名称 | バージョン |
|:-------------------|:----------|
| Visual Studio 2019 | 16.x      |
| Visual Studio 2017 | 15.x      |
| Visual Studio 2015 | 14.x      |

次に、OpenCVのバイナリファイル群をPATH変数に追加します。
ユーザ環境変数の`Path`を選択した状態で[編集]>[新規]で変数値を追加してください。

- (追加する)変数値: `%OPEN_CV%\bin`

# プロジェクトへの設定

環境変数の設定を終えたら、これらのOpenCVのプログラム群を紐づけたプロジェクトを作成します。

まず、新規プロジェクトを作成します。Visual Studioを起動、[新しいプロジェクトの作成]を選択してください。
続けて、C++の[空のプロジェクト]を選択して、任意の名前を付けたプロジェクトを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105107/84d27eeb-e010-c026-ec71-44bf3ad31e81.png)

作成したプロジェクトの編集画面が開かれたら、上部メニューから、[デバッグ] > [[プロジェクト名の]のプロパティ]を開いてください。
このプロパティはソリューションエクスプローラーのプロジェクトを右クリックしたメニューからも開くことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105107/0f0d609e-aea2-1a6f-6bca-4847b56a32b3.png)

プロパティを以下のように編集してください。編集したら、[OK]を押して変更を反映します。

[構成プロパティ] > [VC++ ディレクトリ]

| 項目名                  | 編集内容                             |
|:-----------------------|:------------------------------------|
| インクルード ディレクトリ |「$(OPENCV_DIR)\..\..\include」を追加 |
| ライブラリ ディレクトリ   | 「$(OPENCV_DIR)\lib」を追加          |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105107/a544f613-44d4-0e62-cb30-8ea3eb952bcb.png)

[構成プロパティ] > [リンカー] > [入力]

| 項目名                  | 編集内容                             |
|:-----------------------|:------------------------------------|
| 追加の依存ファイル       | 「opencv_world430」を追加            |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105107/ac1b5ef4-c40f-ea20-7e0c-dab0fa9efcd3.png)


# テストプログラムの実行

上記の設定で、OpenCVのインクルードファイルとライブラリが利用できるようになっています。
利用可能になっているかをテストプログラムで確認しましょう。

「ソース ファイル」を右クリックしたメニュ)ーから、[追加] > [新しい項目]を選択します。
「C++ ファイル(.cpp)」を選択して、任意の名前を付けたファイルを作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105107/fd08466e-e046-97aa-7b61-36fd0c05d178.png)

作成したら、コード エディターが表示されます。そこに以下のソースを貼り付けて動かします。
このプログラムでは、事前に設定したOpenCVの環境変数を起点にOpenCVにはじめから入っているサンプル画像(baboon;ヒヒ)を表示します。
何かのキーを押すと、プログラムが終了します。

```c++
#include<cstdlib>
#include<string>
#include<stdexcept>
#include<opencv2\opencv.hpp>

std::string get_environment_variable(const char* environment_name) {
    size_t buf;
    if (getenv_s(&buf, NULL, 0, environment_name)) throw std::runtime_error("read error");
    if (buf == 0) throw std::runtime_error("not such environment variable");
    std::string buffer;
    buffer.resize(buf + 1);
    getenv_s(&buf, &buffer[0], buf, environment_name);
    buffer.resize(std::strlen(buffer.c_str()));
    return buffer;
}

int main(void) {
    std::string dir = get_environment_variable("OPENCV_DIR");
    cv::Mat img = cv::imread(dir + "\\..\\..\\..\\sources\\samples\\data\\baboon.jpg");
    if (img.empty()) return -1;
    cv::imshow("View", img);
    cv::waitKey();

    return 0;
}
```

ソリューション構成、ソリューション プラットフォームをそれぞれ「Relese」、「x64」に設定し、設定箇所の右側にある実行ボタンで実行します。エラーなく、画像が表示されればテストOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105107/f6746d79-d33b-200b-c243-9c00fc56f6b6.png)

もし、うまく動かなかった場合にそれが実行前のビルドエラーであれば、プロパティの設定やソースに問題がある可能性があります。
また、実行後にdllが読み込めないなどのエラーが出た場合はPATHの設定がされていないことが考えられます。
見直してみてください。

# プロジェクト テンプレートの作成

Visual Studioでは、基本的に1つのプロジェクトで1つの実行プログラムしか作れません。
そのため、新たにOpenCVのプログラムを作ろうとすると再び今回の設定が必要になってしまいます。

何度も設定をおこなわなくていいように、今作成したプロジェクトからテンプレートを作成しておきましょう。
こうすることで、次回からはOpenCVの設定がされたところから、プログラムを書くことができます。

上部メニューから、[プロジェクト] > [テンプレート エクスポート]を選択してください。
テンプレートのエクスポート ウィザードが表示されたら、[次へ]を押します。ここでは、テンプレートに対する説明などのオプションが設定できます。
自分の分かりやすいように設定をおこない、完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105107/5b905287-a225-b9c5-e1e4-ea6663db52ea.png)


これで、新規プロジェクトを作成したときに「空のプロジェクト」でなく、今回作成したテンプレートを選択することで、OpenCVのための設定がおこなわれたプロジェクトを立ち上げることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105107/72ab3b3f-1315-fd7e-3289-93386de6a962.png)

# おわりに

色々と調べてみて、WindowsでOpenCVを使った画像処理をするだけなら、Pythonでやった方がラクでしょう(コマンドラインでpipを叩くだけだと思います)。
初学者がC++でやりたい、もしくはC++である必要がある人はこの方法で導入するのがいいのかなと思います。
長くなりましたが、読んでいただきありがとうございました。

# 参考サイト

今回の記事を書くにあたり、参考したサイトです。

How to build applications with OpenCV inside the "Microsoft Visual Studio"
https://docs.opencv.org/master/dd/d6e/tutorial_windows_visual_studio_opencv.html

OpenCV 4.3.0をVisual Studio 2019から使用する時の手順
https://qiita.com/h-adachi/items/aad3401b8900438b2acd

環境変数の取得(C++)
https://qiita.com/AinoMegumi/items/edc89463d04abfb486bc

[^1]: Windowsでは、MinGWやCMakeを利用することでもOpenCVを導入したり、使うことができます。しかし、OpenCVはWindowsに対して、Visual Studio(2015, 2017)向けの実行可能プログラムしか提供していません。そのためこの記事では、Visual Studio以外を利用した方法は一般的でなく、難しいと判断して、紹介していません。
[^2]: 以前はNuGetを経由して、OpenCVをVisual Studioに導入できたようですが、最新のバージョンには対応していません。以前のバージョンでの利用は可能ですが、プラットフォームのツールセットを変更する手間が必要なため、ここでは使用していません。